code:
App.Events.RESSInjectionsPlease = class RESSInjectionsPlease extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.expansionRequestsAllowed > 0,
			() => !FutureSocieties.isActive('FSSlimnessEnthusiast'),
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canTalk,
				s => s.drugs === "no drugs",
				s => s.rules.speech === "permissive",
				s => s.health.condition > 20,
				s => s.devotion >= -20,
				s => s.trust > 20,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const drug = getDrug();

		App.Events.drawEventArt(node, eventSlave);

		App.Events.addParagraph(node, [
			`Coming to see you in a clearly good mood is`,
			App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "."),
			`Since ${he}'s allowed to ask questions, ${he} comes right out with it.`,
			Spoken(eventSlave, `"${Master}, I'm feeling healthy, and I've been a good ${girl} this week. With everyone getting so many powerful drugs —"`),
			`${he} takes a breath before asking in a rush`,
			Spoken(eventSlave, `"– may I have a dose of ${drug.text}"`)
		]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} the necessary injections`, necessary),
			eventSlave.pregKnown === 1
				? new App.Events.Result(`Not when you're pregnant`, pregnant)
				: new App.Events.Result(),
			new App.Events.Result("Decline", decline),
			new App.Events.Result("No, and slaves should not make requests of this kind", stop),
		]);

		function necessary() {
			eventSlave.devotion += 2;
			let r = [];
			r.push(`You load the injection gun you keep in your desk, and tap it repeatedly against the cooperative slave's`);
			const thankfulSentence = `${He} leaves <span class="devotion inc">thanking</span> you profusely, ${hasAnyArms(eventSlave) ? `massaging ${himself} in` : "quivering with"} anticipation`;
			switch (drug.type) {
				case "boobs":
					r.push(`tits, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} boobs have grown, delighting ${him}.`);
					if (eventSlave.markings === "freckles" || eventSlave.markings === "heavily freckled") {
						r.push(`${He} proudly shows your other slaves ${his} breast growth by keeping track of the increasing distance between a couple of chosen freckles on the front of ${his} boobs.`);
					}
					r.push(`The dose of growth hormones necessary to cause such rapid tissue changes left ${him} feeling <span class="health dec">rather ill,</span> but ${he} is recovering normally.`);
					if (eventSlave.geneMods.NCS === 0) {
						eventSlave.boobs += 200;
					} else {
						eventSlave.boobs += 100;
					}
					break;
				case "butt":
					r.push(`rear end, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} buttocks have grown, delighting ${him}.`);
					eventSlave.butt++;
					r.push(`The dose of growth hormones necessary to cause such rapid tissue changes left ${him} feeling <span class="health dec">rather ill,</span> but ${he} is recovering normally.`);
					break;
				case "lips":
					r.push(`lips, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} lips have swelled, delighting ${him}.`);
					r.push(`The dose of growth hormones necessary to cause such rapid tissue changes left ${him} feeling <span class="health dec">rather ill,</span> but ${he} is recovering normally.`);
					eventSlave.lips += 10;
					break;
				case "dick":
					r.push(`cock, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} cock has grown, delighting ${him}.`);
					eventSlave.dick++;
					if (eventSlave.balls < 5 && random(1, 100) > 70) {
						r.push(`As a side effect, ${his} <span class="change positive">balls have also swelled,</span> which ${he} sees as an added benefit.`);
						eventSlave.balls++;
					}
					r.push(`The dose of growth hormones and male hormone treatment necessary to cause such rapid change left ${him} feeling <span class="health dec">rather ill,</span> but ${he} is recovering normally.`);
					break;
				case "dickMinus":
					r.push(`girly dick, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} dick has shrunk, delighting ${him}.`);
					eventSlave.dick--;
					if ((eventSlave.geneMods.NCS === 1) && (eventSlave.dick > 1) && (random(1, 100) > 50)) {
						eventSlave.dick--;
					}
					if (eventSlave.balls > 1 && random(1, 100) > 70) {
						r.push(`As a side effect, ${his} <span class="orange">balls have also atrophied,</span> which ${he} sees as an added benefit.`);
						eventSlave.balls--;
						if ((eventSlave.geneMods.NCS === 1) && (eventSlave.balls > 1) && (random(1, 100) > 50)) {
							eventSlave.balls--;
						}
					}
					r.push(`The dose of growth hormones and hormone treatment necessary to cause such rapid tissue reduction left ${him} feeling <span class="health dec">rather ill,</span> but ${he} is recovering normally.`);
					break;
				case "balls":
					r.push(`sack, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} testicles have grown, delighting ${him}. The dose of growth hormones and male hormone treatment necessary to cause such rapid change left ${him} feeling rather ill, but ${he} is recovering normally.`);
					eventSlave.balls++;
					break;
				case "ballsMinus":
					r.push(`useless sack, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} testicles have shrunk, delighting ${him}. The dose of growth hormones and hormone treatment necessary to cause such rapid tissue reduction left ${him} feeling rather ill, but ${he} is recovering normally.`);
					eventSlave.balls--;
					if ((eventSlave.geneMods.NCS === 1) && (eventSlave.balls > 1) && (random(1, 100) > 50)) {
						eventSlave.balls--;
					}
					break;
				case "clit":
					r.push(`clit, producing a hiss each time as pressurized gas painlessly drives the drugs deep into ${his} tissues. ${thankfulSentence}. Before the end of the week, ${his} clit has grown, delighting ${him}. The dose of growth hormones necessary to cause such rapid tissue changes left ${him} feeling rather ill, but ${he} is recovering normally.`);
					eventSlave.clit++;
					break;
			}
			if (V.arcologies[0].FSBodyPuristLaw === 0 && V.healthyDrugsUpgrade === 0) {
				surgeryDamage(eventSlave, 10);
			} else {
				surgeryDamage(eventSlave, 5);
			}
			App.Events.refreshEventArt(eventSlave);
			return r;
		}

		function pregnant() {
			const child = eventSlave.pregType > 1 ? "children" : "child";
			eventSlave.trust++;
			return `You tell ${him} that you would prefer not to inject your pregnant slaves with large doses of growth hormones, and ${he} must respect your judgment in this regard. ${He} leaves looking disappointed, but vows to return once ${he} has given birth. ${He} isn't satisfied with ${his} body, but trusts that ${his} ${getWrittenTitle(eventSlave)} cares for ${him} and ${his} unborn ${child}'s health.`;
		}

		function decline() {
			eventSlave.devotion++;
			eventSlave.trust++;
			return `You tell ${him} that ${he}'s better as ${he} is, and ${he} must respect your judgment in this regard. ${He} leaves looking more flattered than disappointed. ${He}'s less insecure in ${his} own body, and trusts that ${his} ${getWrittenTitle(eventSlave)} has a plan for ${him}.`;
		}

		function stop() {
			V.expansionRequestsAllowed = 0;
			return `You tell ${him} firmly that you don't intend to apply growth hormones to ${him} at the moment, your tone communicating that further requests on this subject are not permitted. ${He} understands clearly and looks a little crushed, but trusts that ${he} won't be punished for violating a rule you hadn't promulgated. You repair the oversight immediately, directing your personal assistant to spread notice that decisions about asset size are yours alone.`;
		}

		/** @returns {{type:"boobs" | "butt" | "lips" | "dick" | "dick" | "dickMinus" | "balls" | "ballsMinus" | "clit", text: string}} */
		function getDrug() {
			let possibleDrugs = [];
			if (eventSlave.fetishKnown === 1 && eventSlave.fetishStrength > 60) {
				if (eventSlave.fetish === "dom") {
					if (eventSlave.dick.isBetween(0, 5) && canPenetrate(eventSlave)) {
						if (canSee(eventSlave)) { /* not taking chances on the condition in there */
							possibleDrugs.push({type: "dick", text: `penis enhancement? I know I'm a sex slave and it's my place to get fucked, but when I do get to do a girl, ${Master}, I want to see a little fear in her eyes.`});
						} else {
							possibleDrugs.push({type: "dick", text: `penis enhancement? I know I'm a sex slave and it's my place to get fucked, but when I do get to do a girl, ${Master}, I want to feel her ass clench in fear.`});
						}
					}
					if (canPenetrate(eventSlave) && eventSlave.scrotum > 0 && eventSlave.balls < 10) {
						possibleDrugs.push({type: "balls", text: `testicle enhancement? I know I'm a sex slave and it's my place to get fucked, but when I do get to do a girl, ${Master}, I want to ${canHear(eventSlave) ? `hear her grunt` : `feel her shake`} every single time the weight of my balls slaps against her body.`});
					}
					if (eventSlave.dick === 0 && eventSlave.clit < 5) {
						possibleDrugs.push({type: "clit", text: `clit enhancement? I know I'm a sex slave and it's my place to get fucked, but I want to teach those cocky sluts a lesson they'll never forget.`});
					}
				} else if (eventSlave.fetish === "sadist") {
					if (eventSlave.dick.isBetween(0, 5) && canPenetrate(eventSlave)) {
						possibleDrugs.push({type: "dick", text: `penis enhancement? I know I'm a sex slave and it's my place to get fucked, but when I do get to do a girl, ${Master}, I want her to hurt.`});
					}
				} else if (eventSlave.fetish === "masochist") {
					if (eventSlave.dick > 1 && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
						possibleDrugs.push({type: "dickMinus", text: `hormones to shrink my dick? I'm a sex slave and it's my place to get fucked, and when I get used like a little slut it hurts so good, ${Master}.`});
					}
					if (eventSlave.balls.isBetween(0, 10) && eventSlave.scrotum > 0) {
						possibleDrugs.push({type: "balls", text: `hormones to swell up my balls? I know I won't be using them, but to have such a tempting target for abuse, ${Master}...`});
					}
					if (eventSlave.butt < 9) {
						possibleDrugs.push({type: "butt", text: `ass growth drugs? It would just beg for a good spanking!`});
					}
				} else if (eventSlave.fetish === Fetish.SUBMISSIVE) {
					if (eventSlave.dick > 1 && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
						possibleDrugs.push({type: "dickMinus", text: `hormones to shrink my dick? I don't need a big dick to get fucked, ${Master}. I don't want to intimidate anyone who might use me.`});
					}
					if (eventSlave.balls > 1 && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
						possibleDrugs.push({type: "ballsMinus", text: `hormones to shrink my balls? I don't need to cum buckets while getting fucked, ${Master}. I don't want to outdo anyone who might use me.`});
					}
					if (eventSlave.butt < 9) {
						possibleDrugs.push({type: "butt", text: `ass growth drugs? I want whoever's fucking me to have plenty of cushion to push into.`});
					}
					if (eventSlave.lips <= 70) {
						possibleDrugs.push({type: "lips", text: `lip enhancement? I want lips so big everyone will think of just shoving a dick in them.`});
					}
					if (eventSlave.boobs < 3000) {
						possibleDrugs.push({type: "boobs", text: `boob growth drugs? I want to be nothing more than a young man's wet dream. Just a pair of tits, a big ass and some holes to fuck.`});
					}
				} else if (eventSlave.fetish === "cumslut") {
					if (eventSlave.lips <= 70) {
						possibleDrugs.push({type: "lips", text: `lip enhancement? I want everyone to imagine my lips around their cock, ${Master}.`});
					}
					if (eventSlave.balls.isBetween(0, 10) && eventSlave.scrotum > 0) {
						possibleDrugs.push({type: "balls", text: `hormones to add some weight to my balls? I just need to make more cum, ${Master}. I promise I'll clean up after myself too!`});
					}
				} else if (eventSlave.fetish === "buttslut") {
					if (eventSlave.butt < 9) {
						const entry = {type: "butt", text: `ass growth drugs? I would love it if everyone thought of fucking my big butt the moment they saw me!`};
						possibleDrugs.push(...[entry, entry, entry]);
					}
				} else if (eventSlave.fetish === "boobs") {
					if (eventSlave.boobs < 15000) {
						const entry = {type: "boobs", text: `boob growth drugs? I would love it if everyone thought of touching and sucking and fucking my big bimbo boobies the moment they saw me!`};
						possibleDrugs.push(...[entry, entry, entry]);
					}
				} else if (eventSlave.fetish === "pregnancy") {
					if (canPenetrate(eventSlave) && eventSlave.scrotum > 0 && eventSlave.balls < 10) {
						possibleDrugs.push({type: "balls", text: `hormones to add some heft to my balls? When I get the chance to cum in a girl, I want to get her pregnant, really pregnant!`});
					}
					if (eventSlave.boobs < 3000) {
						const entry = {type: "boobs", text: `boob growth drugs? I want to look, you know, fertile, ${Master}.`};
						possibleDrugs.push(...[entry, entry]);
					}
					if (eventSlave.butt < 6) {
						const entry = {type: "butt", text: `ass growth drugs? I want to look, you know, fertile, ${Master}, even if it's not in my hips.`};
						possibleDrugs.push(...[entry, entry, entry]);
					}
				} else if (eventSlave.fetish === "humiliation") {
					if (eventSlave.dick > 1 && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
						possibleDrugs.push({type: "dickMinus", text: `hormones to shrink my dick? It would be so humiliating to have a little bitch dick, ${Master}, everyone would know I'm a worthless little slut.`});
					}
					if (eventSlave.lips <= 70) {
						possibleDrugs.push({type: "lips", text: `lip enhancement? I want lips so big everyone knows I'm a slut the moment they see me. They'll all stare at me.`});
					}
					if (eventSlave.boobs < 10000) {
						possibleDrugs.push({type: "boobs", text: `boob growth drugs? I want big bimbo breasts so big I just spill out of my top.`});
					}
					if (eventSlave.butt < 9) {
						possibleDrugs.push({type: "butt", text: `ass growth drugs? I want to risk ripping my clothes any time I bend over.`});
					}
				}
			}

			if (eventSlave.energy > 95 && eventSlave.dick > 0 && eventSlave.dick < 5 && eventSlave.balls > 0 && !["humiliation", "masochist", "submissive"].includes(eventSlave.fetish)) {
				possibleDrugs.push({type: "dick", text: `penis enhancement? I just want to fuck all the time, ${Master}. ${capFirstChar(girl)}s with big cocks have more fun, even getting fucked. Especially getting fucked.`});
			}

			if (eventSlave.attrKnown === 1) {
				if (eventSlave.attrXY > 65 && eventSlave.boobs < 3000) {
					const entry = {type: "boobs", text: `boob growth drugs? Nothing gets a cute boy hard like a big pair of boobies.`};
					possibleDrugs.push(...[entry, entry]);
				}
				if (eventSlave.attrXX > 65 && canPenetrate(eventSlave) && eventSlave.dick < 5) {
					const entry = {type: "dick", text: `penis enhancement? Nothing gets a cute girl wet better than a big hard shaft.`};
					possibleDrugs.push(...[entry, entry]);
				}
			}

			if (FutureSocieties.isActive('FSGenderRadicalist')) {
				if (V.arcologies[0].FSGenderRadicalistLawFuta === 2) {
					if (canPenetrate(eventSlave) && eventSlave.dick < 5) {
						const entry = {type: "dick", text: `penis enhancement? I want to be the best hung slave I can be, ${Master}. I want them to see my erection and stare.`};
						possibleDrugs.push(...[entry, entry, entry]);
					}
					if (eventSlave.scrotum > 0 && eventSlave.balls < 10) {
						const entry = {type: "balls", text: `hormones to add some size to my balls? My package is falling behind all the other slaves out there...`};
						possibleDrugs.push(...[entry, entry, entry]);
					}
				} else if (V.arcologies[0].FSGenderRadicalistLawFuta === 3) {
					if (eventSlave.butt < 9) {
						const entry = {type: "butt", text: `ass growth drugs? I feel like I'm starting to fall behind the other slaves...`};
						possibleDrugs.push(...[entry, entry, entry]);
					}
				} else {
					if (eventSlave.dick > 1 && V.arcologies[0].FSSlimnessEnthusiastResearch === 1) {
						possibleDrugs.push({type: "dickMinus", text: `of hormones to shrink my dick? A big one too. I just want to become the best little girl I can be, ${Master}, I don't want anything distracting anyone from my rear pussy.`});
					}
				}
			}

			if (eventSlave.toyHole === "dick") {
				if (eventSlave.dick < 5) {
					possibleDrugs.push({type: "dick", text: `penis enhancement? I know how much you like using it, ${Master}, and I want to make sure it is good for you too.`});
				}
			} else if (eventSlave.toyHole === "mouth") {
				if (eventSlave.lips <= 90) {
					possibleDrugs.push({type: "lips", text: `lip enhancement? I know how much you like using them, ${Master}.`});
				}
			} else if (eventSlave.toyHole === "ass") {
				if (eventSlave.butt < 9) {
					possibleDrugs.push({type: "butt", text: `ass growth drugs? I know how much you like using it, ${Master}.`});
				}
			} else if (eventSlave.toyHole === "boobs") {
				if (eventSlave.boobs < 25000) {
					possibleDrugs.push({type: "boobs", text: `boob growth drugs? I know how much you like using them, ${Master}.`});
				}
			}

			if (eventSlave.boobs < eventSlave.butt * 750) {
				possibleDrugs.push({type: "boobs", text: `boob growth drugs? I want to be as fuckable as I can for you, ${Master}, and I think my boobs need it more than my butt.`});
			} else if (eventSlave.butt < eventSlave.boobs/500 && eventSlave.butt < 9) {
				possibleDrugs.push({type: "butt", text: `ass growth drugs? I want to be as fuckable as I can for you, ${Master}, and I think my butt needs it more than my boobs.`});
			} else {
				possibleDrugs.push({type: "boobs", text: `boob growth drugs? The way they bounce when I get fucked is kind of addicting...`});
			}
			// @ts-ignore
			return possibleDrugs.random();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				canStand,
				canHear,
				s => s.assignment !== Job.QUARTER,
				s => s.voice > 0,
				s => s.lips <= 95,
				s => s.mouthAccessory === "none",
				s => s.accent === 3,
				s => s.devotion <= 50,
				s => s.trust >= -20,
				s => (s.devotion >= -20 || s.trust <= 20),
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {His, He, he, his, him, himself} = getPronouns(eventSlave);
		const {himselfP} = getPronouns(V.PC).appendSuffix("P");
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);

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

		let r = [];
		r.push(`Standing before you for an inspection is`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "."));
		r.push(`The obedient ${SlaveTitle(eventSlave)} has run through the prescribed motions of a normal inspection, and you've reached the part of the routine where you usually ask the slave a few questions, give ${him} a few orders, or fuck ${him}. ${His}`);
		if (canSee(eventSlave)) {
			r.push(`${App.Desc.eyesColor(eventSlave)} are watching you closely,`);
		} else {
			r.push(`face is centered on you,`);
		}
		r.push(`and ${he}'s listening carefully for direction. This is probably due to linguistic anxiety: ${he} can understand the most straightforward commands, but giving ${him} orders is often an exercise in`);
		if (canSee(eventSlave)) {
			r.push(`pointing and gesturing, or when that fails, simply`);
		} else {
			r.push(`frustration, ending with you simply`);
		}
		r.push(`pushing and pulling ${his} usually-compliant body into the proper place.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} personal language lessons`, language),
			new App.Events.Result(`Teach ${him} the words for body parts`, bodyParts),
		]);

		function language(){
			const frag = document.createDocumentFragment();
			r = [];

			r.push(`You order ${him} to sit next to you. Sure enough, ${he} hesitates, but ${he} seems to have gotten the 'next to you' part, and comes carefully over,`);
			if (canSee(eventSlave)) {
				r.push(`watching you`);
			} else {
				r.push(`listening`);
			}
			r.push(`intently for any indication that ${he}'s misunderstood you. Once there, ${he} stops, knees bent partway as ${he} second-guesses ${himself} about whether ${he}'s supposed to sit. Sighing internally, you grab`);
			if (eventSlave.belly >= 5000) {
				if (eventSlave.piercing.navel.weight > 0) {
					r.push(`the piercing dangling from ${his} ${belly} belly`);
				} else {
					r.push(`${his} ${belly} belly`);
				}
			} else if (eventSlave.piercing.nipple.weight > 0) {
				r.push(`a nipple piercing`);
			} else if (eventSlave.nipples === "fuckable") {
				r.push(`a nipplecunt`);
			} else if (eventSlave.lactation > 0) {
				r.push(`a milky nipple`);
			} else {
				r.push(`a nipple`);
			}
			r.push(`and pull downward gently.`, Spoken(eventSlave, `"Sorry ${Master},"`), `${he} mutters in ${his} barbarous ${eventSlave.nationality !== "Stateless" ? `${aNational(eventSlave.nationality)}` : ""} accent, and sits`);
			if (eventSlave.belly >= 5000) {
				r.push(`carefully down.`);
			} else {
				r.push(`hurriedly down.`);
			}
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`You review 'next,' praising ${him} for getting that, and then move on to 'sit,' 'stand,' and other such useful terms, teaching the ${V.language} language to the nude slave sitting`);
			if (eventSlave.belly >= 10000 || eventSlave.weight >= 130) {
				r.push(`heavily`);
			} else if (hasBothLegs(eventSlave)) {
				r.push(`cross-legged`);
			}
			r.push(`next to you. ${He} listens raptly, parroting obediently and clearly doing ${his} best to please, but you notice a certain incredulity that slowly fades as the lesson goes on. ${He}'s obviously having trouble believing that ${his} owner would trouble ${himselfP} with ${his} vocabulary lessons. You work with ${him} several times a day, and ${he}'s so diligent that by the end of the week ${he}'s beginning to make ${himself} understood, though ${his} accent is still pretty atrocious.`);
			eventSlave.accent--;
			App.Events.addParagraph(frag, r);
			return frag;
		}

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

			r = [];
			r.push(`You order ${him} to stand next to you. ${He} hesitates, but eventually processes the instruction and`);
			if (canWalk(eventSlave)) {
				r.push(`hurries`);
			} else {
				r.push(`shuffles`);
			}
			r.push(`over. When ${he} comes to a stop, ${he} gasps to find you taking ${him} by the`);
			if (hasBothArms(eventSlave)) { // really going all in here
				r.push(`hands. You raise them slightly, bringing them`);
				if (canSee(eventSlave)) {
					r.push(`up into ${his} field of view,`);
				} else {
					r.push(`to ${his} attention,`);
				}
				r.push(`and tell ${him} that these are ${his} hands. "${Spoken(eventSlave, "Hands")}," ${he} parrots in ${V.language} understanding that this is a language lesson. Your own hands slide over ${his} wrists to grasp ${his}`);
				if (eventSlave.weight > 160) {
					r.push(`fat`);
				} else if (eventSlave.weight > 95) {
					r.push(`chubby`);
				} else if (eventSlave.muscles > 5) {
					r.push(`toned`);
				} else {
					r.push(`soft`);
				}
				r.push(`forearms, producing a little shiver; you name them, and ${he} repeats after you, "${Spoken(eventSlave, "Arms")}." You reach`);
			} else {
				r.push(`hand. You raise it slightly, bringing it`);
				if (canSee(eventSlave)) {
					r.push(`up into ${his} field of view,`);
				} else {
					r.push(`to ${his} attention,`);
				}
				r.push(`and tell ${him} that these are ${his} hand. "Hand," ${he} parrots in ${V.language} understanding that this is a language lesson. Your own hands slide over ${his} wrist to grasp ${his}`);
				if (eventSlave.weight > 160) {
					r.push(`fat`);
				} else if (eventSlave.weight > 95) {
					r.push(`chubby`);
				} else if (eventSlave.muscles > 5) {
					r.push(`toned`);
				} else {
					r.push(`soft`);
				}
				r.push(`forearm, producing a little shiver; you name it, and ${he} repeats after you, "Arm." You reach`);
			}
			if (eventSlave.height >= 185) {
				r.push(`a long way up to reach the tall`);
			} else if (eventSlave.height >= 160) {
				r.push(`up to caress the`);
			} else {
				r.push(`out to touch the diminutive`);
			}
			r.push(`slave's shoulders possessively, and name them.`, Spoken(eventSlave, `"Shoulder."`));
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`You continue from there.`, Spoken(eventSlave, `"Neck. Chin. Lips. Chest. Boobs. ${eventSlave.nipples === "fuckable" ? "N-nipplecunts" : "N-nipples"}. Belly. Hips,`));
			if (eventSlave.dick > 0) {
				if (eventSlave.balls > 0) {
					r.push(Spoken(eventSlave, `c-cock, oh ${Master}, p-please, augh, balls,`));
				} else {
					r.push(Spoken(eventSlave, `b-bitchclit, oh ${Master}, p-please,`));
				}
			}
			if (eventSlave.vagina > -1) {
				r.push(Spoken(eventSlave, `pussy. Cliiiiiit, oh ${Master} n-nuh,`));
			}
			r.push(Spoken(eventSlave, `Butt," and finally, "B-butt, um, butthole."`));
			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, [
				new App.Events.Result(`Now let ${him} review`, review),
				canDoVaginal(eventSlave)
					? new App.Events.Result(`Cover some sexual vocabulary, and make sure ${he} doesn't forget it`, sexual, eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null)
					: new App.Events.Result(),
				canDoAnal(eventSlave)
					? new App.Events.Result(`Cover some anal vocabulary, and make sure ${he} doesn't forget it`, anal, eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null)
					: new App.Events.Result(),
				canPenetrate(eventSlave) && isPlayerReceptive(eventSlave)
					? new App.Events.Result(`Cover some extra curricular vocabulary, and see if ${he} retains it`, fuckMe, PCPenetrationWarning())
					: new App.Events.Result(),
			]);

			function review() {
				r = [];
				r.push(`You tell ${him} to do the inspection routine again, narrating it ${himself}. ${He} understands immediately, and hustles back to stand in front of your desk, brow furrowed in concentration as ${he} struggles to keep the vocabulary in ${his} head. ${He} shows each part of ${his} body to you in turn, and gets every single one of the terms to describe ${his} body — which in the legal sense, is actually your body, one of many you own — perfectly right, though of course ${he} repeats them in ${his} atrocious ${eventSlave.nationality !== "Stateless" ? `${aNational(eventSlave.nationality)}` : ""} accent. ${He} even has the confidence to throw in a little flourish: ${he} says`);
				if (eventSlave.belly >= 10000) {
					r.push(`"Belly!" with flirty emphasis, stroking it sensually.`);
				} else if (eventSlave.boobs > 3000) {
					r.push(Spoken(eventSlave, `"Boobs!"`), `with flirty emphasis, bouncing them for you.`);
				} else if (eventSlave.dick > 0 && eventSlave.balls > 0) {
					r.push(Spoken(eventSlave, `"Cock!"`), `with flirty emphasis, making it bounce for you.`);
				} else if (eventSlave.dick > 0) {
					r.push(Spoken(eventSlave, `"Bitchclit!"`), `with flirty emphasis, making it wave for you.`);
				} else if (eventSlave.lips > 40) {
					r.push(Spoken(eventSlave, `"Lips!"`), `with flirty emphasis, and blows you a kiss.`);
				} else if (eventSlave.butt > 4) {
					r.push(`"Butt!" with flirty emphasis, jiggling it for you.`);
				} else {
					r.push(`"Butthole!" with flirty emphasis, bending over and`);
					if (!canDoAnal(eventSlave)) {
						r.push(`shaking ${his} anal chastity at you.`);
					} else {
						r.push(`winking it for you.`);
					}
				}
				eventSlave.trust += 4;
				return r;
			}

			function sexual() {
				const {girlU, himU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");

				r = [];
				r.push(`A glance at one of your desk monitors reveals that another slave whose business brought ${himU} past this area of the penthouse has paused and is listening quizzically, trying to figure out what this odd, heavily accented chant coming out of your office means. It soon becomes obvious.`);
				r.push(Spoken(eventSlave, `"Fingerfuuuck!"`));
				r.push(`comes ${eventSlave.slaveName}'s voice, loud and clear, and <span class="devotion inc">desperately eager to please.</span> ${He} continues, moving from "Pussy" to`);
				if (V.PC.dick !== 0) {
					r.push(Spoken(eventSlave, `"${Master}'s ${V.PC.vagina !== -1 ? "futacock" : "cock"}, oh no,"`));
				} else {
					r.push(Spoken(eventSlave, `"Strap-on, oh no,"`));
				}
				r.push(`to repetition of`);
				r.push(Spoken(eventSlave, `"Intercourse, sex, unh, fucking, screwing, um, pounding,"`));
				r.push(`and so on. Just when the eavesdropping ${girlU} decides that this has become monotonous and turns to go about ${hisU} business, ${eventSlave.slaveName}'s voice rises sharply in pitch. "Aaah! rape!`);
				r.push(Spoken(eventSlave, `Oh please, ${Master}, ohh, rape, rape,"`));
				r.push(`followed by much tearful repetition of what's happening to ${him}, and a final, sad`);
				if (V.PC.dick !== 0) {
					r.push(Spoken(eventSlave, `"C-creampie,"`));
				} else {
					r.push(`"Loosened,"`);
				}
				r.push(`in a defeated little voice.`);
				eventSlave.trust -= 2;
				eventSlave.devotion += 4;
				r.push(VCheck.Vaginal(eventSlave, 1));
				return r;
			}

			function anal() {
				const {girlU, himU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");

				r = [];
				r.push(`A glance at one of your desk monitors reveals that another slave whose business brought ${himU} past this area of the penthouse has paused and is listening quizzically, trying to figure out what this odd, heavily accented chant coming out of your office means. It soon becomes obvious.`);
				r.push(Spoken(eventSlave, `"Fingerfuuuck!"`));
				r.push(`comes ${eventSlave.slaveName}'s voice, loud and clear, and <span class="devotion inc">desperately eager to please.</span> ${He} continues, moving from "Sphincter" to`);
				if (V.PC.dick !== 0) {
					r.push(Spoken(eventSlave, `"${Master}'s ${V.PC.vagina !== -1 ? "futacock" : "cock"}, oh no,"`));
				} else {
					r.push(Spoken(eventSlave, `"Strap-on, oh no,"`));
				}
				r.push(`to repetition of`);
				r.push(Spoken(eventSlave, `"Anal, buttsex, unh, assfucking, sodomy, um, buttfucking,"`));
				const Assrape = Spoken(eventSlave, "Assrape");
				r.push(`and so on. Just when the eavesdropping ${girlU} decides that this has become monotonous and turns to go about ${hisU} business, ${eventSlave.slaveName}'s voice rises sharply in pitch. "Aaah! ${Assrape}!`);
				r.push(Spoken(eventSlave, `Oh please, ${Master}, ohh, assrape, assrape,"`));
				r.push(`followed by much tearful repetition of what's happening to ${him}, and a final, sad`);
				if (V.PC.dick !== 0) {
					r.push(Spoken(eventSlave, `"C-creampie,"`));
				} else {
					r.push(`"Gape,"`);
				}
				r.push(`in a defeated little voice.`);
				eventSlave.trust -= 2;
				eventSlave.devotion += 4;
				r.push(VCheck.Anal(eventSlave, 1));
				return r;
			}

			function fuckMe() {
				const {girlU, himU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");

				r = [];
				r.push(`A glance at one of your desk monitors reveals that another slave whose business brought ${himU} past this area of the penthouse has paused and is listening quizzically, trying to figure out what this odd, heavily accented chant coming out of your office means. It soon becomes obvious.`);
				r.push(Spoken(eventSlave, `"Erection!"`));
				r.push(`comes ${eventSlave.slaveName}'s voice, loud and clear, and <span class="devotion inc">desperately eager to please.</span> ${He} continues, moving from "Glans" to`);
				if (V.PC.vagina === 0) {
					r.push(`a surprised`);
					r.push(App.UI.DOM.makeElement('span', Spoken(eventSlave, `"Hymen!?"`), ["virginity", "loss"]));
					r.push(`to a sigh and more pleasured`);
					V.PC.vagina = 1;
				} else if (V.PC.vagina < 0 && V.PC.anus === 0) {
					r.push(`a surprised`);
					r.push(App.UI.DOM.makeElement('span', Spoken(eventSlave, `"Anus... virgin!?"`), ["virginity", "loss"]));
					r.push(`to a sigh and more pleasured`);
					V.PC.anus = 1;
				}
				r.push(Spoken(eventSlave, `"${Master}'s ${V.PC.vagina !== -1 ? "pussy" : "butthole"}, ah warm,"`));
				r.push(`to repetition of`);
				r.push(Spoken(eventSlave, `"Intercourse, sex, unh, fucking, breeding, um, mounting,"`));
				const Orgasm = Spoken(eventSlave, "Orgasm");
				r.push(`and so on. Just when the eavesdropping ${girlU} decides that this might be too salacious for ${hisU} well-being and turns to go about ${hisU} business, ${eventSlave.slaveName}'s voice rises sharply in pitch. "Aaah! ${Orgasm}!`);
				r.push(Spoken(eventSlave, `Oh ${Master}, ohh, orgasm, orgasm,"`));
				r.push(`followed by much breathless repetition of what's about to come, and a final, ecstatic`);
				r.push(Spoken(eventSlave, `"C-creampie!"`));
				r.push(`in a completely out of breath voice.`);
				eventSlave.trust += 4;
				eventSlave.devotion += 4;
				if (V.PC.vagina !== -1) {
					seX(eventSlave, "penetrative", V.PC, "vaginal");
					if (canImpreg(V.PC, eventSlave)) {
						knockMeUp(V.PC, 20, 0, eventSlave.ID);
					}
				} else {
					seX(eventSlave, "penetrative", V.PC, "anal");
					if (canImpreg(V.PC, eventSlave)) {
						knockMeUp(V.PC, 20, 1, eventSlave.ID);
					}
				}
				return r;
			}
			return frag;
		}
	}
};

