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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => s.assignment !== "work as a servant",
				s => canDoAnal(s) || canDoVaginal(s),
				s => s.butt < 3,
				s => s.boobs < 500,
				s => s.weight <= 10,
				s => s.muscles <= 30,
				s => s.trust >= -20,
				s => s.devotion > 20,
				s => s.devotion <= 50
			]
		];
	}

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

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

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		if (eventSlave.bellyPreg >= 1500) {
			t.push(`is nice and slim as ${he} can be given ${his} pregnancy,`);
		} else if (eventSlave.bellyImplant >= 1500) {
			t.push(`is nice and slim as ${he} can be given the implant rounding out ${his} middle,`);
		} else if (eventSlave.bellyFluid >= 1500) {
			t.push(`is nice and slim as ${he} can be given the amount of ${eventSlave.inflationType} distending ${his} middle,`);
		} else {
			t.push("is nice and slim,");
		}
		t.push(`with a trim chest, narrow hips and not much of an ass to speak of. Despite the myriad ways a Free Cities slaveowner can give his property tits and asses, you've held off for now, keeping ${him} lithe.`);
		if (canMove(eventSlave)) {
			if (hasAnyArms(eventSlave)) {
				t.push(`${He} comes before you for a routine nude inspection, obediently ${canStand(eventSlave) ? "standing" : "kneeling"} before your desk with ${his} ${hasBothArms(eventSlave) ? "hands crossed" : "hand placed"}`);
				if (eventSlave.belly >= 30000) {
					t.push(`atop ${his} ${belly} stomach.`);
				} else if (eventSlave.belly >= 1500) {
					t.push(`over ${his} rounded stomach.`);
				} else {
					t.push(`over ${his} flat stomach.`);
				}
			} else {
				t.push(`${He} comes before you for a routine nude inspection, obediently ${canStand(eventSlave) ? "standing" : "kneeling"} before your desk.`);
			}
		} else if (!hasAnyLegs(eventSlave)) {
			t.push(`Another slave strips ${him} and leaves ${his} naked torso on your desk for a routine inspection.`);
		} else {
			t.push(`Another slave helps ${him} in, aids in undressing ${him}, and leaves ${him} for your routine inspection.`);
		}
		t.push(`A perfectly devoted slave might display ${himself}, and a rebellious one might try to cover ${himself}: ${he}'s neither. `);
		if (eventSlave.dick > 0) {
			t.push(`Though ${he}'s not sexually aroused, ${his} cock is visible and contributes greatly to ${his} androgyny.`);
		} else if (eventSlave.vagina === -1) {
			t.push(`The smooth featureless skin between ${his} legs makes ${him} look like a doll, not a girl.`);
		} else {
			t.push(`${His} bare pussy completes the picture of simultaneous innocence and availability.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} get dressed and spend some quality time with ${him}`, dress, virginityWarning(1)),
			canDoAnal(eventSlave)
				? new App.Events.Result(`Dominate ${his} narrow ass`, dominate, virginityWarning(0))
				: new App.Events.Result()
		]);

		function dress() {
			t = [];

			t.push(`You let ${eventSlave.slaveName} don a nice dress and take ${him} out${!canWalk(eventSlave) ? ` in a wheelchair` : ``}. ${He}'s a little suspicious at first but when you reach the first balcony on your lazy route around the huge building the sun on ${his} face and the gentle breeze around ${his} ears convince ${him} there's no trick. ${He} watches you shyly as you lead ${him} around, soaking in the sights and relaxing. Though you still speak as ${his} ${getWrittenTitle(eventSlave)}, you chat about goings on around the arcology, and you buy ${him} a fresh fruit from a vendor. The unexpected show of care and compassion has ${him} quite agog. By the time you take ${him} out onto another park-like balcony and fuck ${him} on a bench,`);
			if (eventSlave.dick > 0 && eventSlave.chastityPenis === 1 && eventSlave.chastityAnus === 1) {
				t.push(`${his} combined chastity cage and anal chastity belt makes ${him} move awkwardly.`);
			} else if (eventSlave.dick > 0 && eventSlave.chastityPenis === 1) {
				t.push(`${his} chastity cage is dribbling precum, a sign ${he} wouldn't mind having to take it up the ass.`);
			} else if (eventSlave.dick > 0 && eventSlave.chastityAnus === 1) {
				t.push(`${his} dick is tenting the front of ${his} dress, through ${his} anal chastity belt.`);
			} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
				t.push(`${his} dick is tenting the front of ${his} dress and ${he}'s happy to take it up the ass.`);
			} else if (eventSlave.dick > 6) {
				t.push(`${he}'s happy to take it up the ass; there's even a steady stream of pre dripping from ${his} monstrous cock.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${he}'s happy to take it up the ass, though there's no sign of an erection from ${his} useless sissy dick.`);
			} else if (!canDoVaginal(eventSlave)) {
				t.push(`${he}'s obviously ready and willing to get buttfucked, even if ${his} body has no physically obvious way to show it off.`);
			} else {
				t.push(`${he}'s wet and ready and moans happily as you enter ${him}.`);
			}
			if (canDoVaginal(eventSlave)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			t.push(`There's no hesitation or fear at all on ${his} face when ${he} ${canSee(eventSlave) ? "sees" : "notices"} you're returning ${him} to your penthouse; ${his} trust in you has increased.`);

			eventSlave.trust += 4;
			return t;
		}

		function dominate() {
			t = [];

			t.push(`You make a show of examining ${him} with a critical air that makes ${him} aware of ${his} modest endowments. Finished, you announce in a serious tone that you're concerned that you can't tell if ${he}'s a girl, since girls have breasts and butts. ${eventSlave.belly >= 1500 ? `${He} should do something about that bulbous gut too, you mock.` : ""}`);
			if (!canTalk(eventSlave)) {
				t.push(`${He} protests wordlessly, gesturing desperately at ${himself}.`);
			} else {
				if (eventSlave.lips > 70) {
					t.push(`${He} protests through ${his} huge lips,`);
				} else if (eventSlave.piercing.lips.weight + eventSlave.piercing.tongue.weight > 2) {
					t.push(`${He} protests through ${his} piercings,`);
				} else {
					t.push(`${He} protests,`);
				}
				t.push(Spoken(eventSlave, `"${Master}, I'm a slave girl! Please, just look at me, ${Master}!"`));
			}
			t.push(`${canSee(eventSlave) ? "Shaking your head" : "Tutting"} with pretended doubt, you say that since you're not sure you'll have to make do. Your order ${him} to`);
			if (eventSlave.belly >= 300000) {
				t.push(`lean over ${his} ${belly} belly${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
			} else if (eventSlave.belly >= 5000) {
				t.push(`lean face-down into the couch cushions${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
			} else {
				t.push(`lie face-down on the couch${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
			}
			t.push(`${He} does doubtfully, only realizing what you intend when ${he} feels ${PC.dick === 0 ? "the strap-on" : "your dickhead"} forcing its way between ${his} narrow buttcheeks. ${He} whimpers and moans ${eventSlave.belly < 300000 ? "into the couch" : ""} as you roughly sodomize ${him}. It's true, ${he}'s pretty androgynous from this angle, especially while ${he} takes it up the butthole. ${He} has become more submissive to you, but there's some fear there, too.`);
			t.push(VCheck.Anal(eventSlave, 1));

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

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


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canMove,
				hasAnyArms,
				s => s.intelligence + s.intelligenceImplant < -50,
				s => s.devotion <= 50,
				s => s.devotion > -20 || s.trust < -20
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {HeA, heA} = getPronouns(assistant.pronouns().main).appendSuffix('A');
		const {say, title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;

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

		let t = [];

		t.push(`${capFirstChar(V.assistant.name)} breaks in on your work at your desk.`);
		t.push(App.UI.DOM.combineNodes(`"${V.assistant.personality <= 0 ? properTitle() : "Sweetheart"}," ${heA} says, "`, App.UI.DOM.slaveDescriptionDialog(eventSlave)));
		t.push("is having trouble figuring out the meal dispenser again.\"");
		if (V.assistant.personality <= 0) {
			t.push(`The report is deadpan, but ${heA} brings up a visual feed.`);
		} else {
			t.push(`${HeA} brings up a visual feed. "Poor baby!" ${heA} exclaims.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`Slaves are supposed to place a cup under a spigot, which detects the cup's presence and dispenses the appropriate nutrition for the ${girl}. Unfortunately this concept seems a little tough for ${eventSlave.slaveName}. With no one around to ask for help, ${he} has resorted to trying to suck food out of the spigot with ${his} mouth. With no cup to be detected, ${he}'s not getting very far, and is getting bitterly frustrated.`);
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} something more appropriate to suck on`, suck),
			new App.Events.Result(`Reassure ${him} and get ${him} to slow down`, reassure),
			new App.Events.Result(`Spank the stupid out of ${him}`, spank),
			V.arcade > 0
				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
				: new App.Events.Result()
		]);

		function suck() {
			t = [];

			t.push(`${capFirstChar(V.assistant.name)}, as usual, has to give the stupid slut considerable coaching to get ${him} to your office without getting lost. This is a near-miraculous imbecility, as the penthouse is expressly designed to make it nearly impossible to get anywhere from anywhere else without passing by the office door. ${He} understands orders to`);
			if (PC.dick === 0) {
				t.push(`perform cunnilingus, though, and gets down to it eagerly enough. When ${he} finishes the job, ${he} wipes ${his} mouth and then looks up at you doubtfully.`);
			} else {
				t.push(`suck a dick, though, and gets down to it eagerly enough. When ${he} finishes the job, ${he} busily swallows every drop of your ejaculate and then looks up at you doubtfully.`);
			}
			if (!canTalk(eventSlave)) {
				t.push(`${He} slowly spells out a question with ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"}, asking if ${he}'s a good slave.`);
			} else {
				t.push(`${He} mumbles a hesitant question:`);
				t.push(Spoken(eventSlave, `"${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}, am I a good slave?"`));
			}
			t.push(`You tell ${him} that ${he} is, running a hand ${eventSlave.hStyle.includes("bald") ? `across ${his} bald scalp` : `through ${his} hair`}. ${He} seems <span class="devotion inc">reassured,</span> and <span class="trust inc">thankful</span> when you give ${him} a cup of ${his} proper rations from your own hand.`);

			eventSlave.devotion += 2;
			eventSlave.trust += 2;
			seX(eventSlave, "oral", PC, "penetrative");
			return t;
		}

		function reassure() {
			t = [];

			t.push(`${He}'s so intent on trying to suck off the food dispenser that ${he} doesn't ${canHear(eventSlave) ? "hear" : "notice"} you enter the room. ${He} starts with surprise when you encircle ${his}`);
			if (eventSlave.belly >= 1500) {
				t.push(`${belly} ${eventSlave.bellyPreg >= 1500 ? "pregnant" : ""} belly`);
			} else {
				t.push("waist");
			}
			t.push(`with your arms and ${canHear(eventSlave) ? `murmur reassuringly in ${his} ear` : `give ${him} a reassuring squeeze`}.`);
			if (canTalk(eventSlave)) {
				t.push(`${He} ${say}s sadly,`);
				t.push(Spoken(eventSlave, `"Sorry ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}. I'm trying to be a good slave but it's hard."`));
			} else {
				t.push(`${He} sadly gestures at the spigot and then flicks ${his} own head.`);
			}
			t.push(`You kindly tell ${him} that you know ${he}'s trying, and that that's what really matters.`);
			if (canTalk(eventSlave)) {
				t.push(Spoken(eventSlave, `"Really, ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}?"`));
				t.push(`${he} asks hopefully.`);
			} else {
				if (hasBothArms(eventSlave)) {
					t.push(`${His} hands awkwardly ask, "Really?"`);
				} else {
					t.push(`${His} hand awkwardly asks, "Really?"`);
				}
			}
			t.push(`You whisper into ${his} ear that yes, ${he} will be all right as long as ${he} does ${his} best. ${He} wiggles ${his} butt against you a little and giggles`);
			if (PC.dick !== 0) {
				t.push(`at the responding stiffness ${he} feels between ${his} buttocks. ${He} shimmies down and takes you into ${his} mouth${PC.vagina > -1 ? ` and does ${his} best to reach the top of your pussy with the tip of ${his} tongue` : ""},`);
			} else {
				t.push(`as you shove ${him} to ${his} knees. ${He} shimmies down and eats you out,`);
			}
			t.push(`${canSee(eventSlave) ? "looking you in the eyes the whole time and" : ""} <span class="hotpink">smiling</span> as much as ${he} can manage with ${PC.dick !== 0 ? `a dick in ${his} mouth` : `${his} tongue working your clit`}.`);

			eventSlave.devotion += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			return t;
		}

		function spank() {
			t = [];

			t.push(`${He}'s so intent on trying to suck off the food dispenser that ${he} doesn't ${canHear(eventSlave) ? "hear" : "notice"} you enter the room. ${He} starts with surprise when you seize ${him} and push ${him}`);
			if (eventSlave.belly >= 300000) {
				t.push(`over ${his} ${belly} belly, face-down into the counter.`);
			} else {
				t.push(`face-down across the counter.`);
			}
			t.push(`After making ${him} confirm that ${canHear(eventSlave) ? `${he} can hear you` : `${he}'s paying attention`}, you patiently repeat the very simple instructions for getting meals from the kitchen. Then, you tell ${him} to repeat them. ${He} manages the first step fine and has completely forgotten the second. The moment ${he} hesitates, ${he} has an instant to ${canHear(eventSlave) ? "hear" : "feel"} the rush of air trying to get out of the way of your speeding palm before it contacts the ${eventSlave.skin} skin of ${his} buttocks. ${He} writhes and cries and promises to try harder, but ${his} poor rear end is almost raw before ${he} gets it all right. ${He} leaves the kitchen snuffling sadly to ${himself}, but in the coming days ${he} really does seem to do ${his} best to avoid another beating.`);

			eventSlave.trust -= 5;
			return t;
		}

		function arcade() {
			t = [];

			t.push(`${eventSlave.slaveName} screams and begs when ${he} realizes what ${his} punishment for being stupid is to be, but you are obdurate.`);
			if (eventSlave.muscles > 30) {
				t.push(`${His} powerful form has to be sedated for immurement in the arcade.`);
			} else if (eventSlave.weight >= 190) {
				t.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`);
			} else if (eventSlave.belly >= 120000) {
				t.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`);
			} else if (eventSlave.weight >= -10) {
				t.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`);
			} else if (eventSlave.belly >= 1500) {
				t.push(`${His} ${eventSlave.bellyPreg >= 3000 ? "pregnant" : `${belly}`} body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`);
			} else if (eventSlave.muscles < -15) {
				t.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`);
			} else {
				t.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`);
			}
			t.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} ${eventSlave.skin} butt as ${he} wriggles desperately against ${his} restraints.`);

			assignJob(eventSlave, "be confined in the arcade");
			eventSlave.sentence = 4;
			return t;
		}
	}
};

repo_name: Arkerthan/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => s.rules.release.masturbation !== 0,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				canDoAnal,
				s => s.devotion <= 50,
				s => s.devotion > 20 || s.trust < -20,
				s => s.vagina < 0,
				s => s.dick > 0,
				s => s.anus > 0,
				s => s.skill.anal <= 30
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const anusDesc = eventSlave.anus > 2 ? "gaping" : (eventSlave.anus > 1 ? "loose" : "tight");
		const PC = V.PC;

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`has been doing ${his} best to be a good slave ${girl} recently. Since ${he} doesn't have a pussy, that means ${he}'s been doing ${his} best to take it up the ass like a good slave. ${He} isn't all that used to it yet, but ${he} tries. ${He}'s trying right now, bent over the arm of the couch in your office with your ${PC.dick === 0 ? "vibrating strap-on" : "cock"} pumping in and out of ${him}. ${He} looks like ${he} wants to ask something, so you tell ${him} to spit it out.`);
		if (canTalk(eventSlave)) {
			if (eventSlave.lips > 70) {
				t.push(`${He} begs meekly through ${his} massive dick-sucking lips,`);
			} else if (eventSlave.piercing.lips.weight + eventSlave.piercing.tongue.weight > 2) {
				t.push(`${He} begs meekly through ${his} mouthful of piercings,`);
			} else {
				t.push(`${He} begs meekly,`);
			}
			t.push(`"${Spoken(eventSlave, `${Master}, may I please, please touch myself?`)}"`);
		} else {
			t.push(`${He} uses gestures to ask if ${he} can masturbate while you sodomize ${him}.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him}`, permit),
			new App.Events.Result(`Train ${him} to be a skilled anal bottom`, bottom),
			(eventSlave.fetish !== "buttslut" || eventSlave.fetishKnown !== 1) && eventSlave.prostate > 0
				? new App.Events.Result(`Train ${him} to orgasm anally`, orgasm)
				: new App.Events.Result()
		]);

		function permit() {
			t = [];

			t.push(`${He} moans with gratitude and relief. ${He} masturbates furiously as you continue to use ${his} butt. ${He} was clearly near the edge anyway, and`);
			if (eventSlave.balls > 0) {
				t.push("spatters the couch with cum");
			} else if (eventSlave.prostate > 0) {
				t.push("spatters the couch with ejaculate");
			} else {
				t.push("shakes with release");
			}
			t.push(`after just a few strokes of your ${PC.dick === 0 ? "strap-on" : "cock"} up ${his} butt. ${His} ${anusDesc} ass spasms and tightens with ${his} climax${PC.dick !== 0 ? ", a wonderful sensation" : ""}. You aren't finished with ${him}, but ${he} rubs ${himself} languidly and enjoys the hard anal reaming more than ${he} ever has previously. ${His} devotion to you has increased.`);
			t.push(VCheck.Anal(eventSlave, 1));

			eventSlave.devotion += 4;
			return t;
		}

		function bottom() {
			t = [];

			t.push(`${He} obeys your orders to keep ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} off ${his} dick, but can't hide ${his} disappointment and frustration. You keep a close watch on ${him}, and buttfuck ${him} every chance you get, teaching ${him} the finer points of taking a ${PC.dick === 0 ? "strap-on" : "dick"} up the butt. You focus entirely on your pleasure, teaching ${him} how to use ${his} ${anusDesc} anal ring to extract orgasms from cocks. This experience was hard for ${him} but has increased ${his} anal skill.`);
			t.push(VCheck.Anal(eventSlave, 9));

			slaveSkillIncrease('anal', eventSlave, 10);
			return t;
		}

		function orgasm() {
			t = [];

			t.push(`${He} obeys your orders to keep ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} off ${his} dick, but can't hide ${his} disappointment and frustration. You keep a close watch on ${him}, and fuck ${his} ${anusDesc} anus every chance you get, keeping ${him} desperately aroused and desperately sodomized. After some days of this, ${he} finally reaches a point of desperate arousal that permits ${him} to orgasm to prostate stimulation alone.`);
			if (fetishChangeChance(eventSlave) > jsRandom(1, 100)) {
				t.push(`Before ${he} realizes what's happening, <span class="lightcoral">${he}'s getting aroused at the thought of anal sex.</span>`);

				eventSlave.fetishStrength = 10;
				eventSlave.fetish = "buttslut";
				eventSlave.fetishKnown = 1;
			} else {
				t.push(`Despite being used as an anal slut for a whole week, ${he} was not significantly affected.`);
			}

			t.push(VCheck.Anal(eventSlave, 9));
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				canWalk,
				canTalk,
				s => s.devotion > 50,
				s => s.trust > 50,
				s => s.health.condition > 90,
				s => s.muscles > 5,
				s => s.weight >= -30,
				s => s.weight <= 30,
				s => s.health.tired <= 30
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push("As you manage your empire from your office, a constant traffic of slaves passes by its door. The glass walls allow a good view of them, and since you naturally own what you find appealing, the passing chattel often draws your eye. For example, this morning you notice");
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`almost bounce into view. ${He}'s physically fit, at a healthy weight,`);
		if (eventSlave.belly >= 10000) {
			if (eventSlave.bellyPreg >= 3000) {
				t.push(`heavily pregnant,`);
			} else if (eventSlave.bellyImplant >= 3000) {
				t.push(`despite ${his} ${belly} fake belly,`);
			} else {
				t.push(`completely full of ${eventSlave.inflationType},`);
			}
		}
		if (eventSlave.physicalAge > 35) {
			t.push(`and is getting such excellent modern medical care that despite ${his} age, ${he} has the energy of a teenager.`);
		} else if (eventSlave.physicalAge > 19) {
			t.push(`is full of youth and vigor, and is in truly perfect health due to the miracles of modern medicine.`);
		} else if (eventSlave.physicalAge > 12) {
			t.push(`and is a teenager, not to mention the perfect health ${he} owes to the miracles of modern medicine.`);
		} else {
			t.push(`and is a little ${girl}, not to mention the perfect health ${he} owes to the miracles of modern medicine.`);
		}
		if (eventSlave.energy > 95) {
			t.push(`Apart from ${his} absurd sex drive,`);
		} else if (eventSlave.energy > 40) {
			t.push(`In addition to ${his} very healthy libido,`);
		} else {
			t.push(`Despite ${his} mediocre libido,`);
		}
		t.push(`${he}'s overflowing with energy. ${He} half-runs, half-skips down the hallway, slowing in the doorway as ${he} feels your gaze. Without stopping, ${he} turns to meet your eyes, winks trustingly, and bursts out, "${Spoken(eventSlave, `Hi ${Master}! Love you!`)}" Then ${he} continues on ${his} merry way.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`Someone's a happy ${desc} today.`);
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Follow ${him}`, follow),
			new App.Events.Result(`Play with ${him}`, play),
			new App.Events.Result(`Punish ${him}`, punish)
		]);

		function follow() {
			t = [];

			t.push(`${His} sheer 'joie de vivre' is irresistible, and it certainly draws you out of your office. You're not slow, and of course you know where ${he}'s going, so you catch up quickly. ${He} gives you the careful measuring glance of a devoted sex slave who's checking whether ${his} owner wants to fuck ${him} right now, and correctly decides that that isn't your intent, at least right this minute. Instead, you continue the direction ${he} was going, and ${he} follows. "${Master}," ${he} ${say}s hesitantly, "I hope that was an okay thing for me to do." You assure ${him} it was. "Thanks, ${Master}," ${he} beams, grinning like an idiot. Smiling at ${his} infectious enthusiasm for life, you ask ${him} why ${he}'s so happy this morning. ${He} looks momentarily ${eventSlave.intelligence + eventSlave.intelligenceImplant > 50 ? `perplexed, not a common look for a slave as smart as ${him}` : "perplexed"}.`);
			t.push(`"${Spoken(eventSlave, `I don't know! I just woke up this morning feeling really, really good. ${eventSlave.intelligence + eventSlave.intelligenceImplant > 50 ? `I'm sure the fact that I'm benefiting from incredibly advanced medicine has something to do with it; thank you very much for that, ${Master}. Other than that,` : ""} I just feel happy.`)}" This has to be some sort of milestone for ${him}, and for you, and maybe for slavery in general: if ${he} can be this pleased with life, something must be going right. You walk ${him} to where ${he}'s going`);
			switch (eventSlave.assignment) {
				case "whore":
					t.push(`(one of the arcology's nicer streets, where ${he}'ll spend the day selling ${his} body),`);
					break;
				case "serve the public":
					t.push(`(one of the arcology's nicer streets, where ${he}'ll spend the day flirting with citizens and having sex with anyone that's willing),`);
					break;
				case "work a glory hole":
					t.push(`(a wall mounting that will render ${him} a helpless target for dicks all day),`);
					break;
				case "get milked":
					t.push(`(${his} favorite milker in the penthouse),`);
					break;
				case "take classes":
					t.push(`(a quiet area with a touchscreen where ${he} can review material from the slave etiquette class ${he}'s working on),`);
					break;
				case "please you":
					t.push(`(the wardrobe, where ${he}'ll get dressed before attending to you for the rest of the day),`);
					break;
				case "be a subordinate slave":
					t.push(`(the living area of the slave ${he}'s been assigned to serve),`);
					break;
				case "work as a servant":
				case "be a servant":
					t.push(`(the closet that contains the cleaning items ${he}'ll use to dust and polish the penthouse today),`);
					break;
				case "work as a nanny":
					t.push(`(${V.nurseryName}, where ${he} is tending to the children),`);
					break;
				case "stay confined":
					t.push(`(${his} cell),`);
					break;
				case "guard you":
					t.push(`(the armory where ${his} weapons are kept),`);
					break;
				case "be your Head Girl":
					t.push(`(the assignment location of a slave who needs some hands-on guidance from your Head Girl),`);
					break;
				case "recruit girls":
					t.push(`(the camera station ${he} uses to convince people from the old world that becoming your slave is a good idea),`);
					break;
				case "serve in the master suite":
					t.push(`(your bedroom, where ${he}'ll ready ${himself} for later),`);
					break;
				case "be the DJ":
					t.push(`(the back of ${V.clubName} where ${he} decides the playlist for the day),`);
					break;
				case "be the Attendant":
					t.push(`(the back of ${V.spaName}, where ${he}'ll decide the perfect mixture for today's baths),`);
					break;
				case "be the Madam":
					t.push(`(${his} office in ${V.brothelName}, where ${he}'ll decide the slaves on display),`);
					break;
				case "be the Schoolteacher":
					t.push(`(${his} office in ${V.schoolroomName}, where ${he}'ll decide today's lesson),`);
					break;
				case "be the Stewardess":
					t.push(`(${his} office in ${V.servantsQuartersName}, where ${he}'ll divvy out today's tasks),`);
					break;
				case "be the Milkmaid":
					t.push(`(${V.dairyName}, to check on the cattle),`);
					break;
				case "be the Farmer":
					t.push(`(${V.farmyardName}, to tend to the crops),`);
					break;
				case "be the Wardeness":
					t.push(`(${V.cellblockName}, to oversee the inmates),`);
					break;
				case "be your Concubine":
					t.push(`(your bed),`);
					break;
				case "be the Nurse":
					t.push(`(${V.clinicName}, to check on the patients),`);
					break;
				case "be the Matron":
					t.push(`(${V.nurseryName}, where ${he} is managing children and nannies),`);
					break;
				case "live with your Head Girl":
					break;
				default:
					t.push(`(a waiting area for further assignment),`);
			}
			t.push(`and when you get there, ${he} gives you a peck on the cheek. ${eventSlave.height < 170 ? `The short ${desc} has to go up on tiptoe to reach.` : ""} <span class="hotpink">"${Spoken(eventSlave, "I really do love you")},</span> ${Master}," ${he} ${say}s, ${canSee(eventSlave) ? `${App.Desc.eyesColor(eventSlave)} shining` : "face filled with joy"}.`);

			eventSlave.devotion += 5;
			return t;
		}

		function play() {
			t = [];

			t.push(`You're not a slave, so you can't understand ${his} inner workings through direct empathy. But in your experience, a quick orgasm never fails to make a good day better. You're not slow, and of course you know where ${he}'s going, so you catch up to ${him} on quiet feet and`);
			if (eventSlave.butt > 12) {
				t.push(`sink both hands into ${his} immense rear.`);
			} else if (eventSlave.butt > 6) {
				t.push(`set ${his} enormous ass jiggling with a smack.`);
			} else if (eventSlave.butt > 3) {
				t.push(`give ${his} womanly bottom a squeeze.`);
			} else {
				t.push(`pinch ${his} cute rear.`);
			}
			t.push(`${He} squeals and whirls around, ${eventSlave.energy > 60 ? `eagerly flinging ${himself} into your arms, ready for some action` : `trustingly throwing ${himself} into your arms`}. Feeling spontaneous, you decide to get everyone off quickly and cleanly, right here.`);
			switch (eventSlave.fetish) {
				case "submissive":
					t.push(`You place a dominant hand around ${his} throat, firmly but not harshly, almost sending the submissive to ${his} knees. Your other hand`);
					break;
				case "cumslut":
					t.push(`You kiss ${him}, sliding your tongue all the way into ${his} mouth. ${He} melts into you, rhapsodically entranced by the intense oral stimulation, and ${his} tongue presses against yours with frankly sexual significance. Your hand`);
					break;
				case "humiliation":
					t.push(`Slaves are constantly passing the two of you, and you constantly turn ${him} to show ${his} body to each of them, spreading ${him} to display ${his} most intimate parts. ${His} cheeks flush with arousal and delicious shame. Your hand`);
					break;
				case "buttslut":
					t.push(`You slide a hand all the way under ${him}, pulling the flesh of ${his} buttock to one side and then nestling possessive fingers over ${his} anus, teasing and stimulating, but not penetrating. Your other hand`);
					break;
				case "boobs":
					t.push(`${He} gasps as your hot mouth finds one of ${his} ${eventSlave.nipples} nipples, and then moans openly as one of your hands mauls ${his} other breast. Your other hand`);
					break;
				case "pregnancy":
					t.push(`One of your hands begins to caress ${his} ${belly} ${eventSlave.pregKnown === 1 ? "pregnant" : ""} belly, worshipping its curve. Your other hand`);
					break;
				case "dom":
				case "sadist":
					t.push(`You press yourself aggressively against ${him}, and ${he} presses back; you grind harder still, letting ${him} know that ${he} can let ${himself} be a little aggressive, too. Groaning with pleasure and satisfaction, ${he} kisses you furiously. One of your hands`);
					break;
				case "masochist":
					t.push(`You caress one of ${his} nipples, ${eventSlave.nipples !== "fuckable" ? "bringing it completely erect before gripping it firmly. You twist it, pull it, pinch it" : "letting it swell completely shut before driving your entire fist into it"}; ${he} moans with masochistic pleasure. Your other hand`);
					break;
				default:
					t.push(`Your hand`);
			}
			if (canDoVaginal(eventSlave)) {
				t.push(`finds ${his} pussy`);
			} else if (canDoAnal(eventSlave)) {
				t.push(`reaches around behind ${him} to tease ${his} ass and play with ${his} sensitive perineum`);
			} else {
				t.push(`traces ${his} chastity`);
			}
			t.push(`and you press your groin towards ${him}. Getting the idea, ${he} begins to ${PC.dick !== 0 ? "jack you off" : "finger your clit"} energetically, taking the pace from your lusty demeanor and ${his} own feeling of energy and well-being. The two of you orgasm almost together. ${PC.dick !== 0 ? "You angle your hips to shoot your seed onto the floor" : "You climax so violently that some of your femcum makes it onto the floor"}.`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`${His} ejaculate steadily drips from ${his} chastity cage,`);
			} else if (canAchieveErection(eventSlave)) {
				t.push(`${He} blows ${his} own load right after,`);
			} else if (eventSlave.balls > 0) {
				t.push(`${His} limp dick pours cum,`);
			} else if (eventSlave.dick > 0) {
				t.push(`${His} bitchclit produces a little watery fluid,`);
			} else if (eventSlave.vaginaLube > 1) {
				t.push(`${He} squirts copiously,`);
			} else {
				t.push(`Unusually for ${him}, ${he} manages to squirt a little,`);
			}
			t.push(`adding to the mess. You tell ${him} another slave will clean up, and order ${him} to go about ${his} business. ${He} turns to go, smiling with sexual satisfaction.`);

			eventSlave.trust += 5;
			return t;
		}

		function punish() {
			t = [];

			t.push(`That was not quite the prescribed way of greeting you, there was no need to greet you as ${he} passed, and most importantly, ${he}'s simply too cheery. Resolving to crush ${his} happiness, you call ${him} back to the office in a thunderous voice you know will reach ${him}. ${He} knows ${he}'s made a mistake, but comes promptly, lower lip quivering. ${His} feelings are plain to see on ${his} face: surprise, betrayal, fear. ${He} thought ${he} could be friendly, and now ${he} knows ${he} was wrong. What's more, ${he} thought ${he} could be happy, and now ${he}'s realizing that that was also wrong. As you`);
			switch (eventSlave.rules.punishment) {
				case "confinement":
					t.push(`close ${him} into a confinement cell,`);
					break;
				case "whipping":
					t.push(`tie ${him} up for a brief whipping,`);
					break;
				case "chastity":
					t.push(`lock ${him} into harsh chastity,`);
					break;
				default:
					t.push(`gag ${him} for speaking out of turn,`);
			}
			t.push(`a wail of despair tears its way out of ${his} throat, far out of proportion to the standard punishment you're applying. It's perhaps the saddest sound you've ever heard a slave make. Slaves cry all the time, but usually they already understand that happiness is out of their reach. This one just woke up thinking that ${he} could be happy and was happy, and now ${he}'s realizing it isn't allowed.`);

			eventSlave.devotion -= 10;
			eventSlave.trust -= 10;
			return t;
		}
	}
};


code:
App.Events.RESSPenitent = class RESSPenitent 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,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.clothes === "a penitent nuns habit",
				s => s.devotion >= -20 && s.devotion <= 50
			]
		];
	}

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

		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`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`comes before you for routine inspection, it is obvious that ${his} penitent habit is having an effect. ${He} moves with exquisite care, desperate to minimize the`);
		if (eventSlave.pregKnown === 1 && eventSlave.belly >= 1500) {
			r.push(`chafing, especially on ${his} growing pregnancy.`);
		} else {
			r.push(`chafing.`);
		}
		r.push(`${He} seems totally concentrated on obedience: the constant discomfort often has the effect of forcing a slave to marshal all ${his} mental faculties in the service of pain avoidance.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`${His} responses to your routine questions are so mechanical and honest that you make an impromptu confession of it. You require ${him} to tell the full tale of all ${his} minor infractions against the rules, and even order ${him} to confess ${his} resistant thoughts to you as well. Past the ability to resist, ${he} pours out a stream of ${his} inner fears, hopes, and feelings about ${his} life as a sex slave.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Require ${him} to self-flagellate`, flagellate),
			(canImpreg(eventSlave, V.PC) && (eventSlave.mpreg === 1 && canDoAnal(eventSlave)) || (eventSlave.ovaries === 1 && canDoVaginal(eventSlave)))
				? new App.Events.Result(`Put a baby in ${him} while ${he} prays`, babyPray, virginityWarning())
				: new App.Events.Result(),
			(canDoVaginal(eventSlave))
				? new App.Events.Result(`Fuck ${him} while ${he} prays`, fuckPray, (eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null))
				: new App.Events.Result(),
			(canDoAnal(eventSlave))
				? new App.Events.Result(`Sodomize ${him} while ${he} prays`, analPray, (eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null))
				: new App.Events.Result(),
		]);

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

			r.push(`You tell ${him} that you will offer ${him} a method of expiating ${his} deep and troubling sin. ${He} looks almost hopeful at this, until you lead ${him} out onto a balcony and order ${him} to strip before handing ${him} a simple length of hempen rope. ${He} already knows what's coming next, but ${he} breaks down as ${he} obeys your orders to kneel. ${He} sobs abjectly, but you don't even have to give the next order: ${he}'s already flogging the rope against ${his} own back in the hope of earning a reprieve by obedience. You count the strokes aloud, stopping at one in disapproval of how light ${he}'s hitting ${himself}. ${He} flogs ${himself} harder and harder, screaming a little and crying in pain and fear as you obstinately refuse to say "two." When ${he} strikes so hard that ${he} draws a little blood, you finally say the terrible word. When you're finally satisfied with ${his} self-torture, ${he}'s so exhausted that you carry ${his} limp,`);
			if (V.seePee === 1) {
				r.push(`bloody, vaguely urine-scented`);
			} else {
				r.push(`bloody`);
			}
			if (eventSlave.bellyPreg >= 1500) {
				r.push(r.pop() + `, gravid`);
			}
			r.push(`form into the shower, wash ${him}, and apply curatives, though ${he}'s still quite injured. ${He} wakes to find ${himself} curled up in your lap, and ${he} stiffens for a brief moment before relaxing against your chest, weeping softly.`);
			if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			}
			if ((eventSlave.behavioralFlaw !== "odd") && (random(1, 100) > 50)) {
				eventSlave.behavioralFlaw = "odd";
				r.push(`The terrible experience has left ${him} with <span class="flaw gain">unpleasant nervous tics.</span>`);
			}
			eventSlave.devotion += 10;
			healthDamage(eventSlave, 10);
			return r;
		}

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

		function babyPray() {
			r = [];
			r.push(`${eventSlave.slaveName} finds ${himself} standing in front of you, feeling you roughly using two fingers to finger ${his}`);
			if (eventSlave.mpreg === 1) {
				r.push(`asspussy.`);
			} else {
				r.push(`pussy.`);
			}
			r.push(`${He} gasps out:`);
			r.push(Spoken(eventSlave, `"Oh ${Master}, owner, protector, and father of my children, forgive my sins, just as you forgave my sisters in slavery before me. Count not my transgressions against your rules, but, rather, the tears of my womb. Remember not my iniquities but my willingness to be bred by you. I long to serve your`));
			if (V.PC.vagina !== -1) {
				r.push(`futa`);
			}
			r.push(Spoken(eventSlave, `dick, and beg that you will use me and bless my body with your offspring. I promise to submit to you as your breeding slut all the days of my servitude, and to grow heavy with child, again and again."`));
			r.push(`${He} moans with relief when ${he} feels you withdraw your penetrating digits partway through ${his} recitation, but by the time ${he}'s finished, you've shoved your dick up ${his} waiting`);
			if (eventSlave.mpreg === 1) {
				r.push(`asshole`);
			} else {
				r.push(`pussy`);
			}
			r.push(`and are close to blessing ${him} with a load of cum. ${He} <span class="devotion inc">does ${his} best</span> to relax and resumes,`, Spoken(eventSlave, `"Oh, ${Master}..."`));
			if (eventSlave.mpreg === 1) {
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			knockMeUp(eventSlave, 100, 2, -1);
			if (eventSlave.fetish !== "humiliation" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">humiliation</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "pregnancy" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "pregnancy";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">carrying your children</span> with sexual fulfillment.`);
			}
			eventSlave.devotion += 4;
			return r;
		}

		function fuckPray() {
			r = [];
			r.push(`${eventSlave.slaveName} finds ${himself} standing in front of you, feeling you roughly using two fingers to finger ${his} pussy. ${He} gasps out:`);
			r.push(Spoken(eventSlave, `"Oh ${Master}, owner and protector, forgive my sins, just as you forgave my sisters in slavery before me. Count not my transgressions against your rules, but, rather, my tears of service. Remember not my iniquities but my willingness to be raped by you. I long to serve your`));
			if (V.PC.dick === 0) {
				r.push(Spoken(eventSlave, `pussy,`));
			} else {
				if (V.PC.vagina !== -1) {
					r.push(`futa`);
				}
				r.push(Spoken(eventSlave, `dick,`));
			}
			r.push(Spoken(eventSlave, `and beg that you will use me and make your dwelling place within my`));
			if (eventSlave.vagina === 0) {
				r.push(Spoken(eventSlave, `virgin folds.`));
			} else {
				r.push(Spoken(eventSlave, `feminine slit.`));
			}
			r.push(Spoken(eventSlave, `I promise to submit to you as your vaginal slut all the days of my servitude."`));
			r.push(`${He} moans with relief when ${he} feels you withdraw your penetrating digits partway through ${his} recitation, but by the time ${he}'s finished, you've shoved`);
			if (V.PC.dick === 0) {
				r.push(`a strap-on`);
			} else {
				r.push(`your dick`);
			}
			r.push(`up ${his} waiting pussy. ${He} <span class="devotion inc">does ${his} best</span> to relax and resumes,`, Spoken(eventSlave, `"Oh ${Master}..."`));
			r.push(VCheck.Vaginal(eventSlave, 1));
			if (eventSlave.fetish !== "humiliation" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">humiliation</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			}
			eventSlave.devotion += 4;
			return r;
		}

		function analPray() {
			r = [];
			r.push(`${eventSlave.slaveName} finds ${himself} standing in front of you, feeling you roughly probe ${his} ass with two fingers. ${He} gasps out:`);
			r.push(Spoken(eventSlave, `"Oh ${Master}, owner and protector, forgive my sins, just as you forgave my sisters in slavery before me. Count not my transgressions against your rules, but, rather, my tears of anal service. Remember not my iniquities but my willingness to be assraped by you. I long to serve your`));
			if (V.PC.dick === 0) {
				r.push(Spoken(eventSlave, `pussy,`));
			} else {
				if (V.PC.vagina !== -1) {
					r.push(`futa`);
				}
				r.push(Spoken(eventSlave, `dick,`));
			}
			r.push(Spoken(eventSlave, `and beg that you will use me and make your dwelling place within my butthole. I promise to submit to you as your anal slut all the days of my servitude."`));
			r.push(`${He} moans with relief when ${he} feels you withdraw your penetrating digits partway through ${his} recitation, but by the time ${he}'s finished, you've shoved`);
			if (V.PC.dick === 0) {
				r.push(`a strap-on`);
			} else {
				r.push(`your dick`);
			}
			r.push(`up ${his} loosened ass. ${He} <span class="devotion inc">does ${his} best</span> to relax and resumes,`, Spoken(eventSlave, `"Oh ${Master}..."`));
			r.push(VCheck.Anal(eventSlave, 1));
			if (eventSlave.fetish !== "humiliation" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">humiliation</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			}
			eventSlave.devotion += 4;
			return r;
		}
	}
};


code:
App.Events.RESSPermittedMasturbation = class RESSPermittedMasturbation 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,
				hasBothArms,
				canMove,
				canHear,
				s => s.devotion > 50,
				s => (canDoAnal(s) || canDoVaginal(s)),
				s => s.assignment !== Job.QUARTER,
				s => s.assignment !== Job.CONCUBINE,
				s => s.assignment !== Job.MASTERSUITE,
				s => s.rules.release.masturbation === 1,
				s => s.energy > 80,
			]
		];
	}

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

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

		let r = [];
		r.push(`Strolling through the penthouse late at night, thinking over a business problem, you pass`);
		if (eventSlave.ID === V.HeadGirlID && V.HGSuite > 0) {
			r.push(`the door of your Head Girl's suite`);
		} else if (eventSlave.rules.living === "luxurious") {
			r.push(`the door to one of the cozy little slave bedrooms`);
		} else {
			r.push(`through the cavernous slave dormitory`);
		}
		r.push(`and see`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), ","));
		r.push(`alone in bed tonight. ${He}'s nude, of course, and has not pulled the sheets up over ${himself}. ${He}'s lying face-down,`);
		if (eventSlave.belly >= 10000) {
			r.push(`though ${his} bulbous middle forces ${him} to twist awkwardly,`);
		} else if (eventSlave.boobs > 10000) {
			r.push(`though ${his} titanic tits prop ${his} torso up awkwardly,`);
		} else if (eventSlave.boobs > 1600) {
			r.push(`with ${his} huge boobs squashed out to either side of ${his} ${eventSlave.skin} torso,`);
		}
		r.push(`humping the sheets`);
		if (eventSlave.vagina === -1 && eventSlave.dick === 0) {
			r.push(`and using a hand to rub ${his} perineum and asspussy.`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`as best ${he} can with ${his} ${belly} belly in the way.`);
		} else if (eventSlave.chastityVagina) {
			r.push(`uselessly through ${his} chastity belt.`);
		} else if (eventSlave.chastityPenis === 1) {
			r.push(`uselessly with ${his} caged dick.`);
		} else if (eventSlave.dick > 15 && !canAchieveErection(eventSlave)) {
			r.push(`with ${his} soft python of a cock.`);
		} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave)) {
			r.push(`with ${his} giant dick as engorged as ${he} can manage.`);
		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			r.push(`with ${his} sad, soft cock.`);
		} else if (eventSlave.dick > 3) {
			r.push(`with the huge up and down pumps ${his} impressive cock requires.`);
		} else if (eventSlave.dick > 0) {
			r.push(`with ${his} stiff dick.`);
		} else {
			r.push(`with ${his} needy pussy.`);
		}
		r.push(`${He}'s using ${his} right arm to`);
		if (canDoVaginal) {
			if (eventSlave.vagina > 2) {
				r.push(`pound ${himself} with a big dildo, and`);
			} else if (eventSlave.vagina > 0) {
				r.push(`fuck ${himself} with a dildo, and`);
			} else {
				r.push(`finger ${himself}, and`);
			}
		} else {
			if (eventSlave.anus > 2) {
				r.push(`pound ${himself} in the ass with a big dildo, and`);
			} else if (eventSlave.anus > 1) {
				r.push(`fuck ${his} own ass with a dildo, and`);
			} else if (eventSlave.anus > 0) {
				r.push(`fuck ${his} own anus with two fingers, and`);
			} else {
				r.push(`tease ${his} virgin anus, and`);
			}
		}
		if (eventSlave.fetish === "cumslut" && eventSlave.fetishKnown) {
			r.push(`is giving two fingers of ${his} left hand a blowjob.`);
		} else if (eventSlave.fetish === "masochist" && eventSlave.fetishKnown) {
			r.push(`has ${his} left hand trapped under ${his} chest to cruelly`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`twist`);
			} else {
				r.push(`finger`);
			}
			r.push(`${his} own nipples.`);
		} else if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown && eventSlave.bellyPreg >= 1500) {
			r.push(`is using ${his} left hand to massage ${his} ${belly} gravid belly.`);
		} else if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown) {
			r.push(`is using ${his} left hand to massage that buttock sensually, pulling it to the side to stimulate ${his} anus even more.`);
		} else if (eventSlave.fetish === "boobs" && eventSlave.fetishKnown) {
			r.push(`is using ${his} left hand to grope ${his} own breasts.`);
		} else {
			r.push(`is using ${his} left hand to`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`stimulate`);
			} else {
				r.push(`finger`);
			}
			r.push(`a nipple.`);
		}
		r.push(`Slaves with powerful sex drives like ${hers} often find it necessary to masturbate in order to sleep. ${He}'s fully preoccupied, and has not noticed you.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Sleep with ${him}`, sleep),
			new App.Events.Result(`Exhaust ${him}`, exhaust, virginityWarning()),
			(eventSlave.fetishKnown === 1 && eventSlave.fetish !== Fetish.NONE)
				? new App.Events.Result(`Play into ${his} fetish at bedtime`, bedtime, virginityWarning())
				: new App.Events.Result(),
		]);

		function sleep(){
			r = [];
			r.push(`${He} starts with surprise when ${he} feels your hand on ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`back, but is accustomed to your touch and knows who you are. ${He} does not pause ${his} masturbation, knowing that if you want ${him} to, you'll tell ${him}. You massage ${his} warm skin, enjoying the animal energy of the onanistic spectacle laid out before you. ${He} builds toward climax, turning ${his} head`);
			if (canSee(eventSlave)) {
				r.push(`to glance at`);
			} else {
				r.push(`to listen to`);
			}
			r.push(`you once or twice, but eventually realizing that you're just here to watch. ${He} turns over hurriedly for ${his} climax, efficiently`);
			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`dribbling ${his} weak orgasm out onto ${his}`);
				if (eventSlave.belly >= 1500) {
					r.push(`${belly}`);
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`pregnant`);
					}
				}
				r.push(`belly`);
			} else if (eventSlave.balls > 3) {
				r.push(`blowing ${his} massive load all over ${his}`);
				if (eventSlave.belly >= 1500) {
					r.push(`${belly}`);
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`pregnant`);
					}
				}
				r.push(`belly`);
				if (eventSlave.belly < 10000) {
					r.push(`and chest`);
				}
			} else if (eventSlave.balls > 0) {
				r.push(`blowing cum up onto ${his} own`);
				if (eventSlave.belly >= 1500) {
					r.push(`${belly}`);
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`pregnant`);
					}
				}
				r.push(`belly`);
			} else if (eventSlave.vagina === -1) {
				r.push(`jerking ${his} tiny little front hole sideways`);
			} else {
				r.push(`jerking ${his} wet pussy upward`);
			}
			r.push(`to avoid having to change the sheets. ${He} gets up carefully and heads off for a quick shower. When ${he} returns, it's to`);
			if (canSee(eventSlave)) {
				r.push(`a sight`);
			} else {
				r.push(`a sound`);
			}
			r.push(`that brings ${him} to a shocked standstill: you're in ${his} bed, sound asleep. You had a long day, and the soft bed, warmed by ${his} pretty body, felt very nice. After some deliberation, ${he} crawls in beside you, snuggling up to offer you more of ${his} body heat, direct from the source. ${He} is impressed almost to tears at the trust you display in ${him}, and relaxes completely as you, dominant even when unconscious, encircle ${his}`);
			if (eventSlave.preg > 20) {
				r.push(`pregnant belly`);
			} else if (eventSlave.belly >= 100000) {
				r.push(`${belly} middle`);
			} else if (eventSlave.boobs > 2000) {
				r.push(`massive mammaries`);
			} else {
				r.push(`shoulders`);
			}
			r.push(`with your arms and pull ${him} in close.`);
			eventSlave.trust += 5;
			return r;
		}

		function exhaust() {
			const prick = V.PC.dick !== 0 ? "prick" : "strap-on";
			r = [];
			r.push(`${He} starts with surprise when ${he} feels your hand on ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`back, but is accustomed to your touch and knows who you are. ${He} does not pause ${his} masturbation, knowing that if you want ${him} to, you'll tell ${him}. You take a moment to enjoy the warmth of the working slave's body before gently taking the hand ${he}'s using to`);
			if (canDoVaginal(eventSlave) || eventSlave.anus === 0) {
				r.push(`pleasure ${himself},`);
				if (eventSlave.vagina > 0 || !canDoAnal(eventSlave) || eventSlave.anus === 0) {
					didVaginal = true;
				} else {
					didAnal = true;
				}
			} else {
				r.push(`buttfuck ${himself},`);
				didAnal = true;
			}
			if (didAnal) {
				if (eventSlave.anus > 2) {
					r.push(`pulling the dildo free of ${his} relaxed asshole, and replacing it with your ${prick} before its gape can close.`);
				} else if (eventSlave.anus > 1) {
					r.push(`pulling the dildo free of ${his} loose anus, and replacing it with your ${prick} before its gape can close.`);
				} else if (eventSlave.anus > 0) {
					r.push(`pulling ${his} fingers free of ${his} tight little ass, and replacing them with your ${prick} while it's still relaxed.`);
				} else {
					r.push(`removing it from ${his} untouched rear, and replacing it with your ${prick} while it's still receptive.`);
				}
				r.push(VCheck.Anal(eventSlave, 5));
			} else {
				if (eventSlave.vagina > 2) {
					r.push(`pulling the dildo free of ${his} mature pussy, and replacing it with your ${prick} before its gape can close.`);
				} else if (eventSlave.vagina > 0) {
					r.push(`pulling the dildo free of ${his} tight pussy, and replacing them with your ${prick} while it's still receptive.`);
				} else {
					r.push(`pulling ${his} fingers free of ${his} pure vagina, and replacing them with your ${prick} while ${he}'s still warmed up.`);
				}
				r.push(VCheck.Vaginal(eventSlave, 5));
			}
			r.push(`${He} moans into the pillow and pats around blindly with ${his} freed hand before finding your thigh and rubbing it affectionately. ${He} steps up ${his} humping and soon shudders,`);
			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`releasing a pathetic spurt onto`);
			} else if (eventSlave.balls > 3) {
				r.push(`shooting a big jet of cum all over ${his} own`);
				if (eventSlave.belly >= 1500) {
					r.push(`${belly}`);
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`pregnant`);
					}
					r.push(`stomach`);
				} else {
					r.push(`chest`);
				}
				r.push(`and`);
			} else if (eventSlave.balls !== 0) {
				r.push(`orgasming messily onto`);
			} else {
				r.push(`going limp and slumping down onto`);
			}
			r.push(`the sheets beneath ${him}. When you climax soon after, ${he} expects you to get off ${him} so ${he} can clean up, but instead, the`);
			if (didAnal) {
				if (V.PC.dick !== 0) {
					r.push(`cock up ${his} butt returns to rock hardness`);
					if (V.PC.vagina !== -1) {
						r.push(`as you use a little manual stimulation of your own cunt to get yourself stiff again`);
					}
					r.push(`and`);
				} else {
					r.push(`strap-on up ${his} butt`);
				}
			} else {
				if (V.PC.dick !== 0) {
					r.push(`cock hilted in ${him} returns to rock hardness`);
					if (V.PC.vagina !== -1) {
						r.push(`as you use a little manual stimulation of your own cunt to get yourself stiff again`);
					}
					r.push(`and`);
				} else {
					r.push(`strap-on buried in ${him}`);
				}
			}
			r.push(`goes back to pumping in and out of ${him}. ${He} slides a hand under ${himself} to`);
			if (eventSlave.vagina === -1) {
				r.push(`jerk off`);
			} else {
				r.push(`rub ${himself}`);
			}
			r.push(`this time. When you finally finish, a long time later, the exhausted slave is lying on a bed wet with lube,`);
			if (V.PC.dick !== 0 || eventSlave.dick > 0) {
				r.push(`ejaculate,`);
			}
			if (V.PC.dick === 0 || eventSlave.vagina > -1) {
				r.push(`girlcum,`);
			}
			r.push(`drool, and sweat. ${He} doesn't care, and you let ${him} curl up in ${his} sex-soaked nest. As you leave, you think ${he}'s asleep already, but`);
			if (!canSee(eventSlave)) {
				r.push(`as you go`);
			} else {
				r.push(`${his} ${App.Desc.eyesColor(eventSlave)} open a slit as you go and`);
			}
			if (canTalk(eventSlave)) {
				const Thanks = Spoken(eventSlave, "Thanks");
				r.push(`${he} murmurs, <span class="devotion inc">"${Thanks},</span> ${Master}."`);
			} else {
				r.push(`${he} struggles to sign <span class="devotion inc">"thank you"</span> before passing out.`);
			}
			eventSlave.devotion += 5;
			return r;
		}

		function bedtime() {
			const {himU, hisU, girlU} = getNonlocalPronouns(0).appendSuffix('U');
			r = [];
			r.push(`${He} starts with surprise when ${he} feels your hands seize ${him} by ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`fat`);
			} else if (eventSlave.weight > 130) {
				r.push(`chubby`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`shoulders,`);
			if (eventSlave.fetish === Fetish.SUBMISSIVE) {
				r.push(`but ${he} relaxes into submissive compliance as you slide them up to the nape of ${his} neck, grinding ${his} face deeper into the pillow. ${He} gives muffled whines of happiness as you give ${him} some light spanks before`);
				if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0 || !canDoAnal(eventSlave) || eventSlave.anus === 0)) {
					r.push(`hilting yourself in ${him}`);
					didVaginal = true;
				} else {
					r.push(`using ${his} butt`);
					didAnal = true;
				}
				r.push(`without regard for ${his} pleasure. ${He} does not climax, but when you roll ${his} unresisting body over to give ${his}`);
				if (eventSlave.belly >= 1500) {
					r.push(`mouth, swollen belly and breasts`);
				} else {
					r.push(`mouth and breasts`);
				}
				r.push(`some attention, ${he}'s clearly enjoying ${himself}.`);

				seX(eventSlave, "oral", V.PC, "penetrative");
				seX(eventSlave, "mammary", V.PC, "penetrative");
			} else if (eventSlave.fetish === "cumslut") {
				r.push(`but ${he} is already licking ${his} lips with anticipation as you roll ${him} over and straddle ${his} chest so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.push(r.pop() + ".");
				r.push(`The orally fixated slut concentrates on the oral to a fault, so you take ${his} arms and straddle them too so ${he} can reach ${himself} and get back to masturbating. ${He} hums happily, a very fine sensation on`);
				if (V.PC.dick !== 0) {
					r.push(`shaft`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`pussylips`);
				}
				r.push(r.pop() + ".");
				seX(eventSlave, "oral", V.PC, "penetrative");
			} else if (eventSlave.fetish === "humiliation") {
				r.push(`but ${he} complies as you pull ${him} up to kneel and`);
				if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0 || !canDoAnal(eventSlave) || eventSlave.anus === 0)) {
					r.push(`slip yourself inside ${him}.`);
					didVaginal = true;
				} else {
					r.push(`take an assfuck.`);
					didAnal = true;
				}
				r.push(`You let ${him} get used to it and then wordlessly turn ${his} head so ${he} can`);
				if (canSee(eventSlave)) {
					r.push(`see the screen in the room: it's now on, and it's showing a public live feed of your`);
					if (V.PC.dick !== 0) {
						r.push(`cock`);
					} else {
						r.push(`strap-on`);
					}
					r.push(`penetrating ${didVaginal ? `${him}` : `${his} anus`}. ${He} recognizes ${himself} immediately,`);
				} else {
					r.push(`listen to the screen in the room: it's now on, and it's showing a public live feed of your`);
					if (V.PC.dick !== 0) {
						r.push(`cock`);
					} else {
						r.push(`strap-on`);
					}
					r.push(`penetrating ${didVaginal ? `${him}` : `${his} anus`}. ${He} realizes the sounds of you fucking ${his} sync up with it,`);
				}
				r.push(`the sheer humiliation of having ${didVaginal ? `${himself}` : `${his} rectum`} penetrated on camera brings ${him} to an indecently quick climax.`);
			} else if (eventSlave.fetish === "buttslut") {
				r.push(`but ${he} eagerly complies as you pull ${him} up to kneel and take an assfuck. You shove ${his} arms up over ${his} head to stop ${his} masturbation, confident that the anal whore can climax from nothing but your`);
				if (V.PC.dick !== 0) {
					r.push(`cock`);
				} else {
					r.push(`strap-on`);
				}
				r.push(`pumping in and out of ${his} butt. You're right, and ${his} ${canDoAnal(eventSlave) ? "sphincter tightens" : "buttocks clench"} with orgasm even sooner than you expected it to. You roll ${him} over and go again,`);
				if (eventSlave.chastityVagina || eventSlave.chastityPenis === 1) {
					r.push(`the evidence of ${his} first orgasm leaking out from behind ${his} chastity belt.`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`${his} soft cock still releasing little spurts of ejaculate onto ${his}`);
					if (eventSlave.belly >= 1500) {
						r.push(`${belly}`);
						if (eventSlave.bellyPreg >= 1500) {
							r.push(`pregnant`);
						}
					}
					r.push(`belly.`);
				} else if (eventSlave.dick > 0) {
					r.push(`${his} hard dick scattering the evidence of ${his} orgasm around as it flops around with the buttsex.`);
				} else if (eventSlave.vagina === -1) {
					r.push(`${his} tiny front hole dribbling a little fluid down ${his} legs.`);
				} else {
					r.push(`${his} pussy soaking wet with arousal.`);
				}
				if (canDoAnal) {
					didAnal = true;
				}
				seX(eventSlave, "anal", V.PC, "penetrative");
			} else if (eventSlave.fetish === "boobs") {
				r.push(`but ${he} giggles with anticipation as you flip ${him} over. ${His} cute giggling turns into a gasp of arousal when you`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`seize both of ${his} hard`);
				} else {
					r.push(`sink your fingers into ${his}`);
				}
				r.push(`nipples and tug them upward to pull ${him} into a half-sitting position. You hold ${his} boobs for ${him} to accomplish a messy titfuck and let ${him} masturbate at the same time. With ${his} nipples providing second and third loci of pleasure, ${he} climaxes quickly; you flip ${him} over and do ${him} doggy style, holding ${his} shoulders down so the rough fuck drags ${his} sensitive nipples`);
				if (eventSlave.belly >= 100000) {
					r.push(`and ${belly} belly`);
				}
				r.push(`across the sheets with every stroke.`);
				if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0 || !canDoAnal(eventSlave) || eventSlave.anus === 0)) {
					didVaginal = true;
				} else {
					didAnal = true;
				}
				seX(eventSlave, "mammary", V.PC, "penetrative");
			} else if (eventSlave.fetish === "pregnancy") {
				r.push(`but ${he} complies as you pull ${him} up`);
				if (eventSlave.belly >= 300000) {
					r.push(`onto ${his} ${belly} dome of a middle and take ${him} over it.`);
				} else {
					r.push(`to kneel and take it doggy style.`);
				}
				r.push(`After getting things going, you use one hand to begin groping ${his}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				} else if (eventSlave.belly >= 1500) {
					r.push(`${belly}`);
				}
				r.push(`belly. Bending forward to whisper into ${his} ear, you begin to describe how`);
				if (eventSlave.belly >= 750000) {
					r.push(`${he}'s nothing more than a giant egg just waiting for ${his} children to hatch, how ${he}'s so close to bursting with life that just a few more babies should do it.`);
				} else if (eventSlave.belly >= 600000) {
					r.push(`if ${he} grows any larger with child, ${he}'ll practically be nothing more than an overswollen womb.`);
				} else if (eventSlave.belly >= 450000) {
					r.push(`it must feel to be so obscenely pregnant that anyone and everyone can see the life distending ${his} struggling body.`);
				} else if (eventSlave.belly >= 300000) {
					r.push(`full ${he} would feel if ${he} got any more pregnant and how hard it would be to do even the most simple of tasks.`);
				} else if (eventSlave.belly >= 150000) {
					r.push(`with a few more babies in ${him}, ${his} obscene womb would reach the floor.`);
				} else if (eventSlave.belly >= 100000) {
					r.push(`obscene it would be if ${he} were swollen with more than a dozen children.`);
				} else if (eventSlave.belly >= 15000) {
					r.push(`full and heavy ${he}'d be with octuplets crowding ${his} womb.`);
				} else if (eventSlave.pregKnown === 1) {
					r.push(`${he}'d look and feel swollen with multiple children.`);
				} else {
					r.push(`it might feel if ${his} belly were to grow heavy with pregnancy.`);
				}
				r.push(`${He} gasps with sudden shocked arousal at the idea, moaning with desire as you describe your hot seed jetting into ${him}, racing towards ${his} core, turning ${his} body into nothing more than a breeding machine.`);
				if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0 || !canDoAnal(eventSlave) || eventSlave.anus === 0)) {
					didVaginal = true;
				} else {
					r.push(`It's ${his} butt you're fucking, but ${he} doesn't care.`);
					didAnal = true;
				}
			} else if (eventSlave.fetish === "dom") {
				r.push(`but ${he} keeps masturbating even as you flip ${him} over. You tell ${him} to keep going, and leave ${him} there for a moment. ${He} obeys, looking mystified, but is pleased to`);
				if (canSee(eventSlave)) {
					r.push(`see you return with another slave.`);
				} else {
					r.push(`hear your footsteps return accompanied by a second set.`);
				}
				r.push(`You push the other ${girlU} unceremoniously down onto ${eventSlave.slaveName}, making ${himU} give ${eventSlave.slaveName} some oral while you roughly fuck ${hisU} ass. ${eventSlave.slaveName} enjoys ${himself} immensely, jerking with pleasure every time you pound the poor ${girlU} hard enough to make ${himU} moan into ${eventSlave.slaveName}.`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			} else if (eventSlave.fetish === "sadist") {
				r.push(`but ${he} keeps masturbating even as you flip ${him} over. You tell ${him} to keep going, and leave ${him} there for a moment. ${He} obeys, looking mystified, but is pleased to`);
				if (canSee(eventSlave)) {
					r.push(`see you return with another slave.`);
				} else {
					r.push(`hear your footsteps return accompanied by a second set.`);
				}
				r.push(`You push the other ${girlU} unceremoniously down onto ${eventSlave.slaveName}, making ${himU} give ${eventSlave.slaveName} some oral while you spank ${himU} and then roughly fuck ${hisU} ass. ${eventSlave.slaveName} enjoys ${himself} immensely, jerking with pleasure every time you strike or sodomize the poor ${girlU} hard enough to make ${himU} scream into ${eventSlave.slaveName}.`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			} else if (eventSlave.fetish === "masochist") {
				r.push(`but ${he} relaxes into submissive compliance as you slide them up to the nape of ${his} neck, grinding ${his} face deeper into the pillow. ${He} gives muffled whines of mixed pain and pleasure as you give ${him} some hard spanks before`);
				if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0 || !canDoAnal(eventSlave) || eventSlave.anus === 0)) {
					r.push(`ramming it in so hard you nearly pierce through ${his} cervix and start relentlessly pounding. ${He} climaxes repeatedly to the pain, screaming helplessly as ${his} orgasms force ${him} to unwillingly buck against the invading phallus.`);
					didVaginal = true;
				} else {
					r.push(`sodomizing ${him} right up to the edge of what ${his} poor anus can take without damage. ${He} climaxes repeatedly to the pain, screaming helplessly as ${his} orgasms force ${his} abused sphincter to tighten spastically against the phallus invading it.`);
					didAnal = true;
				}
			}
			if (didAnal) {
				if (eventSlave.anus === 0) {
					eventSlave.anus++;
				}
				r.push(VCheck.Anal(eventSlave, 1));
			} else if (didVaginal) {
				if (eventSlave.vagina === 0) {
					eventSlave.vagina++;
				}
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			r.push(`${He}'s surprised but not displeased to find you standing over ${him} the next night at exactly the same time. By the third night, ${he}'s masturbating in anticipation of your visit to ${his} bed.`);
			if (eventSlave.fetishStrength > 95) {
				r.push(`Since ${he}'s totally sure of what gets ${him} off, this consistent proof that you know it too makes ${him} <span class="trust inc">trust you.</span>`);
				eventSlave.trust += 5;
			} else {
				r.push(`Since ${he}'s developing ${his} kinks, this consistent reinforcement <span class="fetish inc">advances ${his} fetish.</span>`);
				eventSlave.fetishStrength += 4;
			}
			return r;
		}

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


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				s => s.devotion > 50,
				s => s.trust > 20,
				s => s.assignment !== Job.CONCUBINE,
				s => s.assignment !== Job.MASTERSUITE,
				s => (getLimbCount(s, 102) === 4) // all limbs are prosthetics, and all limbs are present
			]
		];
	}

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

		let artDiv = document.createElement("div");
		if (V.seeImages === 1) {
			const tempClone = clone(eventSlave); // Figured it would be safest not to mess with the actual slave, and instead amputate a temporary clone
			removeLimbs(tempClone, "all");
			App.Events.drawEventArt(artDiv, tempClone, "no clothing");
			node.appendChild(artDiv);
		}

		let r = [];
		r.push(`First thing in the morning,`);
		if (eventSlave.ID === V.BodyguardID) {
			r.push(`before you've even gotten out of bed, you hear`);
			r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "'s"));
			r.push(`voice coming up from where ${he} sleeps,`);
			if (V.dojo >= 1) {
				r.push(`in the armory watching over your suite.`);
			} else {
				r.push(`on ${his} own bedroll in your suite.`);
			}
			r.push(`There's a distinctly plaintive note in ${his} voice, and as soon as you sit up and look in ${his} direction, it's obvious why. ${He} sleeps out of ${his} P-Limbs, since it's good to rest the anchor points implanted into ${his} torso. They're held in actuators over ${his} bedroll, which can swing down and attach them to ${him} the instant ${he}'s awake. Except today, they're staying obstinately up near the ceiling.`);
			if (V.assistant.personality !== 0) {
				r.push(`${V.assistant.name} tells you ${heA}'s`);
			} else {
				r.push(`Your personal assistant informs you ${heA}'s`);
			}
			r.push(`troubleshooting the problem, but in the meantime, poor`);
		} else {
			r.push(`${V.assistant.name} informs you that there's a minor problem with`);
			r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), ","));
			r.push(`and asks whether you'd like it to be handled without you. ${He} sleeps out of ${his} P-Limbs, since it's good to rest the anchor points implanted into ${his} torso. When ${he} wakes up, ${he} usually asks whichever slave is nearest to attach ${his} dominant arm, at which point ${he} can do the rest ${himself}. Due to an unexpected change in the slaves' schedules, though, ${he}'s all alone today. Poor`);
		}
		r.push(`${eventSlave.slaveName} is left as a helpless,`);
		if (eventSlave.bellyImplant >= 100000) {
			r.push(`limbless, ${belly} womb.`);
		} else if (eventSlave.bellyFluid >= 100000) {
			r.push(`limbless, ${belly} balloon.`);
		} else if (eventSlave.bellyPreg >= 10000) {
			r.push(`limbless, heavily pregnant torso.`);
		} else if (eventSlave.bellyImplant >= 10000) {
			r.push(`limbless, nearly spherical torso.`);
		} else if (eventSlave.bellyFluid >= 10000) {
			r.push(`limbless, ${eventSlave.inflationType}-balloon.`);
		} else if (eventSlave.weight >= 130) {
			r.push(`limbless pile of flab.`);
		} else {
			r.push(`limbless torso.`);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Help ${him} into ${his} P-Limbs`, help),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Fuck ${him} before you help ${him}`, fuck, ((eventSlave.vagina === 0 && canDoVaginal(eventSlave)) || (eventSlave.anus === 0 && canDoAnal(eventSlave))) && V.PC.dick !== 0 ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			(canPenetrate(eventSlave) && (V.PC.vagina > 0 || V.PC.anus > 0) && isPlayerReceptive(eventSlave))
				? new App.Events.Result(`Ride ${him} before you help ${him}`, ride, (V.PC.vagina > 0 ? PCPenetrationWarning("vaginal") : PCPenetrationWarning("anal")))
				: new App.Events.Result(),
		]);

		function help() {
			// replace slave art with limbs attached
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave);
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You decide to help ${him} yourself rather than having a slave do it.`);
			if (eventSlave.ID === V.BodyguardID) {
				r.push(`Swinging your legs out of bed and heading towards ${him},`);
			} else {
				r.push(`Heading towards ${his} part of the sleeping area,`);
			}
			r.push(`you're struck by how`);
			if (eventSlave.belly >= 5000) {
				r.push(`round`);
			} else {
				r.push(`small`);
			}
			r.push(`${he} looks without ${his} prosthetics. Just a little ${eventSlave.skin} thing, without the`);
			if (getLimbCount(eventSlave, 3) > 2) {
				r.push(`sexy artificial limbs that let ${him} delight anyone who fucks ${him} with vibrating fingertips.`);
			} else if (getLimbCount(eventSlave, 4) > 2) {
				r.push(`incredible artificial limbs so perfect that many mistake them for the real thing.`);
			} else if (getLimbCount(eventSlave, 5) > 2) {
				r.push(`armored artificial limbs that make ${him} a deadly war machine.`);
			} else if (getLimbCount(eventSlave, 6) > 2) {
				r.push(`advanced artificial limbs that let ${him} delight sexual partners, fight enemies, and even live a normal life.`);
			} else {
				r.push(`artificial limbs that allow ${him} a semblance of a normal life.`);
			}
			r.push(`${He}'s not frightened, trusting`);
			if (eventSlave.ID === V.BodyguardID) {
				r.push(`you to help ${him}, or detail a slave to do so.`);
			} else {
				r.push(`${V.assistant.name} to bring help.`);
			}
			r.push(`When ${he}`);
			if (canSee(eventSlave)) {
				r.push(`sees`);
			} else {
				r.push(`notices`);
			}
			r.push(`that you mean to assist ${him} yourself, ${he} breaks out in a huge grateful smile and thanks you profusely.`);
			App.Events.addParagraph(frag, r);

			r = [];
			if (eventSlave.ID === V.BodyguardID) {
				r.push(`First, you extricate ${his} limbs from the malfunctioning machine.`);
			}
			r.push(`As you take up ${his} first arm and kneel down to attach it to ${him}, ${he} rolls and hoists that shoulder up towards it, ${his}`);
			if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				} else {
					r.push(`bloated`);
				}
				r.push(`body straining to twist`);
			} else if (eventSlave.muscles > 30) {
				r.push(`strong body easily twisting`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned body readily twisting`);
			} else {
				r.push(`soft body straining to twist`);
			}
			r.push(`on the sheet despite ${his} limblessness. When the gleaming halves of the attachment are`);
			if (V.showInches === 2) {
				r.push(`half an inch`);
			} else {
				r.push(`a few millimeters`);
			}
			r.push(`apart, the magnetic seals take over and pull them into perfect alignment. Acting out of pure habit, ${he} actuates all the muscle group equivalents on the arm, one by one, testing function.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`With one arm and the remaining three limbs within reach, ${he} can take care of ${himself}, but ${he} reaches out to touch your leg lightly from ${his} place on the ground.`);
			if (getRightArmID(eventSlave) === 4 || getRightArmID(eventSlave) === 6) {
				r.push(`The hand is just as soft and warm as ${his} original would have been.`);
			} else {
				r.push(`${His} hand is smooth and cool.`);
			}
			if (!canTalk(eventSlave)) {
				r.push(`${He} uses ${his} one hand to rapidly spell out a polite request. ${He} asks you to attach the rest of ${his} limbs, too.`);
			} else {
				r.push(Spoken(eventSlave, `"${Master}, would you please attach the rest of them for me?"`));
				r.push(`${he} asks politely.`);
			}
			r.push(`A transitory nervousness crosses ${his} ${eventSlave.faceShape} face as ${he} asks, but clears into trusting happiness when you nod and pick up ${his} other arm. ${He} tests each limb as it's attached, and then tests them all by getting up into a kneel and giving you a hug.`);
			eventSlave.trust += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function fuck() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You decide to have some fun with the temporarily helpless slave. You`);
			if (eventSlave.ID === V.BodyguardID) {
				r.push(`get out of bed`);
			} else {
				r.push(`head to where ${he}'s waiting for help`);
			}
			r.push(`and scoop ${him} up, ${his} limblessness making it comically easy. With ${his} torso cradled in your grasp and ${his} head nestled into the crook of your arm, you carry ${him}`);
			if (eventSlave.ID === V.BodyguardID) {
				r.push(`back towards your bed.`);
			} else {
				r.push(`back towards your suite.`);
			}
			r.push(`When ${he}`);
			if (canSee(eventSlave)) {
				r.push(`sees`);
			} else {
				r.push(`figures out`);
			}
			r.push(`what you're doing, ${he} turns ${his} head and gives your`);
			if (V.PC.boobs >= 300) {
				r.push(`breast on that side`);
			} else {
				r.push(`chest`);
			}
			r.push(`an anticipatory kiss. When you set ${him} down on the bed, ${he}`);
			if (canSee(eventSlave)) {
				r.push(`stares`);
			} else {
				r.push(`smiles`);
			}
			r.push(`up at you invitingly and gives ${his} four P-Limb anchor points a glinting wiggle, a gesture that might mean anything. ${His}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy,`);
			} else {
				r.push(`asshole,`);
			}
			r.push(`in any case, is presented openly for your use.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`After fingering your helpless toy experimentally, you`);
			if (V.PC.dick !== 0) {
				if (canDoVaginal(eventSlave)) {
					r.push(`slide yourself inside ${him} and start fucking ${him}.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(`push yourself up ${his} butt and start fucking ${him}.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
			} else {
				r.push(`straddle ${his} face, riding ${his} eager mouth while you use your hands on ${his}`);
				if (canDoVaginal(eventSlave)) {
					r.push(`cunt.`);
				} else {
					r.push(`hole.`);
				}
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			r.push(`${He} has no control at all, but ${he} trusts you not to hurt ${him} and is soon enjoying ${himself}. ${He} can't seem to stop ${himself} from trying to move P-Limbs that aren't there, forgetting that ${he}'s not wearing them whenever the arousal builds high enough to make ${him} forgetful. Eventually ${he} stops trying to restrain ${himself}, realizing that you're enjoying ${his} delicious wriggling beneath you. ${He} orgasms hard,`);
			if (V.PC.dick !== 0) {
				if (canDoVaginal(eventSlave)) {
					r.push(`the walls of ${his} pussy squeezing your shaft.`);
				} else {
					r.push(`${his} anus tightening around the base of your dick.`);
				}
			} else {
				r.push(`moaning ${his} climax into your pussy with abandon.`);
			}
			App.Events.addParagraph(frag, r);
			App.Events.addParagraph(frag, [`When you've climaxed yourself, ${he} looks back towards where ${his} P-Limbs are waiting, but you're not done with ${his} yet. You pick ${him} up again and bring ${him} into the shower. ${He} tries to help you, but again, ${he} gives up after a while, letting you wash ${him}. As you're rinsing the soap off ${him}, ${he} thanks you devotedly. With the water streaming down ${his} face, you barely notice ${his} gentle tears.`]);
			eventSlave.devotion += 4;
			return frag;
		}

		function ride() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You decide to have some fun with the temporarily helpless slave. You`);
			if (eventSlave.ID === V.BodyguardID) {
				r.push(`get out of bed`);
			} else {
				r.push(`head to where ${he}'s waiting for help`);
			}
			r.push(`and kneel over ${him}, bringing yourself low enough that ${his} flaccid dick is nestled between your ${V.PC.vagina >= 0 ? "lips" : "cheeks"}. When ${he}`);
			if (canSee(eventSlave)) {
				r.push(`sees`);
			} else {
				r.push(`figures out`);
			}
			r.push(`what you're doing, ${he}`);
			if (canSee(eventSlave)) {
				r.push(`stares`);
			} else {
				r.push(`smiles`);
			}
			r.push(`up at you longingly and gives ${his} four P-Limb anchor points a glinting wiggle, a gesture that might mean anything. In any case, ${he}'s openly hard and ready for your use.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`After tormenting your helpless toy with some more grinding, you pick yourself up before slamming back down, spearing your`);
			if (V.PC.vagina > 0) {
				r.push(`pussy`);
				seX(eventSlave, "penetrative", V.PC, "vaginal");
				if (canImpreg(V.PC, eventSlave)) {
					knockMeUp(V.PC, 20, 0, eventSlave.ID);
				}
			} else {
				if (V.PC.anus === 0){
					r.push(`<span class="virginity loss>tight virgin</span>`);
					V.PC.anus++;
				}
				r.push(`asshole`);
				seX(eventSlave, "penetrative", V.PC, "anal");
				if (canImpreg(V.PC, eventSlave)) {
					knockMeUp(V.PC, 20, 1, eventSlave.ID);
				}
			}
			r.push(`on ${his} stiff rod and taking ${him} for a ride. ${He} has no control at all, but ${he} trusts you not to hurt ${him} and is soon enjoying ${himself}. ${He} can't seem to stop ${himself} from trying to move P-Limbs that aren't there, forgetting that ${he}'s not wearing them whenever the arousal builds high enough to make ${him} forgetful. Eventually ${he} stops trying to restrain ${himself}, realizing that you're enjoying ${his} delicious wriggling beneath you. ${He} orgasms hard,`);
			if (V.PC.vagina >= 0) {
				r.push(`painting the walls of your vagina white.`);
			} else {
				r.push(`flooding your rectum with cum.`);
			}
			App.Events.addParagraph(frag, r);
			App.Events.addParagraph(frag, [`When you've climaxed yourself, ${he} looks towards ${his} waiting P-Limbs, but you're not done with ${him} yet. You pick ${him} up again and bring ${him} into the shower. ${He} tries to help you, but again, ${he} gives up after a while, letting you wash ${him}. As you're rinsing the soap off ${him}, ${he} thanks you devotedly. With the water streaming down ${his} face, you barely notice ${his} gentle tears.`]);
			eventSlave.devotion += 4;
			return frag;
		}
	}
};