repo_name: Arkerthan/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canStand,
				hasAnyArms,
				s => (s.assignment === Job.FUCKTOY || s.assignment === Job.MASTERSUITE || s.assignment === Job.CONCUBINE),
				s => s.devotion > 20,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl, woman
		} = getPronouns(eventSlave);
		const {title} = getEnunciation(eventSlave);

		/** @param {App.Entity.SlaveState} slave */
		function getSceneClothes(slave) {
			if (getLimbCount(slave, 102) > 2) {
				return "an oversized t-shirt";
			} else if (slave.boobs > 4000) {
				return "an oversized t-shirt"; /* loose pajama top */
			} else if (slave.intelligence+slave.intelligenceImplant > 50) {
				return "a halter top dress";
			} else if (slave.muscles > 30) {
				if (isItemAccessible.entry("sport shorts", "clothes")) {
					if (slave.boobs >= 650) {
						return "sport shorts and a sports bra";
					} else {
						return "sport shorts";
					}
				} else {
					return "spats and a tank top";
				}
			} else if (slave.energy > 95) {
				return null; // no change of clothes
			} else {
				return "conservative clothing";
			}
		}

		App.Events.drawEventArt(node, eventSlave, getSceneClothes(eventSlave));

		let t = [];
		t.push(`Although your life as an arcology owner comes with many associated privileges, extended idleness to bask in your luxury is not often among them. Thankfully, ${V.assistant.name} knows better than to let you run yourself ragged from the weight of your assorted responsibilities and often allots time in the evenings of your active schedule to simply relax.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`Of course, no self respecting arcology owner could be expected to enjoy a lazy night of idle relaxation on their own. As you resolve the last of your most pressing responsibilities for the evening, ${V.assistant.name} directs one of your attentive slaves to gently guide you away from the unending burdens of running your arcology. Leaning against the doorway and wearing a facsimile of what an old world ${woman} might wear on a casual night in,`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		if (!canTalk(eventSlave)) {
			t.push(`asks with a gesture that carries just the right mixture of submission and exaggerated casualness if you'd like to 'hang out.'`);
		} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
			t.push(
				`lisps with exaggerated casualness,`,
				Spoken(eventSlave, `"Let's hang out, ${title}?"`)
			);
		} else {
			t.push(
				`asks with exaggerated casualness,`,
				Spoken(eventSlave, `"Want to hang out, ${title}?"`)
			);
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`${He} saunters over and`);
		if (eventSlave.belly >= 100000) {
			t.push(`struggles to lower ${his} ${bellyAdjective(eventSlave)} form to an obedient kneel`);
		} else if (eventSlave.belly >= 10000) {
			t.push(`gingerly lowers ${his} heavily ${eventSlave.bellyPreg > 3000 ? "gravid" : "swollen"} form to an obedient kneel`);
		} else if (eventSlave.belly >= 5000) {
			t.push(`gently lowers ${his} ${eventSlave.bellyPreg > 3000 ? "gravid" : "swollen"} form to an obedient kneel`);
		} else {
			t.push(`kneels obediently`);
		}
		t.push(`in front of you, awaiting further direction.`);

		/* If you are updating below, please consider updating the vector art swaps at the top to match. */
		if (getLimbCount(eventSlave, 102) > 2) {
			t.push(`Clad in an antique T-Shirt referencing some defunct old world website, ${his} P-Limbs stand in stark contrast — gyros and servomotors against simple thread and cloth. With such tangible examples of the technological prowess of the Free Cities serving as ${his} limbs, ${his} ${eventSlave.belly >= 5000 ? "taut " : ""} shirt is an amusing testimonial to how far behind the old world stands in contrast to the new.`);
		} else if (eventSlave.boobs > 4000) {
			t.push(`${His} breasts are so massive that the front of ${his} loose pajama top must be unbuttoned. Even so, the protrusion of ${his} immense breasts`);
			if (eventSlave.belly >= 5000) {
				t.push(`and ${bellyAdjective(eventSlave)} rounded belly from ${his} body`);
			} else {
				t.push(`from ${his} chest`);
			}
			t.push(`strains the soft pajama top to its breaking point.`);
		} else if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
			t.push(`As a clever ${girl}, ${his} simple${eventSlave.belly >= 5000 ? `, yet tight around the middle,` : ""} summer dress evokes memories of bygone warm weather days at elite old world colleges — and the sexual conquest of their youthful residents.`);
		} else if (eventSlave.muscles > 30) {
			t.push(`${His} simple sports bra and compression shorts ensemble does little to conceal ${his} incredible musculature,`);
			if (eventSlave.belly >= 1500) {
				t.push(`straining to hold up against ${his} swelling middle and`);
			}
			t.push(`glistening with sweat from a recent workout. Despite ${his} recent exertions, ${he}'s able to maintain utter stillness in the perfect posture of an obedient slave.`);
		} else if (eventSlave.energy > 95) {
			t.push(`${He}'s controlling ${his} absurd sex drive for the moment in deference to the notion of your relaxation time, but ${he} clearly wouldn't mind some sex as part of the evening.`);
			if (eventSlave.dick > 0) {
				if (canAchieveErection(eventSlave)) {
					t.push(`${His} cock is painfully erect`);
					if (eventSlave.belly >= 10000) {
						t.push(`and pressed against the underside of ${his} belly,`);
					}
				} else {
					t.push(`${His} soft dick is dribbling precum,`);
				}
			} else {
				t.push(`${His} pussy is visibly soaked,`);
			}
			t.push(`showing unmistakably how badly ${he} needs release.`);
		} else {
			t.push(`${He} keeps ${his}`);
			if (canSee(eventSlave)) {
				t.push(App.Desc.eyesColor(eventSlave));
			} else {
				t.push("face");
			}
			t.push(`slightly downcast, ${his} hands lightly smoothing the folds from ${his} tight skirt while ${his} breasts visibly rise and fall under ${his} even tighter blouse.`);
			if (eventSlave.belly >= 5000) {
				t.push(`Between the two, there is little ${he} can do to cover ${his} exposed ${eventSlave.bellyPreg >= 3000 ? "pregnancy" : "middle"}.`);
			}
			t.push(`${He}'s the perfect picture of an attentive little old world ${girl}friend${eventSlave.height > 185 ? ` (though, of course, ${he}'s anything but physically small)` : ""}.`);
		}
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result("Enjoy some oral with an evening of wallscreen television", flixAndChill),
			new App.Events.Result("Spend the night idly cuddling", cuddle),
			new App.Events.Result(`Unwind by tormenting ${him}`, torture)
		]);

		function flixAndChill() {
			let t = [];
			t.push(`There are some things that never change, even after ascension to the high position of an arcology owner. One of these fixtures of life is the ability to enjoy a relaxing evening of wallscreen television and`);
			if (V.PC.dick !== 0) {
				t.push("a blowjob");
				if (V.PC.vagina !== -1) {
					t.push("and");
				}
			}
			if (V.PC.vagina !== -1) {
				t.push("some cunnilingus");
			}
			t.push(t.pop() + ".");
			t.push(`With ${eventSlave.slaveName} sequestered between your legs, you tune into your favorite Free Cities serial drama and widen your legs slightly as you sink back into the chair with a sigh of contentment. ${He}`);
			if (eventSlave.belly >= 300000) {
				t.push(`gently leans onto ${his} ${bellyAdjective(eventSlave)} belly`);
				if (hasAnyArms(eventSlave)) {
					t.push(`with ${his} arm${hasBothArms(eventSlave) ? "s" : ""} steadying the mass`);
				}
			} else if (eventSlave.belly >= 5000) {
				if (hasAnyLegs(eventSlave)) {
					t.push(`kneels carefully`);
				} else {
					t.push(`lowers ${himself}`);
				}
				if (hasAnyArms(eventSlave)) {
					t.push(`with ${hasBothArms(eventSlave) ? `an` : `${his}`} arm`);
					if (eventSlave.bellyPreg >= 3000) {
						t.push(`wrapped protectively around ${his} bump`);
					} else {
						t.push(`cradling ${his} ${bellyAdjective(eventSlave)} belly`);
					}
				}
			} else {
				t.push(`sinks to`);
				if (hasAnyLegs(eventSlave)) {
					t.push(`${his} knee${hasBothLegs(eventSlave) ? "s" : ""} obediently`);
					if (hasAnyArms(eventSlave)) {
						t.push(`with ${his} hand${hasBothArms(eventSlave) ? "s" : ""} placed placidly on ${his} thigh${hasBothLegs(eventSlave) ? "s" : ""}`);
					}
				} else {
					t.push("the ground");
				}
			}
			t.push(`before putting ${his} mouth to work,`);
			if (eventSlave.skill.oral >= 100) {
				t.push(`${his} mastery at giving oral providing a wealth of pleasure.`);
			} else if (eventSlave.skill.oral > 60) {
				t.push(`${his} skills in oral providing ample pleasure.`);
			} else {
				t.push(`${his} mediocre oral skills providing some relief.`);
			}
			if (eventSlave.teeth === "pointy") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you still feel the extreme care ${he} has to take to keep ${his} shark-like teeth clear of you.`);
			} else if (eventSlave.teeth === "fangs") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to not scratch you with ${his} fangs.`);
			} else if (eventSlave.lips > 40) {
				t.push(`${His} huge lips are soft and pillowy against you.`);
			} else if (eventSlave.teeth === "fang") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the care ${he} is taking to keep ${his} fang from clipping you.`);
			} else if (eventSlave.teeth === "gapped") {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to not pinch you between ${his} front teeth.`);
			} else if ((eventSlave.teeth === "straightening braces") || (eventSlave.teeth === "cosmetic braces")) {
				t.push(`Although most of your attention is focused on the intriguing drama unfolding on your wallscreen, you can feel the slight hesitations as ${he} takes care to keep ${his} braces off you.`);
			}
			t.push(`You have an enjoyable evening glued to your wallscreen, punctuated by the playful ruffling ${eventSlave.hLength > 1 ? `of ${eventSlave.slaveName}'s ${eventSlave.hColor} hair` : `across ${eventSlave.slaveName}'s scalp`} and the occasional orgasm into ${his} waiting mouth.`);
			if (eventSlave.sexualFlaw !== "hates oral") {
				t.push(`Though your experience was more stimulating than ${hers}, ${eventSlave.slaveName} <span class="devotion inc">enjoyed being used while you enjoyed yourself.</span>`);
				eventSlave.devotion += 4;
			} else {
				t.push(`Although you enjoyed ${his} ministrations, ${eventSlave.slaveName} had a bad time because of ${his} <span class="devotion dec">hate of oral.</span>`);
				eventSlave.devotion -= 2;
			}
			seX(eventSlave, "oral", V.PC, "penetrative");
			return t;
		}

		function cuddle() {
			let t = [];
			t.push(`Though your evening could hardly be called eventful, there is something eminently comforting about having a warm`);
			if (eventSlave.physicalAge > 30) {
				t.push(woman);
			} else if (eventSlave.physicalAge > 18) {
				t.push("young lady");
			} else if (eventSlave.physicalAge > 12) {
				t.push("teen");
			} else {
				t.push(`little ${girl}`);
			}
			t.push(`cuddled up beside you to idly while away the hours`);
			if (eventSlave.bellyPreg >= 1500 && eventSlave.pregSource === -1) {
				t.push(t.pop() + ",");
				t.push(`especially when ${he} is ${eventSlave.belly >= 300000 ? `so massively swollen with your children` : `heavy with your child${eventSlave.pregType > 1 ? "ren" : ""}`}`);
			}
			t.push(t.pop() + ".");
			t.push(`${He} <span class="trust inc">trusts you more</span> for these few intimate hours amidst ${his} life of sexual servitude.`);
			eventSlave.trust += 4;
			return t;
		}

		function torture() {
			let t = [];
			t.push(`Though there is no shortage of torments you inflict during the course of your day to day life as an arcology owner, there is something refreshing about torturing a slave out of idle boredom rather than corrective disciple or sexual domination. Your night is filled with ${eventSlave.voice === 0 ? "the horrible rasping that a mute throat substitutes for cries of agony" : "echoing shrieks of anguish"}, though every vocal outburst is idly punished with electro shock or strike of the whip. Come the morning, ${eventSlave.slaveName}`);
			if (eventSlave.fetish === "masochist") {
				t.push(`is mortified by the intensity of ${his} orgasms that night, <span class="devotion inc">and more convinced than ever that ${he}'s a pain slut,</span> and yet`);
				eventSlave.devotion += 4;
			}
			t.push(`<span class="trust dec">scuttles away to tend to the bruises and marks that litter ${his} battered body.</span>`);
			eventSlave.trust -= 5;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canHear,
				s => s.skill.whoring >= 100,
				s => s.trust > 50,
				s => s.devotion > 20,
				s => s.assignment === Job.WHORE,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const feet = hasBothLegs ? "feet" : "foot";

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

		let r = [];
		r.push(`As a queen of the whorehouse,`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`is never surprised, never squeamish, and always on the prowl for ${his} next customer. ${He} has mastered the transactionalization of sex. When ${he}'s selling ${himself} by the hole, a customer who purchases ${his} skilled oral services will often find himself upsold to a more expensive`);
		if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
			r.push(`vaginal experience.`);
		} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
			r.push(`anal experience.`);
		} else {
			r.push(`showcase of ${his} skills.`);
		}
		r.push(`When ${he}'s doing it by the orgasm, customers find themselves climaxing rather more quickly than they intended.`);
		App.Events.addParagraph(node, r);
		App.Events.addParagraph(node, [`And perhaps most importantly, ${he} always has an ear to the ground, even when one of them is being shoved against the sheets. Customers say the most interesting things when they've got themselves buried in ${him}. Today, ${he}'s got an especially delightful morsel of information for you: one of your commercial tenants is shortchanging you on rent, concealing profits to reduce your share.`]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Require double repayment`, double),
			new App.Events.Result(`Require double repayment and spend it on ${him}`, spend),
			new App.Events.Result(`Leverage the situation and reward ${him}`, reward, `This option will cost ${cashFormat(2000)}`),
		]);

		function double() {
			cashX(random(150, 200)*10, "event", eventSlave);
			return `Your tenant knows that abject surrender is his only hope once you make it clear to him that his scheme is known to you. He complies all too eagerly with your demand that he repay double what he owes.`;
		}

		function spend() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave, "conservative clothing");

			r = [];
			r.push(`Your tenant knows that abject surrender is his only hope once you make it clear to him that his scheme is known to you. He complies all too eagerly with your demand that he repay double what he owes. Slaves are not permitted to keep possessions, especially money, so you spend it on ${eventSlave.slaveName} directly. ${He} spends the day`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 2) {
				r.push(`having ${his} pregnant belly moisturized,`);
				if (hasAnyLegs(eventSlave)) {
					r.push(`${his} tired ${feet} rubbed,`);
				}
				r.push(`${his} cravings fulfilled, being`);
			} else {
				r.push(`being`);
			}
			r.push(`massaged, beautified, and pampered. You then take ${him} out for a lovely meal, allowing ${him} to wear clothing that's almost conservative by Free Cities standards, and take a nice walk around ${V.arcologies[0].name}'s club, talking on light subjects. ${He}'s deeply touched by an evening of affection without sex.`);
			eventSlave.devotion += 10;
			return r;
		}

		function reward() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave, "conservative clothing");

			r = [];
			r.push(`Archimedes might have his lever, but give you a place to set such information as this, and you can move a mountain of money. Before he knows what has beset him, your tenant is bustled out of ${V.arcologies[0].name} and replaced by a favored and hopefully more honest competitor, who is well aware of the score here. ${eventSlave.slaveName}, who made this possible, spends the day`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 2) {
				r.push(`having ${his} pregnant belly moisturized,`);
				if (hasAnyLegs(eventSlave)) {
					r.push(`${his} tired ${feet} rubbed,`);
				}
				r.push(`${his} cravings fulfilled, being`);
			} else {
				r.push(`being`);
			}
			r.push(`massaged, beautified, and pampered. You then take ${him} out for a lovely meal, allowing ${him} to wear clothing that's almost conservative by Free Cities standards, and take a nice walk around ${V.arcologies[0].name}'s club, talking on light subjects. ${He}'s deeply touched by an evening of affection without sex, and ${he} trusts you with all sorts of amusing whorehouse rumors.`);
			eventSlave.devotion += 3;
			eventSlave.trust += 3;
			cashX(-2000, "event", eventSlave);
			V.arcologies[0].prosperity += 1;
			return r;
		}
	}
};