code:
App.Events.RESSPlugDisobedience = class RESSPlugDisobedience 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 => plugWidth(s) > 1 || plugLength(s) > 0,
				s => s.devotion <= 20,
				s => s.trust >= -50,
				s => s.anus < 3,
				s => s.assignment !== Job.CONFINEMENT,
				isSlaveAvailable,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(`One morning, you see`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		if (!canWalk(eventSlave)) {
			r.push(`crawl`);
		} else if (canMove(eventSlave) && eventSlave.rules.mobility === "permissive") {
			r.push(`hobble`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`totter`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`waddle`);
		} else {
			r.push(`walk`);
		}
		r.push(`hurriedly past your door, as though ${he} doesn't want you to notice ${him}. Of course, this only makes you notice ${him}, and you order ${him} in. As ${he} reluctantly obeys, you notice something off about ${his} ${canWalk(eventSlave) ? "gait" : "movements"}. ${He} should be quite uncomfortable from the`);
		if (plugWidth(eventSlave) > 1 && plugLength(eventSlave) > 0) {
			r.push(`massive`);
		} else if (plugLength(eventSlave) > 0) {
			r.push(`long`);
		} else {
			r.push(`big`);
		}
		r.push(`buttplug ${he} is required to wear, but ${he} doesn't seem to be.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`Your order ${him} to turn around and present ${his} anus for inspection. ${He} doesn't refuse, exactly, but neither does ${he} obey. ${He} keeps ${his} butt pointed resolutely away from you, and backs away a little. You cover the distance between you in three steps and run a clinical hand`);
		if (plugLength(eventSlave) > 0) {
			r.push(`across the terrified slave's lower belly.`);
		} else {
			r.push(`between the terrified slave's buttocks.`);
		}
		r.push(`As you suspected, ${he} isn't wearing ${his} buttplug.`);
		if (!canTalk(eventSlave)) {
			r.push(`${He} gestures pitifully, complaining that the plug hurts.`);
		} else {
			r.push(`${He} whines pitifully,`);
			r.push(Spoken(eventSlave, `"That thing hurts, ${Master}. It's too big for my asshole. Please don't make me wear it."`));
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`It's ${his} role to hurt`, hurt),
			new App.Events.Result(`Punish ${him} for disobedience, but address ${his} anal pain`, punish),
			new App.Events.Result(`Address ${his} worrisome anal pain`, address),
		]);

		function hurt() {
			r = [];
			r.push(`Without a word, you`);
			if (V.PC.dick === 0) {
				r.push(`don a cruelly knobby strap-on,`);
			}
			r.push(`throw ${him} onto the couch, take both ${his} ankles in one hand, and force them back over ${his} head so ${his} poor, doomed asshole is completely defenseless. You then spit on ${his} hole, seize your`);
			if (V.PC.dick === 0) {
				r.push(`instrument,`);
			} else {
				r.push(`rock-hard dick,`);
				if (V.PC.vagina !== -1) {
					r.push(`gather a little of your own pussyjuice and rub it on your cockhead,`);
				}
			}
			r.push(`and shove it up the wriggling slave ${girl}'s spasming rectum. You've got the necessary skill to judge exactly where the line between anal pain and anal injury is, and you take ${his} right up to it. Halfway through the long anal rape ${he} gives up struggling and just goes limp, sobbing. ${He} fears you, and has also begun to hate buttsex.`);
			eventSlave.trust -= 5;
			eventSlave.sexualFlaw = "hates anal";
			seX(eventSlave, "anal", V.PC, "penetrative");
			return r;
		}

		function punish() {
			r = [];
			r.push(`You patiently and calmly explain to ${him} that disobeying orders isn't acceptable, but that too much pain from ${his} buttplug is a sign that something isn't right. First, you inform ${him}, ${he} will have to be punished for the disobedience, since ${he} should have brought ${his} trouble to you instead of disobeying. ${He}'s almost willing as you bend ${him} over`);
			if (eventSlave.belly >= 300000) {
				r.push(`${his} ${belly} middle`);
			} else {
				r.push(`the desk`);
			}
			r.push(`and spank ${his} buttocks severely, unsure whether to resent the corporal punishment or appreciate your measured response. When you're done tanning ${his} ass, ${he}'s surprised to feel a cool, lubricated digit working its way into ${his} anus. ${He} stiffens a little but eventually relaxes enough to take the finger, then two, and finally three, before you gently and slowly emplace ${his} plug. You instruct ${him} kindly on how to relax in the future when ${he} inserts it on ${his} own. ${He} appreciates your approach.`);
			eventSlave.devotion += 4;
			return r;
		}

		function address() {
			eventSlave.trust += 4;
			return `You kindly explain how to relax and prepare one's asshole for such insertions. ${He}'s been told already, but you make ${him} fetch ${his} plug and go through the steps in front of you so you can check ${his} approach. ${He} leaves reminded how to wear ${his} plug, but secretly relieved ${he} got away with disobedience with nothing more than a lecture.`;
		}
	}
};