code:
App.Events.RESSMeanGirls = class RESSMeanGirls extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !FutureSocieties.isActive('FSDegradationist'),
			() => V.arcologyUpgrade.drones === 1,
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => s.assignment === Job.PUBLIC,
				hasAnyArms,
				canStand,
				canHear,
				s => s.boobs > 600,
				s => s.fetishKnown === 1,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, girl, himself
		} = getPronouns(eventSlave);
		const {hisA, heA, HeA} = getPronouns(assistant.pronouns().main).appendSuffix('A');

		let artDiv = document.createElement("div"); // named container so we can replace it later
		node.appendChild(artDiv);

		function makeSlave() {
			const slave = GenerateNewSlave("XX", {
				minAge: 16,
				maxAge: 19,
				ageOverridesPedoMode: 1,
				nationality: "American",
				race: "nonslave",
				disableDisability: 1,
			});
			slave.origin = `You enslaved $him for abusing ${eventSlave.slaveName} while ${he} was serving the public.`;
			slave.career = "a student";
			slave.markings = "none";
			slave.weight = -20;
			slave.devotion = random(-80, -60);
			slave.trust = random(-20, -10);
			slave.muscles = random(0, 15);
			slave.boobsImplant = 200 * random(0, 3);
			slave.boobs += slave.boobsImplant;
			slave.boobsImplantType = "normal";
			slave.buttImplant = random(0, 2);
			slave.butt += slave.buttImplant;
			slave.buttImplantType = "normal";
			slave.butt += 1;
			slave.vagina = random(1, 2);
			slave.anus = 1;
			slave.face = random(20, 60);
			setHealth(slave, jsRandom(30, 50), 0, 0, 0, 0);
			slave.attrXY = random(60, 90);
			slave.attrXX = random(10, 20);
			slave.behavioralFlaw = either("arrogant", "bitchy");
			slave.clothes = either("a mini dress", "a t-shirt and jeans", "conservative clothing", "sport shorts and a t-shirt");
			return slave;
		}
		const newSlaves = [makeSlave(), makeSlave(), makeSlave()];
		const {He2, his2, him2, he2} = getPronouns(newSlaves[0]).appendSuffix('2');
		const {He3, his3} = getPronouns(newSlaves[1]).appendSuffix('3');
		App.Events.drawEventArt(artDiv, [eventSlave, ...newSlaves]);

		let r = [];
		r.push(`One evening, ${V.assistant.name} breaks in on your`);
		if (V.assistant.personality > 0) {
			r.push(`work, ${hisA} ${V.assistant.appearance} avatar looking uncharacteristically somber.`);
			r.push(`"${properMaster()}," ${heA} says, "a group of tourists are giving`);
			r.push(contextualIntro(V.PC, eventSlave, true));
			r.push(`a bad time." Before you can ask why the security drones haven't addressed the situation, ${heA} continues, "They're not abusing ${him} physically or anything. But, look." ${HeA}`);
		} else {
			r.push(`work, announcing that a group of visitors to the arcology are being verbally abusive to`);
			r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "."));
			r.push(`Before you can ask why ${heA}'s bothering you with this, ${heA} continues, "An enslavement opportunity may exist," and`);
		}
		r.push(`brings up a video feed.`);
		App.Events.addParagraph(node, r);
		r = [];

		r.push(`${eventSlave.slaveName} is doing ${his} job, standing in an area of the arcology that's busy at this time of night,`);
		if (eventSlave.energy > 95) {
			r.push(`eagerly`);
		} else if (eventSlave.devotion > 95) {
			r.push(`diligently`);
		} else if (eventSlave.devotion > 20) {
			r.push(`obediently`);
		} else {
			r.push(`reluctantly`);
		}
		r.push(`showing off ${his}`);
		if (eventSlave.bellyPreg >= 1500) {
			r.push(`pregnant`);
		} else if (eventSlave.bellyImplant >= 1500) {
			r.push(`gravid`);
		} else if (eventSlave.bellyFluid >= 1500) {
			r.push(`bloated`);
		}
		if (App.Data.clothes.get(eventSlave.clothes).exposure >= 4) {
			r.push(`nude body`);
		} else {
			r.push(`body in ${his} ${App.Data.clothes.get(eventSlave.clothes).name.toLowerCase()}`);
		}
		r.push(`and flirting with passersby. Or ${he} would be, if ${he} weren't surrounded by a hostile group of girls. They're very obviously inebriated, rich, vapid, and on vacation, and their rapid-fire bitchiness makes the cause clear.`);
		App.Events.addParagraph(node, r);
		r = [];

		r.push(Spoken(newSlaves[2], `"Why the fuck did you say that shit? We're not lesbians,"`), `says one.`);
		App.Events.addParagraph(node, r);
		r = [];

		r.push(Spoken(newSlaves[1], `"You're fucking gross,"`), `says another.`, Spoken(newSlaves[1], `"Like, ew. Even if it's free, why the fuck would we let you touch us?"`));
		App.Events.addParagraph(node, r);
		r = [];

		if (eventSlave.bellyPreg >= 750000) {
			r.push(Spoken(newSlaves[0], `"Holy shit, ${he}'s gonna blow! Bitch'll keep fucking till ${his} belly pops open and keep on fucking still,"`));
		} else if (eventSlave.belly >= 750000) {
			r.push(Spoken(newSlaves[0], `"That belly is disgusting, what did ${he} do? Fuck an elephant?"`));
		} else if (eventSlave.boobs > 25000) {
			r.push(Spoken(newSlaves[0], `"Those boobs are disgusting; look at ${him} struggle,"`));
		} else if (eventSlave.bellyPreg >= 450000) {
			r.push(Spoken(newSlaves[0], `"What a slut! I bet everyone in the arcology has a baby in ${him},"`));
		} else if (eventSlave.belly >= 450000) {
			r.push(Spoken(newSlaves[0], `"That belly is disgusting; what is that, a horse?"`));
		} else if (eventSlave.weight > 190) {
			r.push(Spoken(newSlaves[0], `"I've never seen someone <i>that</i> fat before. How can you live with yourself knowing you're such a whale?"`));
		} else if (eventSlave.butt > 10) {
			r.push(Spoken(newSlaves[0], `"That ass is disgusting; look how fat it is,"`));
		} else if (eventSlave.bellyFluid >= 5000) {
			r.push(Spoken(newSlaves[0], `"Look at that belly! Wait, is it just me or is it wobbling? Holy shit! ${He} must have sucked down, like, gallons of cum,"`));
		} else if (eventSlave.clit >= 3) {
			r.push(Spoken(newSlaves[0], `"Holy shit! That's no dick; it's some sort of freak clit,"`));
		} else if (eventSlave.boobs > 5000) {
			r.push(Spoken(newSlaves[0], `"Those boobs are disgusting,"`));
		} else if (eventSlave.belly >= 150000) {
			r.push(Spoken(newSlaves[0], `"Oh my god, I didn't know a ${girl} could get <i>that</i> pregnant,"`));
		} else if (eventSlave.dick > 6) {
			r.push(Spoken(newSlaves[0], `"That dick is so disgusting,"`));
		} else if (eventSlave.weight > 130) {
			r.push(Spoken(newSlaves[0], `"What a cow; how can you be so proud of being such a fat slob?"`));
		} else if (eventSlave.intelligence+eventSlave.intelligenceImplant < -15) {
			r.push(Spoken(newSlaves[0], `"${He}'s retarded,"`));
		} else if (eventSlave.lips > 40) {
			r.push(Spoken(newSlaves[0], `"Those lips make ${him} look like a cartoon,"`));
		} else if (eventSlave.belly >= 1500) {
			r.push(Spoken(newSlaves[0], `"Look at that belly; bet ${he} doesn't even know whose it is,"`));
		} else if (eventSlave.dick > 3) {
			r.push(Spoken(newSlaves[0], `"I bet ${he} never gets to stick that thing in anyone,"`));
		} else if (eventSlave.anus > 2) {
			r.push(Spoken(newSlaves[0], `"Holy shit, I can see ${his} asshole from here,"`));
		} else if (eventSlave.dick > 0) {
			r.push(Spoken(newSlaves[0], `"Oh, look, ${he} has a lame little dick,"`));
		} else if (eventSlave.visualAge > 30) {
			r.push(Spoken(newSlaves[0], `"What an ugly old slut,"`));
		} else if (eventSlave.weight > 30) {
			r.push(Spoken(newSlaves[0], `"What a fat pig, showing off ${his} belly like that,"`));
		} else if (eventSlave.face < 10) {
			r.push(Spoken(newSlaves[0], `"What a fugly slut,"`));
		} else {
			r.push(Spoken(newSlaves[0], `"What a dirty slut,"`));
		}
		r.push(`says a third.`, Spoken(newSlaves[0], `"No wonder people won't pay to have sex with you. I bet your Master put you out here because he hates you."`));

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Tolerating verbal abuse is part of a public servant's job`, verbal),
			new App.Events.Result(`Enslave them all`, enslave, `This option will cost ${cashFormat(25000)}`),
		]);

		function verbal() {
			r = [];

			r.push(`You inform your personal assistant that you aren't planning to take any action. If you took notice every time a citizen offered a slave on public duty any insult, you'd never be doing anything else. The only interesting part of the interaction was the possible value of the pretty girls, but enslaving them would likely have been difficult and expensive, given their families' probable wealth and influence. As for ${eventSlave.slaveName}, ${he}'s not deeply affected.`);
			if (eventSlave.energy > 95) {
				r.push(`${He}'s so horny that petty insults can't compete for ${his} attention with ${his} constant, oppressive need to get off.`);
			} else if (eventSlave.trust > 95 && eventSlave.devotion >= -20) {
				r.push(`${He}'s confident that ${he}'s a good slave, no matter what some visitors from outside the arcology say.`);
			} else if (eventSlave.trust > 95) {
				r.push(`It just gives ${him} more of a reason to work against you.`);
			} else if (eventSlave.devotion > 20) {
				r.push(`${He} tells ${himself} that they were wrong, and carries on.`);
			} else {
				r.push(`It's not like the unhappy slave doesn't tell ${himself} much worse things.`);
			}
			return r;
		}

		function enslave() {
			const frag = document.createDocumentFragment();
			r = [];

			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, [eventSlave, ...newSlaves], [eventSlave.clothes, "no clothing", "no clothing", "no clothing"]);
			for (const slave of newSlaves) {
				newSlave(slave);
				cashX(forceNeg(8333), "slaveTransfer", slave);
			}

			r.push(`You seize a tablet and hurry out of your office, working furiously and using every feature of ${V.assistant.name} to the utmost. These bitches have offended you, and you quickly frame the structure of an appropriate revenge. By the time you get to where ${eventSlave.slaveName} is still being heckled by spoiled, drunken harpies, everyone else present in that arcology hall has mysteriously received urgent messages and gone elsewhere. ${eventSlave.slaveName}`);
			if (canSee(eventSlave)) {
				r.push(`sees you approach, and stares at you,`);
			} else {
				r.push(`recognizes your dominant footsteps approaching, and turns to face you,`);
			}
			r.push(`${his} sudden intense look alerting your vile little guests to your presence. One of them attempts to frame an insult for the interloper, but one of ${his2} friends pokes ${him2} in the side and whispers something in ${his2} ear and ${he2} goes silent, staring at you with wide eyes.`);
			if (V.PC.title !== 1) {
				r.push(`${He2} then winces, visibly realizing that you're likely aware that ${he2} called ${eventSlave.slaveName}'s owner ${his} "Master". Somehow, the mistake seems important to ${him2} now that you're standing here, effortlessly dominating the space for all your femininity.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You hold the tablet out to them wordlessly. It's displaying security footage of the three of them, boarding a public VTOL transport for another arcology nearby. The prominent timestamp is thirty minutes in the future. The scene changes, showing them partying in one of that arcology's nightclubs. You clear your throat, dragging their attention away from the counterfeited footage, and describe in detail the other evidence — tickets, identification checks, biometrics — that will prove they left your arcology and visited two others before regrettably disappearing. One of them tries, with utter predictability, to threaten you with ${his2} father, but you tell ${him2} bluntly that if he does make the effort, he'll be looking in the wrong place.`);
			App.Events.addParagraph(frag, r);
			r = [];

			r.push(Spoken(newSlaves[1], `"We shouldn't have come here,"`), `one of them says dully. ${He3}'s wrong in that they would have had no trouble at all if they hadn't offended you, but right in that here, they put themselves entirely under your power. Tourists would never visit if this were widely known, but fortunately, you've been successful at concealing this. They begin to cry, and then to beg, and then the drones bag them and take them away.`);

			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, [
				new App.Events.Result(`Let your public servant take revenge on them`, revenge),
			]);
			return frag;

			function revenge() {
				const frag2 = document.createDocumentFragment();
				r = [];

				r.push(`Although they don't know it, your trio of new captures escape the usual choice of introductions to life among your sex slaves. In order to ensure that their fate has been properly obscured, you keep them in confinement for a while. After that, the usual beautification your slaves undergo will eliminate any possibility of their being recognized, even on public duty. That doesn't mean they have it easy, though. You delegate ${eventSlave.slaveName} to break them in, letting ${him} visit each of them whenever ${he} wants and treat them however ${he} wants.`);
				if ((eventSlave.energy > 95) || (eventSlave.devotion > 50)) {
					r.push(`${He} approaches the task`);
					if (eventSlave.energy > 95) {
						r.push(`eagerly, seeing it as an opportunity to sate ${his} urges`);
					} else {
						r.push(`dutifully, seeing it as ${his} responsibility to break them well for you`);
					}
					r.push(`as well as to get some petty revenge.`);
					switch (eventSlave.fetish) {
						case "submissive":
							r.push(`${He}'s a sub, but this actually means that ${he} can do a reasonable dom impression when ${he} works at it. ${He} certainly has experience with what works, even if it's from the other side. The erstwhile rich girls are required to kiss ${his} feet, literally.`);
							break;
						case "cumslut":
							r.push(`As a cumslut, ${he} derives considerable enjoyment from seeing others drink ejaculate, too. In this case, ${he} enjoys forcing the erstwhile rich girls to choke down liters of the stuff.`);
							break;
						case "humiliation":
							r.push(`${He} can't publicly humiliate them, since that would defeat the whole purpose of sequestering them until the trail goes really cold. Unfortunately for them, that doesn't stop ${him} from humiliating them to each other, and ${he} forces them to perform various sex acts on ${him} while the others watch.`);
							seX(newSlaves[0], "oral", eventSlave, "penetrative", 10);
							seX(newSlaves[1], "oral", eventSlave, "penetrative", 10);
							seX(newSlaves[2], "oral", eventSlave, "penetrative", 10);
							V.oralTotal += 30;
							break;
						case "buttslut":
							r.push(`${He} has a one track mind, and that track is anal sex. So, ${he} assrapes them, enjoying their sobbed apologies while ${he}`);
							if (canPenetrate(eventSlave)) {
								r.push(`fills their backdoors with ${his} cum.`);
							} else {
								r.push(`uses a dildo on them.`);
							}
							seX(newSlaves[0], "anal", eventSlave, "penetrative", 10);
							seX(newSlaves[1], "anal", eventSlave, "penetrative", 10);
							seX(newSlaves[2], "anal", eventSlave, "penetrative", 10);
							break;
						case "boobs":
							r.push(`${He} forces them to`);
							if (eventSlave.nipples === "fuckable") {
								r.push(`eat out ${his} nipples,`);
							} else if (eventSlave.lactation > 0) {
								r.push(`nurse from ${him},`);
							} else {
								r.push(`suck ${his} nipples until ${he} orgasms,`);
							}
							r.push(`mostly for how much ${he} enjoys the sensation, but also for the revulsion it produces.`);
							seX(newSlaves[0], "oral", eventSlave, "mammary", 10);
							seX(newSlaves[1], "oral", eventSlave, "mammary", 10);
							seX(newSlaves[2], "oral", eventSlave, "mammary", 10);
							if (eventSlave.lactation > 0) {
								eventSlave.lactationDuration = 2;
								eventSlave.boobs -= eventSlave.boobsMilk;
								eventSlave.boobsMilk = 0;
							} else {
								r.push(induceLactation(eventSlave, 5));
							}
							break;
						case "pregnancy":
							r.push(`${He} doesn't have permission to impregnate them, but they don't know that, and ${he} lies shamelessly.`);
							if (canPenetrate(eventSlave)) {
								r.push(`They beg ${him} not to cum inside them, but ${he} does anyway,`);
							} else {
								r.push(`${He} uses a strap-on with a reservoir to fill them with cum,`);
							}
							r.push(`and they cry themselves to sleep every night.`);
							seX(newSlaves[0], "vaginal", eventSlave, "penetrative", 10);
							seX(newSlaves[1], "vaginal", eventSlave, "penetrative", 10);
							seX(newSlaves[2], "vaginal", eventSlave, "penetrative", 10);
							break;
						case "dom":
							r.push(`${He} prizes the opportunity to be dominant, and makes the most of it. Rather than doing something pedestrian like force them to fuck ${him}, ${he} forces them to fuck each other, punishing them for hesitation until they're eating each other out even while they cry.`);
							seX(newSlaves[0], "oral", eventSlave, "penetrative", 20);
							seX(newSlaves[1], "oral", eventSlave, "penetrative", 20);
							seX(newSlaves[2], "oral", eventSlave, "penetrative", 20);
							break;
						case "sadist":
							r.push(`Their tears aren't a means for ${him}; they're an end. ${He} extracts them with greed, enjoying the sensation of being`);
							if (eventSlave.dick > 0) {
								r.push(`sucked off`);
							} else if (eventSlave.vagina === -1) {
								r.push(`rimmed`);
							} else {
								r.push(`eaten out`);
							}
							r.push(`by one sobbing rich bitch while ${he} forces another to spank ${his3} friend's pussy.`);
							seX(newSlaves[0], "oral", eventSlave, "penetrative", 20);
							seX(newSlaves[1], "oral", eventSlave, "penetrative", 20);
							seX(newSlaves[2], "oral", eventSlave, "penetrative", 20);
							break;
						case "masochist":
							r.push(`As a masochist, ${he}'s naturally inclined to be on the receiving end, but in this case ${he} makes an exception for the sake of justice. And it's to ${his} victims' anguish that ${he} does, because ${he} knows pain like a lover, and inflicts it in excruciating crescendos without leaving a single mark.`);
							break;
					}
					r.push(`The horrible experience is certainly educational for your new slaves, and ${eventSlave.slaveName} is well pleased. Tolerating insults is part of being a public slave, but getting this opportunity to take ${his} pent-up frustrations out on some deserving targets is a trust building exercise for ${him}. It seems their insults really did upset ${him}.`);
					newSlaves[0].trust -= 4;
					newSlaves[1].trust -= 4;
					newSlaves[2].trust -= 4;
					eventSlave.devotion += 5;
					eventSlave.trust += 5;
				} else {
					r.push(`${He} obeys, but isn't so far gone into sexual slavery that ${he}'s willing to really throw ${himself} into the task. ${His} visits are terrifying enough, though. Simply seeing their own likely futures reflected in ${him} is usually enough to leave your new slaves crying themselves to sleep.`);
				}
				App.Events.addParagraph(frag2, r);
				return frag2;
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canMove,
				s => s.devotion >= -20,
				s => (canDoAnal(s) || canDoVaginal(s)),
				s => s.lactation > 1,
				s => s.boobs > 500
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`${eventSlave.slaveName} is implanted with slow-release lactation drugs. ${His} lactation is dissimilar to that of a normal mother. It's the same stuff, but it's produced at a much, much higher volume. To stay comfortable,`,
			contextualIntro(V.PC, eventSlave, true),
			`has to use milkers every couple of`
		);
		if (eventSlave.assignment !== Job.MILKED) {
			r.push(`hours even though ${he} isn't assigned to give milk as ${his} primary job.`);
		} else {
			r.push(`hours.`);
		}
		r.push(`Any more than that, and ${he} gets painfully sore; any less than that, and`);
		if (eventSlave.nipples === "inverted" || eventSlave.nipples === "fuckable") {
			r.push(`${his} ${milkFlavor(eventSlave)}milk, backed up behind ${his} ${eventSlave.nipples} nipples, leaves ${him} in agony.`);
		} else {
			r.push(`${he} begins to spontaneously squirt cream whenever ${his} breasts are subjected to the slightest motion.`);
		}
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`${He} constantly passes by your desk as you work, going back and forth between the milkers and ${his} other tasks. Even if you didn't know which was which, it would be easy to tell which way ${he} was going. One way, ${he}`);
		if (!canWalk(eventSlave)) {
			r.push(`crawls`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`totters`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`waddles`);
		} else {
			r.push(`walks`);
		}
		if (hasAnyArms(eventSlave)) {
			r.push(`gingerly, supporting ${his} udders with`);
			if (hasBothArms(eventSlave)) {
				r.push(`both hands`);
			} else {
				r.push(`${his} hand`);
			}
			if (eventSlave.belly >= 10000) {
				r.push(`and ${his} ${belly}`);
				if (eventSlave.belly >= 3000) {
					r.push(`pregnant`);
				} else {
					r.push(`rounded`);
				}
				r.push(`belly`);
			}
		} else {
			r.push(`gingerly, doing everything in ${his} limited capacity to keep them steady`);
		}
		r.push(r.pop() + ",");
		if (eventSlave.nipples === "inverted") {
			r.push(`wincing`);
		} else {
			r.push(`dribbling a little bit of ${milkFlavor(eventSlave)}milk`);
		}
		r.push(`as ${he} goes. The other way, ${he} has a distinctly relieved expression and ${his} breasts are much saggier.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Have some fun with ${him} once ${he}'s using the milkers`, fun, virginityWarning()),
			new App.Events.Result(`Delay ${his} milking and then fuck ${him} in public`, fuck, virginityWarning()),
			(eventSlave.nipples === "inverted" || eventSlave.nipples === "partially inverted" || eventSlave.nipples === "fuckable")
				? new App.Events.Result(`Delay ${his} milking and torture ${him} with the pressure`, torture, virginityWarning())
				: new App.Events.Result(),
		]);

		function fun() {
			r = [];
			r.push(`${eventSlave.slaveName} is face-down on a special bench much like one used for massages,`);
			if (eventSlave.belly >= 1500) {
				r.push(`though with a hole for ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant belly`);
				} else if (eventSlave.bellyImplant >= 3000) {
					r.push(`implant-filled belly`);
				} else {
					r.push(`${eventSlave.inflationType}-filled belly`);
				}
				r.push(`to fit into,`);
			}
			r.push(`with ${his} breasts hanging down so the milkers can work away at ${his} nipples. As such, ${his} back and ass are on display as ${he} grunts and groans with relief. ${He} starts at your hand on ${his} back but`);
			if (eventSlave.devotion > 20) {
				r.push(`quickly`);
			} else {
				r.push(`slowly`);
			}
			r.push(`relaxes.`);
			if (canDoVaginal(eventSlave)) {
				r.push(`The stimulation of the milking has ${him} soaking wet, and ${he} whimpers with pleasure as you enter ${his} sopping pussy. ${He}'s so wet that ${his} plentiful vaginal secretions make it`);
				if (canDoAnal(eventSlave)) {
					r.push(`very easy for you to switch`);
					if (V.PC.dick === 0) {
						r.push(`your strap-on`);
					} else {
						r.push(`your dick`);
					}
					r.push(`to the cow's butt.`);
					r.push(VCheck.Both(eventSlave, 1));
				} else {
					r.push(`clear that ${he} needs a second round.`);
					r.push(VCheck.Vaginal(eventSlave, 2));
				}
			} else if (eventSlave.chastityVagina) {
				r.push(`This milk cow's vagina is protected by a chastity belt, but ${his} butthole isn't. You fuck it`);
				if (V.PC.dick === 0) {
					r.push(`with a strap-on`);
				}
				r.push(`instead as ${he} bucks and grinds against the chair.`);
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				r.push(`Perversely, this milk cow has no pussy, so you spit on ${his} ass and sodomize ${him}`);
				if (V.PC.dick === 0) {
					r.push(`with a strap-on`);
				}
				r.push(`instead as ${he} bucks and grinds against the chair.`);
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.push(`When ${he} comes, the milkers detect ${his} orgasm to your fucking and shunt the ${milkFlavor(eventSlave)}milk into different reservoirs. Though you've never been able to taste much difference, there's a belief out there that 'milk-cum', the squirts of milk a slave milk ${girl} produces when climaxing with ${his} ${getWrittenTitle(eventSlave)}, have special aphrodisiac powers. It can be sold at a special premium. Naturally, ${his} devotion to you has also increased.`);
			cashX(100, "event", eventSlave);
			eventSlave.devotion += 4;
			return r;
		}

		function fuck() {
			r = [];
			r.push(`${eventSlave.slaveName} obeys`);
			if (eventSlave.devotion > 20) {
				r.push(`without hesitation`);
			} else {
				r.push(`hesitantly`);
			}
			r.push(`when you order ${him} to kneel next to your desk the next time ${he} tries to go to the milkers. ${His} equanimity is severely tested over the next hours as you ignore ${him}. The occasional glance at ${him} shows ${him} growing increasingly frantic as ${his} breasts grow heavier and ${his} nipples`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`get prouder.`);
			} else {
				r.push(`begin to prolapse.`);
			}
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 1.33) {
				r.push(`Soon, ${his}`);
				if (eventSlave.pregType > 1) {
					r.push(`children's`);
				} else {
					r.push(`child's`);
				}
				r.push(`kicking is forcing ${milkFlavor(eventSlave)}milk out of ${his} swollen breasts.`);
			}
			r.push(`Eventually, the slight rising and falling of ${his} ribcage as ${he} inhales and exhales induces enough motion in ${his} overfull breasts that ${milkFlavor(eventSlave)}milk spurts out of ${him} with each breath. Satisfied that ${he}'s ready, you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`lead the whimpering, dripping slave out to a public street. Here, you hold ${him} upright so you can fuck ${him} standing. When ${he} finally comes through the pain of ${his} overfull udders, you reach forward and squeeze them. Making ${him} ${!canTalk(eventSlave) ? "silently" : ""} scream in pain and relief as ${he} sprays jets of ${milkFlavor(eventSlave)}milk. ${He} continually experiences aftershock orgasms as you continue pounding. You offer ${his} breasts to the growing crowd, many of whom come forward to taste ${his} cream.`);
			if (!canDoVaginal(eventSlave)) {
				r.push(`You fuck ${his} butt until they've sucked ${him} empty.`);
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				if (!canDoAnal(eventSlave)) {
					r.push(`You fuck ${his} pussy until they've sucked ${him} empty.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(`You fuck ${his} pussy and ass, one after the other, until they've sucked ${him} empty.`);
					r.push(VCheck.Both(eventSlave, 1));
				}
			}
			r.push(`<span class="devotion inc">${His} submission to you has increased</span> and the <span class="reputation inc">public certainly appreciated the service.</span>`);
			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			return r;
		}

		function torture() {
			r = [];
			r.push(`${eventSlave.slaveName} obeys`);
			if (eventSlave.devotion > 20) {
				r.push(`without hesitation`);
			} else {
				r.push(`hesitantly`);
			}
			r.push(`when you order ${him} to kneel next to your desk the next time ${he} tries to go to the milkers. ${His} devotion is severely tested over the next hours as you ignore ${him}. The occasional glance at ${him} shows ${him} growing increasingly frantic as ${his} breasts grow heavier and ${his} inverted nipples, which prevent any release of pressure without the strong suction of the`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`milkers to protrude them,`);
			} else {
				r.push(`milkers,`);
			}
			r.push(`grow more tender. Eventually, ${he} loses all composure and begins to beg you abjectly to give ${his} relief.`);
			if (canSee(eventSlave)) {
				r.push(`Your cruel smile`);
			} else if (canHear(eventSlave)) {
				r.push(`Your cruel snickers`);
			} else {
				r.push(`Your cruel prodding`);
			}
			r.push(`at the kneeling ${girl} with tears streaming down ${his} ${eventSlave.skin} cheeks fills ${him} with anticipatory horror. You tell ${him} to get on ${hasAnyArms(eventSlave) ? "all fours" : "the floor"} like the`);
			if (eventSlave.pregKnown === 1) {
				r.push(`pregnant`);
			}
			r.push(`cow ${he} is.`);
			if (eventSlave.belly >= 750000) {
				r.push(`${He} is so horribly`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				} else {
					r.push(`bloated`);
				}
				r.push(`that it is a struggle just to shift onto ${his} ${belly} stomach in the hope that ${he} can even reach the floor with all ${hasAnyArms(eventSlave) ? "four" : `${his}`} limbs. Even worse, ${his} efforts are absolutely agonizing to ${his} engorged breasts; when ${he} finally does get onto the mass that is ${his} middle, the sudden shift of ${his} breasts causes ${him} to shriek with pain.`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`${He} has to crawl onto ${his} ${belly} stomach to even get all ${hasAnyArms(eventSlave) ? "four" : `${his}`} limbs on the ground. The drastic shifting of ${his} breasts is agonizing and ${he} shrieks in spite of ${himself}.`);
			} else if (eventSlave.belly >= 100000) {
				r.push(`${He} slowly does, ${his} ${belly} stomach coming to rest on the floor beneath ${him}, but the simple movement is agonizing and seems to last forever causing ${him} to shriek in spite of ${himself}.`);
			} else if (eventSlave.belly >= 10000) {
				r.push(`${He} gingerly does, taking care to give ${his} ${belly} stomach room, but the simple movement is agonizing and seems to last forever causing ${him} to shriek in spite of ${himself}.`);
			} else {
				r.push(`${He} does, but the simple movement is agonizing and ${he} shrieks in spite of ${himself}.`);
			}
			r.push(`You slide`);
			if (V.PC.dick !== 0) {
				r.push(`your turgid cock`);
			} else {
				r.push(`a big strap-on`);
			}
			r.push(`into ${him} and seize ${him} by ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`extremely well padded`);
			} else if (eventSlave.weight > 95) {
				r.push(`well padded`);
			} else if (eventSlave.weight > 30) {
				r.push(`chubby`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.weight >= -30) {
				r.push(`trim`);
			} else {
				r.push(`skinny`);
			}
			r.push(`hips. ${He} knows what's coming and tries to ready ${himself}, but as you begin to pound ${him} without mercy, the motion of ${his} breasts forces a huge sobbing scream out of ${him}.`);
			if (canTalk(eventSlave)) {
				r.push(Spoken(eventSlave, `"Please, ${Master}! AAAH! It hurts! It AAAH hurtss- so b-baAAAH!"`));
			}
			r.push(`It hurts so badly, in fact, that ${he} doesn't seem to notice what you're doing to ${his} lower half, other than the motion it produces in ${his} upper half. Amused by the realization,`);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(`you pull your`);
				if (V.PC.dick !== 0) {
					r.push(`dick`);
				} else {
					r.push(`phallus`);
				}
				r.push(`out of ${him} and shove it up ${his} butthole without warning.`);
			} else {
				r.push(`you insert a couple of fingers alongside your`);
				if (V.PC.dick !== 0) {
					r.push(`dick.`);
				} else {
					r.push(`phallus.`);
				}
			}
			r.push(`${He} just goes on ${canTalk(eventSlave) ? "screaming" : "complaining"} about how much ${his} boobs hurt. Eventually, you tire of ${his} bellowing, so you reach around and pop`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`${his} nipples out one by one.`);
			} else {
				r.push(`finger into each nipple.`);
			}
			r.push(`The ${canTalk(eventSlave) ? "shrieking" : "whining"} reaches a paroxysm, but once they're`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`protruded,`);
			} else {
				r.push(`opened,`);
			}
			r.push(`the ${milkFlavor(eventSlave)}milk begins to jet out of ${him} in a pair of uninterrupted streams. ${He} collapses forward onto ${his} face, crying with relief as the pain in ${his} breasts recedes. As it does, ${he} finally begins to notice`);
			if (canDoAnal(eventSlave)) {
				r.push(`the pain in ${his} backdoor as you continue to abuse`);
				if (eventSlave.anus === 0) {
					eventSlave.anus++;
					r.push(`it, and that ${he} is <span class="virginity loss">no longer an anal virgin.</span>`);
				} else {
					r.push(`it.`);
				}
				if (canDoVaginal(eventSlave) && eventSlave.vagina === 0) {
					eventSlave.vagina++;
					r.push(`${He}'ll eventually realize that ${his} <span class="virginity loss">virginity was taken</span> while ${he} was distracted by ${his} breasts.`);
				}
				r.push(VCheck.Both(eventSlave, 1));
			} else {
				r.push(`the pain in ${his} cunt as you continue to abuse`);
				if (eventSlave.vagina === 0) {
					eventSlave.vagina++;
					r.push(`it, and that ${he} is <span class="virginity loss">no longer a virgin.</span>`);
				} else {
					r.push(`it.`);
				}
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			eventSlave.trust -= 4;
			return r;
		}

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