code:
App.Events.RESSProstheticsPlease = class RESSProstheticsPlease extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.researchLab.level >= 1,
			() => V.researchLab.speed >= 300
		];
	}

	actorPrerequisites() {
		return [
			[
				s => s.fetish !== Fetish.MINDBROKEN,
				s => canTalk(s),
				s => s.devotion > 50,
				s => s.trust > 20,
				s => isAmputee(s),
			]
		];
	}

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

		App.Events.addNode(node, [
			`As you are inspecting ${eventSlave.slaveName}, you notice ${he} seems distant and lost in thought.`,
			`This isn't unusual, however ${eventSlave.slaveName} is quite devoted and trusting of you, so tends to be willing to speak ${his} mind.`,
			`You ask ${him} if there's something the disabled slave would like to tell you.`,
			`${He} pretends there isn't anything wrong, so you make telling you an order.`
		], "p");
		App.Events.addNode(node, [
			`"${Spoken(eventSlave, `Well, ${Master}, I'm very happy being with you, and you're a such good master, but I don't know well I can serve you like this...`)}`,
			`${Spoken(eventSlave, `I-I just think that it would be a lot easier, and I would be able to do so much better, if you gave me some prosthetics.`)}`,
			`${Spoken(eventSlave, `Then I could pleasure you without you having to do all the work. Can I please have prosthetics, ${Master}?`)}"`
		], "p");

		const interfaces = App.Data.prosthetics.interfaceP3.costs * 2 + App.Data.prosthetics.interfaceP3.adjust * 50; // borrowed from src\interaction\prostheticConfig.js
		const limbs = App.Data.prosthetics.basicL.costs * 2 + App.Data.prosthetics.basicL.adjust * 50; // borrowed from src\interaction\prostheticConfig.js
		const totalCost = interfaces + limbs;

		App.Events.addResponses(node, [
			new App.Events.Result(`Grant ${his} request`, grant, `Costs ${cashFormat(totalCost)}`),
			new App.Events.Result(`Deny ${his} request`, deny),
		]);

		function grant() {
			cashX(totalCost, "capEx");
			configureLimbs(eventSlave, "all", 2);
			eventSlave.devotion += 5;
			eventSlave.trust += 15;
			App.Events.addNode(node, [
				`You have ${eventSlave.slaveName} taken down to the prosthetic lab, to be immediately fitted for ${his} new appendages.`,
				`${He} smiles throughout the process of measuring and choosing ${his} prosthetics, and can barely contain ${himself} once the anchors are implanted in ${him} and ${his} new limbs installed.`,
				`Tentatively, ${he} uses them for the first time, and almost breaks into tears when ${he} <span class="trust inc">realizes the gift</span> you have given ${him} by doing this.`,
				`${He} is <span class="devotion inc">overwhelmingly happy</span> with you.`
			], "p");
		}

		function deny() {
			eventSlave.devotion -= 5;
			eventSlave.trust -= 5;
			App.Events.addNode(node, [
				`You tell ${eventSlave.slaveName} that <span class="trust dec">no, you will not</span> be fitting ${him} for prosthetics.`,
				`The way ${he} is now is the way you want ${him}, and unless you desire to change ${him}, ${he} will remain that way.`,
				`${He} looks dejected, but ${he}'s <span class="devotion dec">devoted enough</span> to understand that you know what's best for ${him}.`
			], "p");
		}
	}
};