code:
App.Events.RESSMindbrokenMorning = class RESSMindbrokenMorning extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.weatherToday.severity < 3
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish === Fetish.MINDBROKEN,
				canWalk,
				s => s.clothes !== "a Fuckdoll suit",
				isFaceVisible
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {His, He, he, his, him, himself} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave);

		let r = [];

		r.push(`It's a sunny morning, with rare mild weather, and you're stuck at your desk, as usual. After the typical rush of slaves clears the kitchen after the breakfast hour, you see one peel off to stand out on a balcony for a moment with the light on ${his} face. You pay little attention to such a trifle, but then notice that it's`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "."));
		App.Events.addParagraph(node, r);
		r = [];

		r.push(`You head out and find that ${he}'s looking up at the sun with ${his} ${App.Desc.eyesColor(eventSlave)} closed, letting the warmth and light envelop ${his}`);
		if (eventSlave.face > 95) {
			r.push(`incredible`);
		} else if (eventSlave.face > 40) {
			r.push(`gorgeous`);
		} else if (eventSlave.face > 10) {
			r.push(`pretty`);
		} else {
			r.push(`homely`);
		}
		if (eventSlave.belly >= 5000) {
			r.push(`face and taut, ${belly} dome of a belly`);
		} else {
			r.push(`face.`);
		}
		r.push(`${He} hasn't gotten completely ready for ${his} day yet, and ${his} ${eventSlave.skin} skin is clean and quite bare. Despite ${his} small remaining mental capacity, it seems ${he}'s still capable of the minor pleasure of enjoying the sunlight. It is very probably the only enjoyable thing ${he}'ll register today.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} be`, leave),
			(canDoVaginal(eventSlave) || canDoAnal(eventSlave))
				? new App.Events.Result(`See if an orgasm will cheer ${him} up`, orgasm, virginityWarning())
				: new App.Events.Result(),
		]);

		function leave() {
			if (eventSlave.relationship === -3) {
				if (eventSlave.kindness) {
					eventSlave.kindness += 2;
				} else {
					eventSlave.kindness = 2;
				}
			}
			return `Satisfied that there's no need for immediate intervention, you head back to your desk. A few minutes later, ${he} heads in to finish getting ready and get to work, saving ${V.assistant.name} the necessity of directing ${him}. As the broken slave passes your office, you think for a moment that you see a bit of moisture glinting in ${his} eyes, but soon correct yourself: it's just a reflection from the glass walls of the arcology. ${He} makes it to ${his} assignment on time, and no one notices anything unusual about ${him} today.`;
		}

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

		function orgasm() {
			r = [];
			r.push(`You`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`slide your hands around ${his}`);
			if (eventSlave.belly >= 150000) {
				r.push(`${belly} distended`);
			} else if (eventSlave.weight > 95) {
				r.push(`fat`);
			} else if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy-swollen`);
				} else if (eventSlave.bellyImplant >= 3000) {
					r.push(`implant-swollen`);
				} else {
					r.push(`${eventSlave.inflationType}-bloated`);
				}
			} else if (eventSlave.weight > 30) {
				r.push(`pudgy`);
			} else if (eventSlave.waist < -95) {
				r.push(`cartoonishly narrow`);
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped`);
			} else if (eventSlave.waist < -10) {
				r.push(`wasp`);
			} else if (eventSlave.weight > 10) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else if (eventSlave.weight >= -10) {
				r.push(`trim`);
			} else {
				r.push(`skinny`);
			}
			r.push(`waist, feeling the warmth of ${his} skin, and gently step forward until ${he}'s between you and the balcony railing. ${He} is silently obedient, not reacting at all other than to obey your direction as to where ${he} should go. For example, when ${he} feels`);
			if (V.PC.dick === 0) {
				r.push(`the phallus`);
			} else {
				r.push(`your hardening dick`);
			}
			r.push(`pressing against ${him}, ${he}`);
			if (eventSlave.height >= 170) {
				r.push(`unconsciously bends forward a little and cocks ${his} hips to position ${himself}`);
			} else {
				r.push(`rises up on the balls of ${his} feet to bring ${his} short body up to the right height`);
			}
			if (canDoVaginal(eventSlave)) {
				r.push(`for penetration. ${His}`);
				if (eventSlave.vagina > 2) {
					r.push(`loose cunt`);
				} else if (eventSlave.vagina > 1) {
					r.push(`pussy`);
				} else {
					r.push(`tight little pussy`);
				}
				r.push(`is already moist in expectation, making entry easy.`);
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(`for anal. ${He} relaxes ${his}`);
				if (eventSlave.anus > 2) {
					r.push(`loose anus`);
				} else if (eventSlave.anus > 1) {
					r.push(`asshole`);
				} else {
					r.push(`tight little asshole`);
				}
				r.push(`completely, making entry easy.`);
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.push(`Your hands rove, teasing ${his} ${eventSlave.nipples} nipples,`);
			if (eventSlave.boobs > 1000) {
				r.push(`hefting ${his} heavy tits,`);
			} else if (eventSlave.boobs > 300) {
				r.push(`squeezing ${his} healthy breasts,`);
			} else {
				r.push(`pressing ${him} flat chest,`);
			}
			if (eventSlave.belly >= 1500) {
				r.push(`massaging ${his} rounded`);
				if (eventSlave.belly > 10000) {
					r.push(`belly and fondling ${his} popped navel.`);
				} else {
					r.push(`belly.`);
				}
			} else {
				r.push(`and`);
				if (eventSlave.weight > 130) {
					r.push(`groping ${his} huge gut.`);
				} else if (eventSlave.weight > 95) {
					r.push(`groping ${his} fat belly.`);
				} else if (eventSlave.muscles > 30) {
					r.push(`fondling ${his} abs.`);
				} else if (eventSlave.weight > 10) {
					r.push(`groping ${his} plush belly.`);
				} else {
					r.push(`fondling ${his} flat stomach.`);
				}
			}
			r.push(`${His} face is complacent and unaffected even as ${his} body responds,`);
			if (eventSlave.chastityPenis === 1) {
				r.push(`since ${his} body is used to its caged cock being neglected in favor of ${his}`);
				if (eventSlave.vagina > -1) {
					r.push(`pussy.`);
				} else {
					r.push(`asspussy.`);
				}
			} else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100) {
				r.push(`${his} useless dick sporting a drop of precum.`);
			} else if (eventSlave.dick > 0 && (eventSlave.balls === 0 || eventSlave.ballType === "sterile")) {
				r.push(`${his} soft dick twitching feebly.`);
			} else if (eventSlave.dick > 4) {
				r.push(`${his} giant penis protruding through a gap in the railing.`);
			} else if (eventSlave.dick > 2) {
				r.push(`${his} penis pressing hard against the railing.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${his} pathetic hard-on barely protruding from between ${his} thighs.`);
			} else if (eventSlave.clit > 0) {
				r.push(`${his} huge clit stiff under a brush from your fingers.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`${his} asspussy ready and relaxed under a brush from your fingers.`);
			} else {
				r.push(`${his} pussy warm and wet under a brush from your fingers.`);
			}
			r.push(`Even ${his} eventual orgasm is entirely mechanical, a simple tightening of ${his}`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina > 2) {
					r.push(`gaping cunt,`);
				} else if (eventSlave.vagina > 1) {
					r.push(`traveled pussy,`);
				} else {
					r.push(`tight vagina,`);
				}
			} else {
				if (eventSlave.anus > 2) {
					r.push(`gaping`);
				} else if (eventSlave.anus > 1) {
					r.push(`loosened`);
				} else {
					r.push(`tight`);
				}
				r.push(`sphincter,`);
			}
			r.push(`a gasp of air into ${his} lungs, and a slight shiver. There is a flaw at the corner of ${his} mouth that might be transitory pleasure, but a look`);
			if (canSee(eventSlave)) {
				r.push(`into ${his}`);
				if (hasBothEyes(eventSlave)) {
					r.push(`eyes`);
				} else {
					r.push(`eye`);
				}
			} else {
				r.push(`at ${his} face`);
			}
			r.push(`confirms that it is not so.`);
			return r;
		}
	}
};