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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canTalk,
				s => [Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment),
				s => s.devotion > 20,
				s => s.trust >= -20,
				s => canDoAnal(s) || canDoVaginal(s),
				s => (s.chastityPenis !== 1 || s.dick === 0),
				canWalk,
				s => s.rules.release.masturbation === 1,
			]
		];
	}

	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);

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

		const r = new SpacedTextAccumulator(node);
		r.push(`Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you.`);
		if (S.Concubine) {
			r.push(`Your concubine, ${S.Concubine.slaveName}`);
		} else if (V.HeadGirlID !== 0) {
			r.push(`Your Head Girl, ${S.HeadGirl.slaveName}`);
		} else if (V.assistant.name === "your personal assistant") {
			r.push(`Your personal assistant`);
		} else {
			r.push(`Your personal assistant, ${capFirstChar(V.assistant.name)},`);
		}
		r.push(`manages a schedule for them, constantly changing it up to keep the sluts from getting predictable.`);
		r.push(contextualIntro(V.PC, eventSlave, true, false, true));
		r.push(`has just come on shift.`);
		r.toParagraph();

		r.push(`And has ${he} ever come on shift. ${He} enters your office at something not far removed from a run, displaying evident signs of sexual excitation, a blush visible on ${his} ${eventSlave.skin} cheeks. Between ${his} job, the mild drugs in ${his} food, and ${his} life, ${he}'s beside ${himself} with need. ${He} realizes you're working and tries to compose ${himself}, but gives up after a short struggle and flings ${himself} down on the couch. ${He} scoots down so ${his}`);
		if (eventSlave.butt > 5) {
			r.push(`enormous`);
		} else if (eventSlave.butt > 2) {
			r.push(`healthy`);
		} else {
			r.push(`trim`);
		}
		r.push(`butt is hanging off the edge of the cushion, and spreads ${his} legs up and back`);
		if (eventSlave.belly >= 5000) {
			r.push(`to either side of ${his} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly`);
		}
		r.push(`as wide as they'll go`);
		if (eventSlave.boobs > 1000) {
			r.addToLast(`, hurriedly shoving ${his} tits out of the way`);
		}
		r.addToLast(`. ${He} uses both hands to frantically`);
		if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			if (eventSlave.hormoneBalance >= 100) {
				r.push(`rub ${his} hormone-dysfunctional penis,`);
			} else if (eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
				r.push(`rub ${his} limp, useless penis,`);
			} else if (eventSlave.balls === 0) {
				r.push(`rub ${his} limp, balls-less penis,`);
			} else {
				r.push(`rub ${his} soft penis,`);
			}
		} else if (eventSlave.dick > 4) {
			r.push(`jack off ${his} titanic erection,`);
		} else if (eventSlave.dick > 2) {
			r.push(`jack ${himself} off,`);
		} else if (eventSlave.dick > 0) {
			r.push(`rub ${his} pathetic little hard-on,`);
		} else if (eventSlave.vagina === -1) {
			r.push(`frantically rubs the sensitive area beneath ${his} asspussy,`);
		} else if (eventSlave.clit > 0) {
			r.push(`rub ${his} huge, engorged clit,`);
		} else if (eventSlave.labia > 0) {
			r.push(`play with ${his} clit and ${his} generous labia,`);
		} else {
			r.push(`rub ${his} pussy,`);
		}
		r.push(`but after a moment ${he} clearly decides this isn't enough stimulation. ${He}`);
		if (eventSlave.dick > 0) {
			r.push(`uses two fingers to collect the precum dribbling from ${his} dickhead.`);
		} else {
			r.push(`fucks ${himself} vigorously with two fingers to collect some girl lube.`);
		}
		r.push(`${He} brings these fingers up to ${his} face to check ${his} work, hesitates, visibly decides ${he} doesn't care, and reaches down to`);
		if (eventSlave.anus > 2) {
			r.push(`slide them into ${his} loose asspussy. ${He} sighs with pleasure at the sensation.`);
		} else if (eventSlave.anus > 1) {
			r.push(`shove them up ${his} butt. ${He} wriggles a little at the makeshift lubrication but is clearly enjoying ${himself}.`);
		} else {
			r.push(`push them up ${his} tight butt. The pain of anal penetration with only makeshift lubrication extracts a huge sobbing gasp from ${him}, and ${he} tears up a little even as ${he} masturbates furiously.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Leave ${him} to it`, leave),
			new App.Events.Result(`Lend ${him} some assistance`, lend, virginityWarning()),
			new App.Events.Result(`Show the slut off`, show),
		]);

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

		function leave() {
			const r = new SpacedTextAccumulator();
			r.push(`You have work to do. You ignore the shameless slut, who gets ${himself} off in no time at all,`);
			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) { // Review! Previously: <<if ($activeSlave.dick > 0) && !canAchieveErection($activeSlave.balls == 0)>>
				r.push(`${his} limp dick dribbling cum onto ${his}`);
				if (eventSlave.pregKnown === 1) {
					r.push(`pregnant`);
				}
				r.push(`stomach.`);
			} else if (eventSlave.dick > 0) {
				r.push(`orgasming so strongly ${he} manages to hit ${himself} in the face with ${his} own cum.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`indulging in the anal self-stimulation that's ${his} best remaining avenue to an orgasm.`);
			} else {
				r.push(`the smell of female pleasure filling the office.`);
			}
			r.push(`${He} gets up, washes ${himself} off and rearranges ${his} body on the couch again, languidly this time. ${He} returns to masturbating, gently playing with ${himself} with one hand and`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`teasing`);
			} else {
				r.push(`fingering`);
			}
			r.push(`a nipple with the other.`);
			r.toParagraph();
			return r.container();
		}

		function lend() {
			let didAnal = false;
			let didVaginal = false;
			const r = new SpacedTextAccumulator();
			r.push(`You stand and ask ${him} mockingly if ${he} could use some assistance. ${He} gapes at you for a lust-hazed moment before nodding happily,`);
			if (!canTalk(eventSlave)) {
				r.push(`gesturing ${his} thanks.`);
			} else {
				r.push(
					`squealing,`,
					Spoken(eventSlave, `"Yes please, ${Master}!"`)
				);
			}
			r.push(`${He} stops wanking and takes ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} away, laying ${himself} wide for you like a horny human buffet. You make a show of selecting, but decide on ${his}`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina > 2) {
					r.push(`slutty pussy.`);
				} else if (eventSlave.vagina > 1) {
					r.push(`experienced pussy.`);
				} else {
					r.push(`tight pussy.`);
				}
				didVaginal = true;
			} else {
				if (eventSlave.anus > 2) {
					r.push(`slutty anal slit.`);
				} else if (eventSlave.anus > 1) {
					r.push(`well prepared asshole.`);
				} else {
					r.push(`still-tight butt.`);
				}
				didAnal = true;
			}
			r.push(`${He} calmed down a little while offering ${himself} to you, so ${he} manages not to climax immediately when you`);
			if (V.PC.dick === 0) {
				r.push(`push your strap-on into ${him},`);
			} else {
				r.push(`thrust your dick into ${him},`);
			}
			r.push(`but ${he}'s in a rare mood. You reward ${him} by guiding ${his} hands back to ${his} crotch as you ramp up the pace, at which ${he} looks up at you with something like wordless glee. ${He} goes back to`);
			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`playing with ${his} limp dick,`);
			} else if (eventSlave.dick > 4) {
				r.push(`jerking off ${his} giant cock,`);
			} else if (eventSlave.dick > 2) {
				r.push(`jerking off,`);
			} else if (eventSlave.dick > 0) {
				r.push(`teasing ${his} girly little dick,`);
			} else if (eventSlave.clit > 0) {
				r.push(`jerking off ${his} ridiculous clit,`);
			} else if (eventSlave.labia > 0) {
				r.push(`spreading and teasing ${his} petals,`);
			} else if (eventSlave.vagina === -1) {
				r.push(`playing with ${his} asspussy,`);
			} else {
				r.push(`rubbing ${his} clit,`);
			}
			if (!canTalk(eventSlave)) {
				r.push(`making little raspy pleasure noises.`);
			} else {
				r.push(`mewling with pleasure.`);
			}
			if (didAnal) { // Review! Moved this block up from below "skips off to wash" for better flow
				r.push(VCheck.Anal(eventSlave, 1));
			} else if (didVaginal) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			r.push(`When you're finally done, ${he}'s fairly tired, but ${he} manages to give ${his}`);
			if (eventSlave.butt > 5) {
				r.push(`huge,`);
			} else if (eventSlave.butt > 2) {
				r.push(`big,`);
			} else {
				r.push(`cute,`);
			}
			r.push(`well-fucked butt a little wiggle for you, <span class="trust inc">`);
			if (canSee(eventSlave)) {
				r.push(`looking`);
			} else {
				r.push(`smiling`);
			}
			r.push(`at you gratefully,</span> as ${he} skips off to wash.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}

		function show() {
			const r = new SpacedTextAccumulator();
			r.push(`It takes a trifling command at your desk to surreptitiously slave one of the office cameras to ${his} impromptu masturbation session, and send the feed to many of the public screens. After a few minutes,`);
			if (canSee(eventSlave)) {
				r.push(`${he} notices the setup through one of the office's glass walls.`);
			} else {
				r.push(`you inform the eager masturbator that ${his} show is live across the arcology.`);
			}
			if (eventSlave.fetish === "humiliation" && eventSlave.fetishStrength > 60 && eventSlave.fetishKnown === 1) {
				r.push(`${He} climaxes almost instantly at the realization, which plays right into ${his} fetish.`);
			} else {
				r.push(`${He} pauses for a moment at the realization, but goes back to ${his} business, blushing a little harder.`);
			}
			r.push(`${He} even plays it up a little for ${his} audience; when ${he}`);
			if (eventSlave.belly >= 120000 && eventSlave.dick > 0) {
				r.push(`climaxes, ${he} makes sure they can see the way ${his} enormously distended body spasms with orgasm.`);
			} else if (eventSlave.belly >= 10000 && eventSlave.dick > 0) {
				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. However, ${his}`);
				if (eventSlave.bellyPreg >= 5000) {
					r.push(`advanced pregnancy`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`thwarts ${his} efforts and ${he} ends up cumming on ${his} stomach's underside. ${He} brushes some cum off with ${his} fingers and brings it to ${his} mouth, smiling at the`);
				if (canTaste(eventSlave)) {
					r.push(`taste.`);
				} else {
					r.push(`sensation.`);
				}
			} else if (eventSlave.dick.isBetween(0, 5) && eventSlave.belly >= 5000) {
				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. However, ${he} ends up just coating ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`in ${his} own cum.`);
			} else if (eventSlave.dick > 4 && eventSlave.belly >= 5000) {
				r.push(`finally orgasms, ${he} attempts to hike ${his} hips over ${his} head and direct the cum into ${his} mouth. ${His} dick is large enough to extend past ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy,`);
				} else {
					r.push(`${belly} belly,`);
				}
				r.push(`allowing ${him} to blow ${his} load into ${his} waiting maw.`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`finally manages to extract an orgasm from ${his} limp dick, ${he} hikes ${his} hips over ${his} head to direct it into ${his} mouth.`);
			} else if (eventSlave.dick > 0) {
				r.push(`finally empties ${his} balls, ${he} hikes ${his} hips over ${his} head to direct the cum into ${his} mouth.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`climaxes, ${he} makes sure they can see the way ${his} asspussy spasms with orgasm.`);
			} else {
				r.push(`finally climaxes, ${he} carefully licks ${his} hands clean, showing off ${his} enjoyment of ${his} own`);
				if (canTaste(eventSlave)) {
					r.push(`taste.`);
				} else {
					r.push(`fluids.`);
				}
			}
			r.push(`Authenticity is hard to fake, and the many citizens who saw the broadcast don't doubt <span class="reputation inc">your ability to train</span> a shameless slut.`);
			repX(1250, "event", eventSlave);
			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESSShiftSleep = class RESSShiftSleep extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.corp.Incorporated !== 0,
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canTalk,
				s => [Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment),
				s => s.devotion > 20,
				s => s.trust >= -20,
				s => canDoAnal(s) || canDoVaginal(s),
				s => (s.chastityPenis !== 1) || (s.dick === 0),
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(`Your fucktoys have to eat, sleep, and look after themselves, just like anyone, so they can't spend every moment offering themselves to you.`);
		if (S.Concubine) {
			r.push(`Your concubine, ${S.Concubine.slaveName}`);
		} else if (V.HeadGirlID !== 0) {
			r.push(`Your Head Girl, ${S.HeadGirl.slaveName}`);
		} else if (V.assistant.name === "your personal assistant") {
			r.push(`Your personal assistant`);
		} else {
			r.push(`Your personal assistant, ${capFirstChar(V.assistant.name)},`);
		}
		r.push(`manages a schedule for them, constantly changing it up to keep the sluts from getting predictable.`);
		r.push(contextualIntro(V.PC, eventSlave, true, false, true));
		r.push(`has just come on shift.`);
		r.toParagraph();

		r.push(`Though it's late, ${he}'s surprised to find the lights in the master suite off. You had an unusually trying day, so you've retired for the night; you're on the point of sleep when ${he} comes in`);
		if (S.Concubine && S.Concubine.ID !== eventSlave.ID) {
			r.addToLast(`, ${S.Concubine.slaveName} nestled under your arm`);
		}
		r.addToLast(`. After a moment's hesitation, ${eventSlave.slaveName} strips quietly and`);
		if (eventSlave.belly >= 100000) {
			r.push(`gently lowers ${his} extremely gravid body onto`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`gently lowers ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			} else {
				r.push(`heavily swollen`);
			}
			r.push(`body onto`);
		} else if (eventSlave.weight > 95) {
			r.push(`gently lowers ${his} heavy body onto`);
		} else {
			r.push(`sits on`);
		}
		r.push(`the edge of the bed, preparing to climb quietly in. ${He} clearly thinks you're asleep, and is doing ${his} best not to wake you. The dim, blue-toned light of your bedroom at night washes out ${his} ${eventSlave.skin} skin and robs ${his} ${App.Desc.eyesColor(eventSlave)} of their color, but it highlights`);
		if (eventSlave.belly >= 100000) {
			r.push(`${his} ${belly} dome of a stomach,`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`greatly swollen with life.`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`greatly distended by ${his} implant.`);
			}
		} else if (eventSlave.nipples === "huge") {
			r.push(`the wonderful nipples jutting from ${his} flesh, stiffening in the cool night air.`);
		} else if (eventSlave.weight > 130) {
			r.push(`${his} fat gut, with each fold making its own shadowed trench and ${his} navel forming a little dark hollow in ${his} soft stomach.`);
		} else if (eventSlave.belly >= 5000) {
			r.push(`${his} rounded belly,`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`swollen with life.`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`filled out by ${his} implant.`);
			} else {
				r.push(`bloated with ${eventSlave.inflationType}.`);
			}
		} else if (eventSlave.weight > 95) {
			r.push(`${his} fat belly, with ${his} navel forming a little dark hollow in ${his} soft stomach.`);
		} else if (eventSlave.weight > 10) {
			r.push(`${his} plush belly, with ${his} navel forming a little dark hollow in ${his} pretty stomach.`);
		} else if (eventSlave.muscles > 30) {
			r.push(`${his} washboard abs, with each muscle casting its own little shadow.`);
		} else if (eventSlave.boobs > 1000) {
			r.push(`the huge curve of ${his} breasts, a giant dark presence.`);
		} else if (eventSlave.dick > 2) {
			r.push(`the presence between ${his} legs.`);
		} else {
			r.push(`${his} pretty face.`);
		}
		if (canSee(eventSlave)) {
			r.push(`${He} perceives the glint of your open eyes,`);
		} else if (canHear(eventSlave)) {
			r.push(`${He} hears your breathing change,`);
		} else {
			r.push(`${He} correctly guesses you're wide awake,`);
		}
		r.push(`and stops, patiently waiting for some sign of what you'd like ${him} to do.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Relaxed sex`, relaxed),
			eventSlave.belly < 150000 && canDoVaginal(eventSlave)
				? new App.Events.Result(`Surprise sex`, surprise, (eventSlave.vagina === 0) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			eventSlave.belly < 150000 && canDoAnal(eventSlave)
				? new App.Events.Result(`Surprise buttsex`, surprise2, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null)
				: new App.Events.Result(),
		]);

		function relaxed() {
			const r = new SpacedTextAccumulator();
			r.push(`You flip the sheet off your naked body, revealing your already`);
			if (V.PC.dick === 0) {
				r.push(`wet pussy`);
			} else {
				r.push(`stiff prick`);
				if (V.PC.vagina !== -1) {
					r.push(`and the wet pussy below it`);
				}
			}
			r.addToLast(`. ${He} slides ${himself} down, pressing ${his}`);
			if (eventSlave.boobs > 2000) {
				r.push(`ridiculous tits`);
			} else if (eventSlave.boobs > 800) {
				r.push(`big breasts`);
			} else if (eventSlave.boobs > 300) {
				r.push(`nice boobs`);
			} else {
				r.push(`trim chest`);
			}
			r.push(`against your legs, and nuzzles ${his} warm nose and wet tongue against`);
			if (V.PC.balls >= 9) {
				r.push(`your oversized nuts.`);
			} else if (V.PC.vagina !== -1) {
				r.push(`your moist folds.`);
			} else {
				r.push(`your ballsack.`);
			}
			r.push(`You run a languid hand through ${his} hair, but soon relax into a pleasant, tired fugue, letting yourself enjoy ${his} ministrations. You almost drift off under the slow oral loving, but a sudden coolness against you brings you partially awake again: ${he}'s taken ${his} mouth off you, leaving the night air against your saliva-wetted`);
			if (V.PC.vagina !== -1) {
				r.push(`pussylips.`);
			} else {
				r.push(`cock.`);
			}
			r.push(`${He} quickly realizes the error, and applies ${himself} diligently to you, never letting the warm feeling die down again. You orgasm twice, which ${he} absorbs without stopping, looking up at you with an expression that's unidentifiable in the gloom. But when you finally reach down and give ${his}`);
			if (eventSlave.belly >= 10000) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly a light pat`);
			} else {
				r.push(`shoulder a little tug`);
			}
			r.push(`to let ${him} know that's enough, ${he} <span class="mediumaquamarine">cuddles up close to you</span> without hesitation.`);
			eventSlave.trust += 4;
			seX(eventSlave, "oral", V.PC, "penetrative");
			r.toParagraph();
			return r.container();
		}

		function surprise() {
			const r = new SpacedTextAccumulator();
			r.push(`You uncoil from under the sheet like a striking serpent, tackling ${his} ${eventSlave.skin} body off the edge of the bed`);
			if (eventSlave.bellyPreg >= 1500) {
				r.addToLast(`, twisting in midair,`);
			}
			r.push(`and onto the floor with a crash. The wind is knocked out of ${him} with an audible grunt as`);
			if (eventSlave.bellyPreg >= 1500) {
				r.push(`${he} lands on top of you and rolls over.`);
			} else {
				r.push(`you land on top of ${him}.`);
			}
			if (eventSlave.bellyPreg < 1500) {
				if (eventSlave.belly >= 10000) {
					r.push(`${His} ${belly} belly squashes out to either side of ${his} torso,`);
				} else if (eventSlave.boobs > 2000) {
					r.push(`${His} huge breasts squash out to either side of ${his} torso,`);
				} else if (eventSlave.dick > 0) {
					r.push(`${He} shifts desperately to get some weight off ${his} trapped dick,`);
				} else {
					r.push(`${He} squirms reflexively,`);
				}
			} else if (eventSlave.boobs > 2000) {
				r.push(`${His} huge breasts flop to either side of ${his} torso,`);
			} else {
				r.push(`${He} squirms reflexively,`);
			}
			r.push(`but your attention is directed farther down: you wrap an arm around ${his} hips, hoist ${him}, shove a cushion under ${his} middle, and spread ${his}`);
			if (eventSlave.butt > 5) {
				r.push(`inconveniently plush butt`);
			} else if (eventSlave.butt > 2) {
				r.push(`big buttocks`);
			} else {
				r.push(`trim buttocks`);
			}
			r.push(`with one hand to get at ${his} pussy. You feel ${him} take a deep breath under you, and ${he} lets it out as you press`);
			if (V.PC.dick === 0) {
				r.push(`the tip of your strap-on`);
			} else {
				r.push(`your dickhead`);
			}
			r.push(`against ${his} moist slit. The relaxation`);
			if (eventSlave.vagina > 2) {
				r.push(`gapes ${his} vagina wide, welcoming you in without any resistance at all.`);
			} else if (eventSlave.vagina > 1) {
				r.push(`welcomes you in, offering you only a delicious bit of resistance to push against.`);
			} else {
				r.push(`welcomes you in, though ${he} does buck a little at the first penetration.`);
			}
			r.push(`You surprised ${him} badly, but the adrenaline melts into arousal as you pump in and out of ${his} cunt. ${He} grinds shamelessly against the cushion; since ${he}'s being a good ${girl}, you reach up to your bedside without giving ${him} any respite to fetch`);
			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`an egg vibe. You shove it between ${him} and the cushion to give ${his} limp dick some stimulation.`);
			} else if (eventSlave.dick > 4) {
				r.push(`a huge onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
			} else if (eventSlave.dick > 0) {
				r.push(`an onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
			} else if (eventSlave.clit > 1) {
				r.push(`a shallow vibrating onahole. You push it between ${him} and the cushion so ${he} can stuff ${his} pseudophallic clit into it.`);
			} else if (canDoAnal(eventSlave)) {
				r.push(`an egg vibe. You push it into ${his} ass to stimulate ${his}`);
				if (eventSlave.prostate > 0) {
					r.push(`prostate.`);
				} else {
					r.push(`insides.`);
				}
			} else {
				r.push(`an egg vibe. You place it under ${him} so it can stimulate the sensitive skin between ${his} legs, just beneath ${his} asspussy.`);
			}
			if (!canTalk(eventSlave)) {
				r.push(`${His} hands jerk out a spastic thank you in the darkness,`);
			} else {
				r.push(`${He} coos a wordless thanks,`);
			}
			r.push(`and ${he} starts humping away. If ${he} thought you were too tired for sex, you certainly impress ${him}; as you spend an hour exhausting yourself against ${his} vagina, ${he} wonders whether ${his} ${getWrittenTitle(eventSlave)} is ever too tired to fuck.`);
			eventSlave.devotion += 4;
			r.push(VCheck.Vaginal(eventSlave, 1));
			r.toParagraph();
			return r.container();
		}

		function surprise2() {
			const r = new SpacedTextAccumulator();
			r.push(`You uncoil from under the sheet like a striking serpent, tackling ${his} ${eventSlave.skin} body off the edge of the bed`);
			if (eventSlave.bellyPreg >= 1500) {
				r.addToLast(`, twisting in midair,`);
			}
			r.push(`and onto the floor with a crash. The wind is knocked out of ${him} with an audible grunt as`);
			if (eventSlave.bellyPreg >= 1500) {
				r.push(`${he} lands on top of you and rolls over.`);
			} else {
				r.push(`you land on top of ${him}.`);
			}
			if (eventSlave.bellyPreg < 1500) {
				if (eventSlave.belly >= 10000) {
					r.push(`${His} ${belly} belly squashes out to either side of ${his} torso,`);
				} else if (eventSlave.boobs > 2000) {
					r.push(`${His} huge breasts squash out to either side of ${his} torso,`);
				} else if (eventSlave.dick > 0) {
					r.push(`${He} shifts desperately to get some weight off ${his} trapped dick,`);
				} else {
					r.push(`${He} squirms reflexively,`);
				}
			} else if (eventSlave.boobs > 2000) {
				r.push(`${His} huge breasts flop to either side of ${his} torso,`);
			} else {
				r.push(`${He} squirms reflexively,`);
			}
			r.push(`but your attention is directed farther down: you wrap an arm around ${his} hips, hoist ${him}, shove a cushion under ${his} middle, and spread ${his}`);
			if (eventSlave.butt > 5) {
				r.push(`inconveniently plush butt`);
			} else if (eventSlave.butt > 2) {
				r.push(`big buttocks`);
			} else {
				r.push(`trim buttocks`);
			}
			r.push(`with one hand to get at ${his} asshole. You feel ${him} take a deep breath under you, and ${he} lets it out as you press`);
			if (V.PC.dick === 0) {
				r.push(`the tip of your strap-on`);
			} else {
				r.push(`your dickhead`);
			}
			r.push(`against ${his} anus. The relaxation`);
			if (eventSlave.anus > 2) {
				r.push(`gapes ${his} asspussy wide, welcoming you in without any resistance at all.`);
			} else if (eventSlave.anus > 1) {
				r.push(`welcomes you in, offering you only a delicious bit of resistance to push against.`);
			} else {
				r.push(`saves ${him} from too much anal pain, though ${he} does buck a little at the first penetration.`);
			}
			r.push(`You surprised ${him} badly, but the adrenaline melts into arousal as you pump in and out of ${his} ass. ${He} grinds shamelessly against the cushion; since ${he}'s being a good ${girl}, you reach up to your bedside without giving ${him} any respite to fetch`);
			if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`an egg vibe. You shove it between ${him} and the cushion to give ${his} limp dick some stimulation.`);
			} else if (eventSlave.dick > 4) {
				r.push(`a huge onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
			} else if (eventSlave.dick > 0) {
				r.push(`an onahole. You push it between ${him} and the cushion so ${he} can fuck it.`);
			} else if (eventSlave.clit > 1) {
				r.push(`a shallow vibrating onahole. You push it between ${him} and the cushion so ${he} can stuff ${his} pseudophallic clit into it.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`an egg vibe. You place it under ${him} so it can stimulate the sensitive skin between ${his} legs, just beneath ${his} asspussy.`);
			} else {
				r.push(`an egg vibe. You push it between ${him} and the cushion so ${he} can rub ${his}`);
				if (!canDoVaginal(eventSlave)) {
					r.push(`chaste`);
				}
				r.push(`pussy against it.`);
			}
			if (!canTalk(eventSlave)) {
				r.push(`${His} hands jerk out a spastic thank you in the darkness,`);
			} else {
				r.push(`${He} coos a wordless thanks,`);
			}
			r.push(`and ${he} starts humping away. If ${he} thought you were too tired for sex, you certainly impress ${him}; as you spend an hour exhausting yourself against ${his} asshole, ${he} wonders whether ${his} ${getWrittenTitle(eventSlave)} is ever too tired to fuck a butt.`);
			eventSlave.devotion += 4;
			r.push(VCheck.Anal(eventSlave, 1));
			r.toParagraph();
			return r.container();
		}
	}
};

repo_name: Mirarara/fc

license: mit


code:
App.Events.RESSShowerSlip = class RESSShowerSlip extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.PC.belly < 5000,
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.trust > 20,
				s => s.devotion > 50,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`finishes ${his} morning shower and sleepily turns to dry off. ${He} slips a little on the moist bathroom floor, trips over ${his} own feet, and starts to stumble. ${His} fall is immediately arrested as ${he}'s caught by a pair of strong`,
		);
		if (PC.title === 0) {
			r.push(`yet feminine`);
		}
		r.push(`arms. Coming to rest against`);
		if (PC.boobs >= 1400 && PC.belly >= 10000) {
			r.push(`a pair of enormous`);
			if (PC.boobsImplant > 0) {
				r.push(`air bags`);
			} else {
				r.push(`pillowlike breasts`);
			}
			r.push(`and a hugely pregnant belly,`);
		} else if (PC.belly >= 10000) {
			r.push(`a hugely pregnant middle,`);
		} else if (PC.boobs >= 300) {
			r.push(`a pair of`);
			if (PC.boobsImplant === 0) {
				r.push(`soft`);
			} else {
				r.push(`firm`);
			}
			r.push(`breasts,`);
		} else if (PC.title === 0) {
			r.push(`a flat chest,`);
		} else {
			r.push(`a well-muscled chest,`);
		}
		r.push(`${he}`);
		if (canSee(eventSlave)) {
			r.push(`looks up to find ${himself} gazing into your eyes.`);
		} else {
			r.push(`feels ${his} savior and recognizes these features as yours.`);
		}
		if (!canTalk(eventSlave)) {
			r.push(`${He} mouths a surprised but genuine thank you.`);
		} else {
			r.push(
				Spoken(eventSlave, `"Thanks, ${Master},"`),
				`${he} murmurs, getting over ${his} surprise and relief.`
			);
		}

		r.toParagraph();

		r.push(`Opportunities for gallantry didn't use to fall into your lap like this, but with a harem of busy sex slaves living and working in close proximity, they're common. For ${his} part, ${eventSlave.slaveName} doesn't seem to mind acting out bad romantic comedy. ${He} shows no sign of getting back to ${his} own feet, and nuzzles ${his} ${eventSlave.skin} cheek against your`);
		if (PC.belly >= 10000) {
			r.push(`taut middle,`);
		} else if (PC.boobs >= 300) {
			r.push(`boob,`);
		} else if (PC.title === 0) {
			r.push(`cute nipple,`);
		} else {
			r.push(`chest,`);
		}
		if (canSee(eventSlave)) {
			r.push(`staring`);
		} else {
			r.push(`looking`);
		}
		r.push(`up at you coquettishly. Apparently worrying that ${his} sexual availability isn't obvious enough, ${he} catches ${his}`);
		if (eventSlave.lips > 40) {
			r.push(`enormous`);
		} else if (eventSlave.lips > 20) {
			r.push(`plush`);
		} else {
			r.push(`soft`);
		}
		r.push(`lower lip behind ${his} teeth and bats ${his} eyes at you.`);
		if (eventSlave.teeth === "straightening braces" || eventSlave.teeth === "cosmetic braces") {
			r.push(`${His} braces make the flirty gesture look amusingly innocent`);
			if (eventSlave.visualAge > 35) {
				r.push(`for such a mature ${woman}`);
			}
			r.addToLast(`.`);
		} else if (eventSlave.teeth === "pointy") {
			r.push(`Somehow ${he} manages to make this look cute despite ${his} carnivorously pointed teeth.`);
		} else if (eventSlave.teeth === "fangs") {
			r.push(`Somehow ${he} manages to make this look cute despite ${his} fangs.`);
		} else if (eventSlave.teeth === "fang") {
			r.push(`${His} lone fang makes the look more mischievous then ${he} intends.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Carry ${him} to where ${he} needs to go`, carry),
			((canDoAnal(eventSlave) || canDoVaginal(eventSlave)) && eventSlave.belly < 15000)
				? new App.Events.Result(`Scoop ${him} up and fuck ${him}`, scoop, virginityWarning())
				: new App.Events.Result(),
		]);

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

		function carry() {
			let wasCarried = true;
			const r = new SpacedTextAccumulator();
			r.push(`You scoop ${him} up into a bridal carry. ${He}`);
			if (eventSlave.voice === 0) {
				r.push(`gasps, since ${he} can't squeal,`);
			} else {
				r.push(`squeals cutely,`);
			}
			r.push(`holding on for dear life, and keeps ${his} face nestled against ${his} ${getWrittenTitle(eventSlave)}.`);
			if (eventSlave.belly >= 300000) {
				if (eventSlave.bellyPreg > 3000) {
					r.push(`${His} ${belly} pregnancy`);
				} else {
					r.push(`${His} ${belly} belly`);
				}
				r.push(`makes holding ${him} extremely difficult, not including just how much it weighs, so you're forced to quickly return ${him} to ${his} feet.`);
				wasCarried = false;
			} else if (eventSlave.boobs > 40000) {
				r.push(`${His} expansive tits not only weigh ${him} down, but also keep you from holding ${him} up for long.`);
				wasCarried = false;
			} else if (eventSlave.weight > 160) {
				r.push(`${He}'s certainly an armful and a little too fat for you to hold for long.`);
				wasCarried = false;
			} else if (eventSlave.balls > 200) {
				r.push(`${His} tremendous balls serve as an imposing anchor, quickly forcing you to lower ${him} back to the ground.`);
				wasCarried = false;
			} else if (eventSlave.dick > 30) {
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, preventing you from really carrying ${him} very far.`);
					wasCarried = false;
				}
			} else if (eventSlave.belly >= 100000) {
				if (eventSlave.bellyPreg > 3000) {
					if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
						r.push(`${His} pregnancy is truly gigantic, but you're ${strong} enough to carry ${him} some distance.`);
					} else {
						r.push(`${His} pregnancy is truly gigantic and a little too big for you to safely carry without the risk of dropping, quickly forcing you to lower ${him}.`);
						wasCarried = false;
					}
				} else {
					if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
						r.push(`${His} ${belly} belly is truly gigantic, but you're ${strong} enough to carry ${him} some distance.`);
					} else {
						r.push(`${His} ${belly} belly is truly an armful and a little to heavy for you to carry, quickly forcing you to lower ${him}.`);
						wasCarried = false;
					}
				}
			} else if (eventSlave.boobs > 25000) {
				r.push(`${His} enormous boobs`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and are awkward to manage, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`add tremendously to ${his} weight and are awkward to manage, quickly forcing you to lower ${him}.`);
					wasCarried = false;
				}
			} else if (eventSlave.weight > 130) {
				r.push(`${He}'s a`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`fatty, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`fatty and a little too big and heavy for you to hold for long.`);
					wasCarried = false;
				}
			} else if (eventSlave.balls > 100) {
				r.push(`${His} enormous balls`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and dangle ponderously, but you're ${strong} enough to carry ${him} some distance, even though you have to step awkwardly to avoid kneeing ${his} sensitive sack.`);
				} else {
					r.push(`add tremendously to ${his} weight and dangle ponderously, quickly forcing you to lower ${him} or risk accidentally kneeing the sensitive sack.`);
					wasCarried = false;
				}
			} else if (eventSlave.dick > 20) {
				r.push(`${His} dangling cock adds tremendously to ${his} weight and is awkward to walk with, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.butt > 18) {
				r.push(`${His} expansive ass`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, quickly forcing you to lower ${him}.`);
					wasCarried = false;
				}
			} else if (eventSlave.boobs > 8000) {
				r.push(`${His} boobs add tremendously to ${his} weight, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.weight > 95) {
				r.push(`${He}'s got some extra weight on ${him}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.height > 180) {
				r.push(`${He}'s a big ${girl}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.weight > 30) {
				r.push(`${He}'s a chubby ${girl}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.bellyPreg >= 10000) {
				r.push(`${He}'s heavily pregnant, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.bellyImplant >= 10000) {
				r.push(`${His} belly is greatly laden with inert filler, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.bellyFluid >= 10000) {
				r.push(`${His} belly is greatly laden with ${eventSlave.inflationType}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.height > 160) {
				r.push(`${He}'s no little ${girl}, but you're ${strong} enough to carry ${him}.`);
			} else if (eventSlave.weight > 10) {
				r.push(`${He}'s got a deliciously plush body, but you're ${strong} enough to carry ${him}.`);
			} else {
				r.push(`You could carry the little slave like this as long as you like.`);
			}
			if (wasCarried) {
				r.push(`Knowing that ${he}'ll need to get dressed before the next part of ${his} day, you carry ${him} to`);
				if (eventSlave.rules.living === "luxurious") {
					r.push(`${his} room.`);
				} else {
					r.push(`the part of the common area with where clothes are kept.`);
				}
				r.push(`${He} remains perfectly limp, letting ${himself} be carried without a word. When you set ${him} on ${his} feet,`);
			} else {
				r.push(`Knowing that ${he}'ll need to get dressed before the next part of ${his} day, you help ${him} to`);
				if (eventSlave.rules.living === "luxurious") {
					r.push(`${his} room.`);
				} else {
					r.push(`the part of the common area with where clothes are kept.`);
				}
				r.push(`${He} lets you do most of the work, letting ${himself} be guided without a word. When you set ${him} on ${his} bed,`);
			}
			r.push(`there's a little unaccountable moisture in ${his} ${App.Desc.eyesColor(eventSlave)} <span class="trust inc">for some reason.</span> ${He} gives you a kiss and thanks you prettily.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}

		function scoop() {
			const r = new SpacedTextAccumulator();
			r.push(`You squat down, and ${he} plants ${his} feet, expecting to be given a swat on the bottom and sent on ${his} way. Instead, you run your hands down ${his}`);
			if (eventSlave.weight > 130) {
				r.push(`well-padded`);
			} else if (eventSlave.weight > 95) {
				r.push(`padded`);
			} else if (eventSlave.muscles > 30) {
				r.push(`heavily muscled`);
			} else if (eventSlave.weight > 30) {
				r.push(`chubby`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`thighs, producing a shiver from the ${SlaveTitle(eventSlave)}, and lift ${him} up against your chest, pinning ${him} there with your hands supporting the backs of ${his} knees. Giggling`);
			if (eventSlave.voice === 0) {
				r.push(`mutely`);
			}
			r.addToLast(`, ${he} finds ${himself} held in a fetal position with ${his} back pressed against your`);
			if (PC.boobs >= 300) {
				r.push(`tits.`);
			} else {
				r.push(`chest.`);
			}
			if (eventSlave.boobs > 40000) {
				r.push(`${His} expansive tits not only weigh ${him} down, but also force you to push ${him} against the shower wall for added support.`);
			} else if (eventSlave.weight > 160) {
				r.push(`${He}'s certainly an armful and a little too fat, forcing you to push ${him} against the shower wall for added support.`);
			} else if (eventSlave.balls > 200) {
				r.push(`${His} tremendous balls serve as an imposing anchor, quickly forcing you to push ${him} against the shower wall for added support.`);
			} else if (eventSlave.dick > 30) {
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.boobs > 25000) {
				r.push(`${His} enormous boobs`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and are awkward to manage, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`add tremendously to ${his} weight and are awkward to manage, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.weight > 130) {
				r.push(`${He}'s a`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`fatty, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`fatty and a little too big and heavy, quickly forcing you to push ${him} against the shower wall with a wet slap.`);
				}
			} else if (eventSlave.balls > 100) {
				r.push(`${His} enormous balls`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and dangle ponderously, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`add tremendously to ${his} weight and dangle ponderously, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.dick > 20) {
				r.push(`${His} dangling cock adds tremendously to ${his} weight and dangles heavily, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.butt > 18) {
				r.push(`${His} expansive ass`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.boobs > 8000) {
				r.push(`${His} boobs add tremendously to ${his} weight, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.weight > 95) {
				r.push(`${He}'s got some extra weight on ${him}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.height > 180) {
				r.push(`${He}'s a big ${girl}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.weight > 30) {
				r.push(`${He}'s a chubby ${girl}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.bellyPreg >= 10000) {
				r.push(`${He}'s heavily pregnant, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.bellyImplant >= 10000) {
				r.push(`${His} belly is greatly laden with inert filler, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.bellyFluid >= 10000) {
				r.push(`${His} belly is greatly laden with ${eventSlave.inflationType}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.height > 160) {
				r.push(`${He}'s no little ${girl}, but you're ${strong} enough to lift ${him} with ease.`);
			} else if (eventSlave.weight > 10) {
				r.push(`${He}'s got a deliciously plush body, but you're ${strong} enough to lift ${him} with ease.`);
			} else {
				r.push(`You can hold the little slave like this as long as you like.`);
			}
			r.push(`You shift your grip to hold ${him} with one hand so you can`);
			if (PC.dick !== 0) {
				r.push(`maneuver your cock inside ${him}, and then resume your original hold so you can slide ${him} up and down your shaft.`);
				if (PC.vagina !== -1) {
					r.push(`You make sure ${he}'s really hilted at the height of each stroke, putting some nice pressure on your pussy.`);
				}
			} else {
				r.push(`slide your fingers inside ${his}`);
				if (canDoVaginal(eventSlave)) {
					r.push(`pussy,`);
				} else {
					r.push(`ass,`);
				}
				r.push(`since you're not putting ${him} down to get a strap-on. Knowing ${he} can't reach your cunt to return the favor like this, ${he} relaxes and lets you play with ${him}.`);
			}
			r.push(`Helpless, ${he} has nothing to do but`);
			if (canSee(eventSlave)) {
				r.push(`watch ${himself} get fucked in a full length mirror. ${He} stares, fascinated, and the sight`);
			} else {
				r.push(`let ${his} hands wander across ${his} body. Teasing ${his} nipples`);
				if (eventSlave.bellyPreg >= 5000) {
					r.push(`and pregnant belly`);
				}
			}
			r.push(`gets ${him} off quickly,`);
			if (eventSlave.dick === 0) {
				r.push(`${his} muscles tensing prettily with female orgasm.`);
			} else if (eventSlave.chastityPenis === 1) {
				r.push(`a dribble of cum flowing from the tip of ${his} chastity cage.`);
			} else if (canAchieveErection(eventSlave)) {
				r.push(`${his} stiffly waving cock jetting cum onto the floor.`);
			} else if (eventSlave.dick > 6) {
				r.push(`${his} absurd cock twitching lazily as ${his} ejaculate makes it down its length.`);
			} else if (eventSlave.balls === 0) {
				r.push(`${his} bitchclit dribbling weakly.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${his} limp dick twitching as ${he} cums.`);
			} else {
				r.push(`making ${him} shudder.`);
			}
			r.push(`When you're done, you let ${him} down, and the first thing ${he} does is spin in your embrace to give you an <span class="devotion inc">earnest kiss.</span>`);
			r.push(VCheck.Simple(eventSlave, 1));
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.rules.release.masturbation === 1,
				s => s.dick > 4,
				hasAnyArms,
				canAchieveErection,
				s => s.belly < 10000,
				s => s.chastityPenis !== 1,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`The showers your slaves use are well vented and transparent walled so that you can see their occupants clearly, even from your desk. Working late at night, you see`,
			contextualIntro(PC, eventSlave, true),
			`sitting hunched under the water in one of the showers, with ${his} back to you. You tell your desk to focus on ${him}, and you are rewarded with three different angles of ${eventSlave.slaveName} giving ${himself} a blowjob. ${He} has to bend over very hard`,
		);
		if (eventSlave.belly >= 5000) {
			r.push(`and at a very awkward angle`);
		}
		r.push(`to get the tip of ${his} huge`);
		if (V.seeRace === 1) {
			r.push(eventSlave.race);
		}
		r.push(`dick`);
		if (eventSlave.belly >= 5000) {
			r.push(`around ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly and`);
		}
		r.push(`into ${his} mouth, but ${he}'s obviously enjoying it all the same. It's not against the rules for ${him} to masturbate; ${he}'s just found an impressive way of doing it.`);
		if (eventSlave.scrotum > 0) {
			if (eventSlave.balls >= 10) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} inhuman balls, massaging and caressing as much of them ${he} as ${he} can with`);
				if (hasBothArms(eventSlave)) {
					r.push(`both hands.`);
				} else {
					r.push(`${his} hand.`);
				}
			} else if (eventSlave.balls > 8) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} monster balls, massaging and caressing them with`);
				if (hasBothArms(eventSlave)) {
					r.push(`both hands.`);
				} else {
					r.push(`${his} hand.`);
				}
			} else if (eventSlave.balls > 5) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} massive balls, cupping them and squeezing gently.`);
			} else if (eventSlave.balls > 3) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} big balls, rolling them around and squeezing them gently.`);
			} else if (eventSlave.balls > 1) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} balls, massaging them with`);
				if (hasBothArms(eventSlave)) {
					r.push(`one`);
				} else {
					r.push(his);
				}
				r.push(`hand.`);
			}
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Enter the shower and take ${him}`, shower, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			(PC.dick !== 0)
				? new App.Events.Result(`The only dick ${he} should suck is ${his} ${getWrittenTitle(eventSlave)}'s`, suck)
				: new App.Events.Result(),
			(eventSlave.belly < 5000) && (canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`See if ${he} can do that while you take ${him}`, take, virginityWarning())
				: new App.Events.Result(),
		]);

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

		function shower() {
			const r = new SpacedTextAccumulator();
			r.push(`${He}'s so occupied that ${he} doesn't`);
			if (canHear(eventSlave)) {
				r.push(`hear`);
			} else {
				r.push(`notice`);
			}
			r.push(`you until you seize ${him} under the armpits and drag ${him} to ${his} feet. ${His} massive dickhead pops free of ${his} mouth and ${he} squeaks in surprise as you push ${his}`);
			if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				} else {
					r.push(`rounded`);
				}
				r.push(`body`);
			}
			r.push(`against the wall of the shower and stuff your`);
			if (PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`dick`);
			}
			r.push(`up ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`cunt.`);
			} else {
				r.push(`ass.`);
			}
			r.push(`${He} was already very close to orgasm, and the stimulation of ${his} dick rubbing against the warm, wet wall`);
			if (eventSlave.belly >= 1500) {
				r.push(`of the shower and ${his} belly,`);
			} else {
				r.push(`of the shower,`);
			}
			r.push(`not to mention the feeling of being`);
			if (canDoVaginal(eventSlave)) {
				r.push(`fucked,`);
			} else {
				r.push(`buttfucked,`);
			}
			r.push(`is enough that ${he} climaxes quickly.`);
			if (eventSlave.balls === 3) {
				r.push(`${His} huge load coats the shower wall with cum.`);
			}
			r.push(`You pull out and let ${him} finish by`);
			if (PC.dick === 0) {
				r.push(`giving you oral`);
			} else {
				r.push(`sucking your dick`);
				if (PC.vagina !== -1) {
					r.push(`and eating your pussy`);
				}
			}
			r.addToLast(`, since ${he} started by sucking ${himself}. <span class="devotion inc">${He} has become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0) {
					r.push(`<span class="virginity loss">This breaks in ${eventSlave.slaveName}'s virgin pussy.</span>`);
					eventSlave.vagina = 1;
					r.push(`<span class="devotion inc">${He} enjoys losing ${his} cherry to you.</span>`);
					eventSlave.devotion += 4;
				}
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				if (eventSlave.anus === 0) {
					r.push(`<span class="virginity loss">This breaks in ${eventSlave.slaveName}'s virgin ass.</span>`);
					eventSlave.anus = 1;
					r.push(`<span class="devotion inc">${He} enjoys losing ${his} butt cherry to you.</span>`);
					eventSlave.devotion += 4;
				}
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.toParagraph();
			return r.container();
		}

		function suck() {
			const r = new SpacedTextAccumulator();
			r.push(`${He}'s so occupied that ${he} doesn't`);
			if (canHear(eventSlave)) {
				r.push(`hear`);
			} else {
				r.push(`notice`);
			}
			r.push(`you until you seize ${his} hair and pull ${his} head back. ${His} massive dickhead pops free of ${his} mouth and ${he} squeaks in surprise. The noise is cut off by a gag as you ram yourself down ${his} throat. ${He} plays with your`);
			if (PC.vagina !== -1) {
				r.push(`cunt`);
			} else {
				r.push(`balls`);
			}
			r.push(`as you facefuck ${him} and jacks off with ${his} other hand. ${He} was so close when you intruded that ${he} cums long before you do. There's a lot of cum in the shower when you're through.`);
			if (eventSlave.balls === 3) {
				r.push(`${His} huge balls made an especially major contribution.`);
			}
			r.push(`<span class="devotion inc">${He} has become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			r.toParagraph();
			return r.container();
		}

		function take() {
			const r = new SpacedTextAccumulator();
			r.push(`You interrupt ${eventSlave.slaveName} and make ${him} lie on a nearby bed. After some preparatory stretching, during which ${his} frustrated erection flops forlornly around, you manage to get both ${his} ankles behind ${his} head. In this position ${he} manages to resume sucking on the head of ${his} penis as you slip into ${him}.`);
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.push(`So contorted, ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy`);
			} else {
				r.push(`anus`);
			}
			r.push(`is not well angled for comfortable`);
			if (canDoVaginal(eventSlave)) {
				r.push(`penetration,`);
			} else {
				r.push(`sodomy,`);
			}
			r.push(`so ${he} is soon moaning and grunting into ${his} cock as you fuck ${him}.`);
			r.push(`${He} finishes`);
			if (eventSlave.balls >= 3) {
				r.push(`${his} enormous ejaculation`);
			}
			r.push(`into ${his} own mouth and then`);
			if (PC.dick === 0) {
				r.push(`finds ${himself} giving you oral directly, since you pulled your strap-on off.`);
			} else {
				r.push(`receives your load into ${his} now-brimming throat.`);
				if (PC.vagina !== -1) {
					r.push(`${He} barely has time to swallow before you press your pussy against ${his} mouth.`);
				}
			}
			r.push(`<span class="devotion inc">${His} devotion to you has increased.</span>`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.devotion <= 20,
				s => s.devotion > -10,
				s => s.assignment !== Job.QUARTER,
				s => s.rules.living === "spare",
			]
		];
	}

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

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

		App.Events.addParagraph(node, [
			`Passing through the slave dormitory at night, you run your eyes down the row of sleeping chattel. The light here is low, but it's not dark. Slaves need to be able to find the bathroom, slaves on late assignments need to find their beds, and those permitted to do so need to be able to select slaves for sex.`,
			contextualIntro(V.PC, eventSlave, true, false, true),
			`catches your eye. The dormitory is kept at a pleasant temperature so that the slaves, who of course sleep nude, are comfortable on their bedrolls covered by a single sheet, or nothing at all. ${He} probably went to sleep with ${his} sheet pulled up to ${his} chin, which is normal behavior for slaves who aren't yet accepting of their status as compulsory sex objects, but ${he}'s shrugged it down. Half ${his} torso is bare.`
		]);
		let r = [];
		r.push(`The dim blue light plays across ${his} ${eventSlave.skin} skin.`);
		if (eventSlave.boobs > 2000) {
			r.push(`${His} massive boob on that side is slightly shifted by each breath.`);
		} else if (eventSlave.boobs > 800) {
			r.push(`${His} breast on that side rises and falls with each breath.`);
		} else {
			r.push(`That side of ${his} chest rises and falls with each breath.`);
		}
		if (eventSlave.belly >= 5000) {
			r.push(`${His} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly is only partially covered by the sheet, leaving most of it visible.`);
		}
		r.push(`${He}'s sleeping soundly, ${his} breaths coming deep and slow. Most slaves where ${he} is mentally are troubled by bad dreams, but the poor ${girl} is evidently too tired for that.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Grope ${his} boob`, grope),
			(eventSlave.belly >= 5000 || eventSlave.weight > 30)
				? new App.Events.Result(`Rub ${his} belly`, rub)
				: new App.Events.Result(),
			(V.PC.dick !== 0)
				? new App.Events.Result(`Cum on ${his} face`, cum)
				: new App.Events.Result(`Squirt on ${his} face`, squirt),
			new App.Events.Result(`Just watch ${him} for a little while`, watch),
		]);

		function grope() {
			r = [];
			r.push(`${His} eyes fly open as ${he} feels someone groping ${him}.`);
			if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
				r.push(`You're mauling ${his} fake boob, squeezing it and making the skin of ${his} breast, which is already stretched rather taut by the implant, stretch a bit farther.`);
			} else if (eventSlave.boobs > 3000) {
				r.push(`You're hefting and massaging ${his} mass of breastflesh, playing with ${his}`);
				if ((eventSlave.boobsImplant/eventSlave.boobs) < .60) {
					r.push(`mostly`);
				}
				r.push(`natural boob, making ${his} huge soft udder bounce and jiggle.`);
			} else if (eventSlave.lactation > 0) {
				r.push(`You're kneading and massaging ${his} udder, and the milk begins to`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`bead at`);
				} else {
					r.push(`leak from`);
				}
				r.push(`the cow's nipple.`);
			} else if (eventSlave.boobs > 300) {
				r.push(`You've got ${his} whole tit in your hands, jiggling and squeezing the entire thing.`);
			} else {
				r.push(`You're massaging and squeezing ${his} flat chest.`);
			}
			r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
			if (!canSee(eventSlave)) {
				r.push(`recognizes your familiar`);
				if (canSmell(eventSlave)) {
					r.push(`smell`);
				} else {
					r.push(`touch`);
				}
				r.push(`and`);
			}
			r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
				r.push(`Though ${he}'s smart,`);
			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
				r.push(`Though ${he}'s not dumb,`);
			} else {
				r.push(`${He}'s an idiot, and`);
			}
			r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
			switch (eventSlave.nipples) {
				case "inverted":
					r.push(`painfully protruding ${his} fully inverted nipple. ${He} puts up with even that, though ${he} cries a little as it pops out.`);
					break;
				case "partially inverted":
					r.push(`painfully protruding ${his} partially inverted nipple. ${He} puts up with that, too, though ${he} winces as it pops out.`);
					break;
				case "huge":
					r.push(`rolling ${his} huge nipple between a thumb and forefinger, hard enough to hurt. ${He} accepts the mammary abuse.`);
					break;
				case "fuckable":
					r.push(`forcing your entire fist into ${his} nipple. ${He} accepts the stimulation as best ${he} can.`);
					break;
				default:
					r.push(`playing with ${his} nipple, pinching it hard enough to hurt. ${He} accepts the mammary abuse.`);
			}
			r.push(`Satisfied, you leave ${him} to get back to sleep as best ${he} can.`);
			eventSlave.devotion += 4;
			if (eventSlave.lactation > 0) {
				eventSlave.lactationDuration = 2;
				eventSlave.boobs -= eventSlave.boobsMilk;
				eventSlave.boobsMilk = 0;
			}
			return r;
		}

		function rub() {
			r = [];
			if (eventSlave.bellyPreg >= 5000) {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, life-rounded, stomach.`);
				if (eventSlave.weight > 10) {
					r.push(`You're massaging and teasing ${his} huge, soft belly.`);
				} else if (eventSlave.muscles > 5) {
					r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`);
				} else {
					r.push(`You're massaging and teasing ${his} taut belly.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
				if (eventSlave.weight > 10) {
					r.push(`sinking your hands into ${his} fat to get a good feel of the life growing within.`);
				} else {
					r.push(`feeling for the life growing within ${him}.`);
				}
				if (eventSlave.weight > 30) {
					r.push(`Though it takes some groping before you are met with a kick from ${his} unborn child.`);
				} else if (eventSlave.pregType < 3) {
					r.push(`It doesn't take long before you are met with a kick from ${his} unborn child.`);
				} else {
					r.push(`${He} is so full of children that your ministrations are met with a hail of motion.`);
				}
				if (eventSlave.pregSource === -1) {
					r.push(`Smiling at how active your children are,`);
				} else {
					r.push(`Satisfied,`);
				}
			} else if (eventSlave.bellyImplant >= 5000) {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly} stomach.`);
				if (eventSlave.weight > 10) {
					r.push(`You're massaging and teasing ${his} huge, soft belly.`);
				} else if (eventSlave.muscles > 5) {
					r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`);
				} else {
					r.push(`You're massaging and teasing ${his} taut belly.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
				if (eventSlave.weight > 10) {
					r.push(`sinking your hands into ${his} fat to get a good feel of the implant hidden within.`);
				} else {
					r.push(`feeling up the implant within ${him}.`);
				}
				if (eventSlave.weight > 30) {
					r.push(`Though it takes some groping before you locate the firm sphere.`);
				} else if (eventSlave.belly < 10000) {
					r.push(`It doesn't take long for you to have a solid grip on the firm sphere.`);
				} else {
					r.push(`It's so huge it's hard to miss, but that just gives you more room to poke and prod at.`);
				}
				r.push(`Satisfied,`);
			} else if (eventSlave.bellyFluid >= 5000) {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, ${eventSlave.inflationType}-filled stomach.`);
				if (eventSlave.weight > 10) {
					r.push(`You're massaging and jiggling ${his} huge, soft belly, enjoying the sounds it makes as you move it.`);
				} else if (eventSlave.muscles > 5) {
					r.push(`You're massaging and jiggling ${his} taut belly and stretched abs, enjoying the sounds it makes as you move it.`);
				} else {
					r.push(`You're massaging and jiggling ${his} taut belly, enjoying the sounds it makes as you move it.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
				if (eventSlave.weight > 10) {
					r.push(`sinking your hands into ${his} fat to get a good grip`);
				} else {
					r.push(`wrapping your hands around the sloshing globe`);
				}
				r.push(`and vigorously shaking. As ${his} gut's groaning from the sudden shift of its contents dies down, you gently apply pressure to the bloated organ, careful to only cause ${his} discomfort and not to disgorge ${his} contents. Satisfied,`);
			} else {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his}`);
				if (eventSlave.weight > 190) {
					r.push(`expansive belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and struggling to find ${his} belly button.`);
				} else if (eventSlave.weight > 160) {
					r.push(`massive, soft belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and hidden belly button.`);
				} else if (eventSlave.weight > 130) {
					r.push(`huge, soft belly. You're massaging and jiggling ${his} thick gut while teasing ${his} folds and hidden belly button.`);
				} else if (eventSlave.weight > 95) {
					r.push(`big soft belly. You're massaging and jiggling ${his} gut while teasing ${his} folds and hidden belly button.`);
				} else {
					r.push(`chubby middle. You're massaging and jiggling ${his} tiny gut.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for freezing submissively and letting you do what you like. You test ${his} compliance by roughly kneading ${his} pliant flesh, testing how well it can be molded into pleasurable valleys and ravines. Satisfied,`);
			}
			r.push(`you leave ${him} to get back to sleep as best ${he} can.`);
			eventSlave.devotion += 4;
			return r;
		}

		function cum() {
			r = [];
			r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You fancy yourself a bit of a marks ${womanP}, and you don't feel the need to bend over ${him} to score good hits. Your load comes in three main jets: the first hits ${him} on the nipple, the second tracks up ${his} sternum and throat, and the third splashes full across ${his} face as ${his} eyes fly open`);
			if (V.PC.vagina !== -1) {
				r.push(r.pop() + `, each of these accompanied by some less directionally perfect girlcum`);
			}
			r.push(r.pop() + `. ${He} sputters with surprise and then outrage, but`);
			if (!canSee(eventSlave)) {
				r.push(`once ${he} recognizes your`);
				if (canTaste(eventSlave)) {
					r.push(`taste`);
				} else {
					r.push(`presence`);
				}
				r.push(`and`);
			} else {
				r.push(`then ${he}`);
			}
			r.push(`realizes who it is standing over ${him}`);
			if (canSee(eventSlave)) {
				r.push(`and`);
			} else {
				r.push(`does ${he}`);
			}
			r.push(`<span class="trust dec">freezes in terror.</span>`);
			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
				r.push(`${He}'s quick, and ${he} immediately realizes`);
			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
				r.push(`${He}'s not dumb, and ${he} quickly realizes`);
			} else {
				r.push(`${He} gradually manages to calculate`);
			}
			r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`);
			if (SlaveStatsChecker.checkForLisp(eventSlave)) {
				r.push(`lisps`);
			} else {
				r.push(`mumbles`);
			}
			r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your cum.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 2;
			return r;
		}

		function squirt() {
			r = [];
			r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You're on excellent terms with your cunt, and you know just what it takes to make yourself squirt. When you feel the heat building just right, you quickly straddle ${his} face without touching ${him}, angling yourself carefully and increasing the pace of your schlicking. In no time at all, a jet of femcum splashes onto ${his} face and down across ${his} chest. ${He} sputters with surprise and then outrage, but then ${he}`);
			if (canSee(eventSlave)) {
				r.push(`realizes whose pussy ${he}'s staring straight into`);
			} else {
				r.push(`recognizes your`);
				if (canTaste(eventSlave)) {
					r.push(`flavor`);
				} else {
					r.push(`presence`);
				}
			}
			r.push(`and <span class="trust dec">freezes in terror.</span>`);
			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
				r.push(`${He}'s quick, and ${he} immediately realizes`);
			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
				r.push(`${He}'s not dumb, and ${he} quickly realizes`);
			} else {
				r.push(`${He} gradually manages to calculate`);
			}
			r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`);
			if (SlaveStatsChecker.checkForLisp(eventSlave)) {
				r.push(`lisps`);
			} else {
				r.push(`mumbles`);
			}
			r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your pussyjuice.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 2;
			return r;
		}

		function watch() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You stand there for a while, watching the exhausted slave sleep. It's an oddly restful sight, and the aesthetics of ${his} slumbering little movements hold your attention for a time.`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
				r.push(`You watch the subtle movements going on within ${his} womb as well.`);
			}
			r.push(`After a while, you head to your own bed. Several of ${his} fellow slaves came and went as you watched ${him}, but if they're surprised by the sight, they have the presence of mind not to show it.`);
			App.Events.addParagraph(frag, r);
			App.Events.addParagraph(frag, [`One of them quietly lets ${him} know about the incident the next day, though, and the overall impact on ${his} mental state is surprisingly positive. In a more normal human setting, the news that someone watched ${him} sleep last night without ${his} consent or even knowledge at the time would disturb ${him} greatly. However, it's not uncommon for slaves in the dormitory to wake up to the sounds of the occupant of the bedroll next to theirs getting fucked, and without any consent, either. Perhaps you're odd, ${he}'s obviously thinking, but perhaps you won't rape ${him} while ${he} sleeps.`]);
			eventSlave.trust += 4;
			return frag;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.devotion <= 50,
				s => s.minorInjury === "sore ass",
			]
		];
	}

	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);

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

		let r = [];
		r.push(
			`One night, you see`,
			contextualIntro(V.PC, eventSlave, true)
		);

		if (!hasAnyLegs(eventSlave)) {
			r.push(`scooting ${himself} from side to side uncomfortably,`);
		} else if (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
			r.push(`crawling gingerly,`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`tottering along painfully,`);
		} else {
			r.push(`walking a little funny,`);
		}
		r.push(`as though ${he} has a sore butt. You call ${him} over to inspect ${his} backdoor to see if ${he} needs care,`);
		if (!hasAnyLegs(eventSlave)) {
			r.push(`and set ${his} helpless body down, spreading ${his} buttocks to examine ${his} anus.`);
		} else {
			r.push(`and order ${him} to spread ${his} buttocks for you so you can examine ${his} anus.`);
		}
		r.push(`${His} asshole is fine, just a little sore from hard buttfucks. ${He} complies with you, but as you probe ${him} gently with a finger,`);
		if (!canTalk(eventSlave) && (!hasAnyArms(eventSlave))) {
			r.push(`${he} wriggles desperately and turns to mouth "it hurts ${getWrittenTitle(eventSlave)} please don't assrape me" at you.`);
		} else if (!canTalk(eventSlave)) {
			r.push(`${he} gestures desperately, telling you ${his} butt hurts and asking you not to assfuck ${him}.`);
		} else {
			r.push(
				`${he} bursts out,`,
				Spoken(eventSlave, `"${Master}, my butt is so sore! Please don't use my ass, ${Master}. Please."`)
			);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Punish ${his} ass for insolence`, punish),
			new App.Events.Result(`Give ${him} some care`, care),
		]);

		function punish() {
			r = [];
			r.push(`You inform ${him} sternly that you will ensure that ${he} is not permanently damaged, and that otherwise, ${he} is to take anal pain like a good buttslave. ${He} starts to beg and whine as you lean back in your chair and`);
			if (V.PC.dick === 0) {
				r.push(`hold ${him} upside down on your chest so ${he} can lick your pussy while you use a dildo on ${his} ass.`);
			} else {
				r.push(`set ${him} on your chest before reaching around to line your cock up with ${his} sore hole. ${He} shudders and writhes when you start pushing yourself inside.`);
			}
			r.push(`You use hard pinches to ${his} nipples to punish ${his} whining, forcing ${him} to take a long, painful buttfuck in silence. <span class="gold">${He} has become more afraid of you.</span>`);
			if (V.seeStretching === 1 && eventSlave.anus < 3) {
				r.push(`${His} week of tough anal experience has <span class="lime">permanently loosened ${his} anus.</span>`);
				eventSlave.anus += 1;
			}
			eventSlave.trust -= 5;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function care() {
			r = [];
			r.push(`${He}'s filled with anxiety as you`);
			if (eventSlave.belly < 1500) {
				r.push(`lay ${him} face-down on your desk,`);
			} else {
				r.push(`direct ${him} to lay on ${his} side on your desk`);
				if (eventSlave.belly >= 300000) {
					r.push(`with ${his} ${belly} belly hanging over the edge`);
				}
				r.push(r.pop() + `,`);
			}
			r.push(`but is surprised and reassured when ${he}'s penetrated not by a`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`turgid`);
				if (V.PC.vagina !== -1) {
					r.push(`futa`);
				}
				r.push(`cock`);
			}
			r.push(`but by a single gentle finger coated with something healing and cool. The mixed analgesic and anti-inflammatory takes the sharpness off the sore feeling, and will help get ${his} butt back into fucking shape. ${He} has become more accepting of anal slavery, and ${his} asshole feels better.`);
			if (eventSlave.anus > 2) {
				r.push(`Your expert care has <span class="orange">allowed ${his} loose asspussy to recover a little of its natural shape and size.</span>`);
				eventSlave.anus -= 1;
			}
			eventSlave.trust += 4;
			eventSlave.minorInjury = 0;
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => canTalk(s, false),
				s => s.assignment !== Job.QUARTER,
				s => s.muscles > 5,
				s => s.devotion > 20,
				s => s.diet !== "slimming",
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`comes before you for a routine inspection. The`,
		);
		if (eventSlave.muscles > 95) {
			r.push(`heavily muscled`);
		} else if (eventSlave.muscles > 30) {
			r.push(`ripped`);
		} else {
			r.push(`toned`);
		}
		r.push(`${SlaveTitle(eventSlave)} is looking good, but as ${he} raises ${his} ${arms} over ${his} head to spin ${his} nude torso under your gaze, ${he} winces slightly.`);
		if (canSee(eventSlave)) {
			r.push(`${His} ${App.Desc.eyesColor(eventSlave)} flick up to see if you noticed, and ${his} face falls a little when ${he} sees that you did. You raise one eyebrow, and the obedient slave explains ${himself}.`);
		} else if (canHear(eventSlave)) {
			r.push(`${His} ears perk up to hear if you noticed. You clear your throat, startling ${him} and making ${him} explain ${himself}.`);
		} else {
			r.push(`${He} tries to affect a stoic expression, but when you tentatively touch one of ${his} shoulders, ${he} grimaces slightly and quickly opts to explain ${himself}.`);
		}
		if (!canTalk(eventSlave)) {
			r.push(`${He} uses gestures to beg your pardon, and explains that yesterday was arm day for ${him}, and ${he} went out a little hard. ${His} shoulders are a little sore, but ${he} gestures that ${he}'s all right.`);
		} else {
			r.push(
				Spoken(eventSlave, `"Sorry, ${Master},"`),
				`${he} ${say}s apologetically.`,
				Spoken(eventSlave, `"I'm okay. Yesterday was arm day for me, and I went out a little too hard. My shoulders are kinda sore, but I'm alright."`)
			);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Make ${him} work it out`, make, virginityWarning()),
			new App.Events.Result(`Give ${him} a massage`, give),
		]);

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

		function make() {
			const r = new SpacedTextAccumulator();
			r.push(`You tell ${him} to get ready to go into a handstand. ${He} looks puzzled, but anticipatory, and hurries to comply.`);
			if (eventSlave.boobs > 2000) {
				r.push(`${He} has to be careful doing it, since ${his} huge boobs come down and almost smother the poor slave once ${he}'s inverted.`);
			}
			if (eventSlave.belly >= 300000) {
				r.push(`${His} belly is so hugely distended, ${he}'ll practically require your assistance to stay inverted.`);
			} else if (eventSlave.weight > 130) {
				r.push(`${His} belly is so fat that ${he} has to take precautions to handle the massive shift in its mass when ${he} inverts.`);
			}
			r.push(`You get up from behind your desk,`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on,`);
			}
			r.push(`and stand behind ${him}. You grab ${him} by the ankles, and ${he} giggles self-consciously, aware that in this position, ${his}`);
			if (eventSlave.vagina > -1) {
				r.push(`holes are on display pretty much as openly as they can possibly be.`);
			} else {
				r.push(`butthole is on display pretty much as openly as it can possibly be.`);
			}
			r.push(`${He} groans with soreness as you lift ${him} by ${his} legs, pulling ${him} upward until ${he}'s in a full handstand, ${his} knees clasping you on either side to steady ${him}. Carefully, you maneuver your`);
			if (V.PC.dick === 0) {
				r.push(`phallus`);
			} else {
				r.push(`cock`);
			}
			r.push(`to line it up with ${his}`);
			if (eventSlave.vagina > -1) {
				r.push(`pussy.`);
			} else {
				r.push(`asspussy.`);
			}
			r.push(`Realizing what you intend, ${he} arches ${his} back and cocks ${his} hips,`);
			if (eventSlave.belly >= 5000) {
				r.push(`pushing ${his} already bulging stomach even further out from ${him}, all the while`);
			}
			r.push(`grunting and shivering as ${his} sore muscles stretch to support ${him} in the necessary gymnastic pose to angle ${his} hole just right.`);
			r.toParagraph();
			r.push(`With the combined pain and pleasure of the stretch already overstimulating ${him}, ${he} gives a huge sobbing gasp as you enter ${him}. You move your hands to ${his}`);
			if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.muscles > 30) {
				r.push(`well-muscled`);
			} else {
				r.push(`trim`);
			}
			r.push(`hips one at a time, and then begin to slowly move ${his} inverted body towards you and away from you, impaling ${him}. ${His} whole body shakes with pleasure and exertion, and when ${he} orgasms, you have to support ${him} to stop ${him} crashing to the ground`);
			if (eventSlave.belly >= 300000) {
				r.addToLast(`, a struggle thanks to ${his} excessive weight`);
			}
			r.addToLast(`. You let ${him} down onto the floor slowly`);
			if (eventSlave.vagina > -1) {
				r.addToLast(`, but tell ${him} that after a short break, ${he}'s to get back up so you can see to ${his} anus`);
			}
			r.addToLast(`. ${He}'s breathing very hard and still coming down off a terrific head rush, so ${he} just <span class="devotion inc">blows you a kiss.</span>`);
			eventSlave.devotion += 4;
			r.push(VCheck.Both(eventSlave, 1));
			r.toParagraph();
			return r.container();
		}

		function give() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You vault your desk, fold yourself into a cross-legged pose with your back against its front,`);
			if (canSee(eventSlave)) {
				r.push(`and point to the floor in front of you.`);
				if (eventSlave.attrXX > 65 && V.PC.boobs >= 300) {
					r.push(`(As you do, ${he} watches the effects of the motion on your breasts with something like reverence`);
					if (V.PC.boobsImplant > 0) {
						r.addToLast(`, even though they don't move much thanks to your implants`);
					}
					r.addToLast(`.)`);
				} else if (eventSlave.attrXY > 65 && V.PC.boobs < 300) {
					r.push(`(As you do, ${he} takes in the powerful play of your muscles with something like reverence`);
					if (V.PC.balls >= 5) {
						r.addToLast(`. ${He} certainly notices the motion of your massive nuts too`);
					}
					r.addToLast(`.)`);
				}
			} else if (canHear(eventSlave)) {
				r.push(`and loudly tap the floor in front of you.`);
			} else {
				r.push(`and reach out to lightly tug ${him} towards you.`);
			}
			r.push(`${He} hurries over and gets down on the floor with you, conforming to your manual guidance that ${he} should sit with ${his} back to you. You place your hands on either side of ${his} neck, run them capably down ${his} spine, and then back up to explore ${his} shoulders. ${He} gasps as ${he} realizes that you intend to give ${him} a massage, impressed and a little perturbed that you would do this for ${him}. Indeed, it's unusual for a slaveowner to do something like this, but it's easily justifiable as hands-on maintenance of your property. You tell ${him} so as your fingers begin to probe ${his} muscles in more detail, eliciting a shiver`);
			if (canTalk(eventSlave)) {
				r.addToLast(`.`);
			} else {
				r.push(
					`and a tiny`,
					Spoken(eventSlave, `"Yes, ${Master}."`)
				);
			}
			r.push(`${He} begins to breathe rather hard, and you notice`);
			if (eventSlave.belly >= 120000) {
				r.push(`${him} starting to shift ${his} hips uncomfortably. ${His} ${belly} belly blocks any view of ${his} crotch in the reflective wall opposite ${him}, but you can smell the precum beginning to flow under the crotch hiding orb.`);
			} else if (eventSlave.chastityPenis === 1) {
				r.push(`${him} starting to shift ${his} hips uncomfortably, though of course you see in the reflective wall opposite ${him} that ${his} cock remains as caged as ever.`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`${him} starting to shift ${his} hips uncomfortably, though of course you see in the reflective wall opposite ${him} that ${his} cock remains as limp as ever.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${him} starting to shift ${his} hips uncomfortably. You see in the reflective wall opposite ${him} that ${his} cock is almost agonizingly hard.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`${him} starting to shift ${his} ass uncomfortably. ${He} must really want it, and of course, ${he} knows that ${his} butt is ${his} main source of stimulation now.`);
			} else {
				r.push(`the wonderful aroma of female arousal beginning to permeate the office as ${he} starts to shift ${his} hips uncomfortably.`);
			}
			eventSlave.trust += 2;

			r.toParagraph();
			App.Events.addResponses(frag, [
				new App.Events.Result(`Tell ${him} ${he}'s free to masturbate`, masturbate),
				(eventSlave.anus > 0)
					? new App.Events.Result(`Fuck ${him}`, fuck)
					: new App.Events.Result(),
			]);

			return r.container();

			function masturbate() {
				const r = new SpacedTextAccumulator();
				r.push(`You lean forward until your lips graze one of ${his} ears, and tell ${him} that ${he} can touch ${himself} if ${he} wants.`);
				if (!canTalk(eventSlave)) {
					r.push(`${He} raises a shaky hand to gesture <span class="trust inc">${his} thanks</span> as the other`);
				} else {
					r.push(`<span class="trust inc">"Thank you</span> ${Master}!" ${he} squeaks as a hand`);
				}
				r.push(`dives for ${his} crotch. ${He}`);
				if (eventSlave.vagina === -1 && eventSlave.dick === 0) {
					r.push(`rubs ${his} perineum and anus`);
				} else if (eventSlave.chastityVagina) {
					r.push(`rubs ${his} perineum`);
				} else if (eventSlave.vagina > -1) {
					r.push(`schlicks ${himself}`);
				} else if (eventSlave.chastityPenis === 1) {
					r.push(`rubs ${his} perineum and anus`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rubs ${his} soft bitchclit`);
				} else {
					r.push(`jacks off`);
				}
				r.push(`shamelessly as you complete the massage, moaning with satisfaction as the competing sources of endorphins suffuse ${him}.`);
				eventSlave.trust += 2;
				r.toParagraph();
				return r.container();
			}

			function fuck() {
				const r = new SpacedTextAccumulator();
				r.push(`You gently push ${his} shoulders forward. ${He} moans as the forward lean stretches ${his} hip flexors, and then breathes deeply with relief as you pull ${his} legs back and out of their crossed position. The rush of a completed stretch crashes into ${him}, and ${he} relaxes completely. This change of position leaves ${him} with ${his}`);
				if (eventSlave.butt > 6) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 3) {
					r.push(`big butt`);
				} else {
					r.push(`rear`);
				}
				r.push(`pointed right at you, and ${he} knows what's coming next. ${His}`);
				if (eventSlave.anus > 2) {
					r.push(`loose butthole relaxes completely into a gape that positively begs to be penetrated.`);
				} else if (eventSlave.anus > 1) {
					r.push(`relaxed anus opens into a slight gape that positively begs to be penetrated.`);
				} else {
					r.push(`tight anus relaxes slightly, ${his} rosebud begging to be fucked.`);
				}
				r.push(`You rise partway to kneel behind ${him},`);
				if (V.PC.dick === 0) {
					r.push(`sliding fingers inside the slave's ass and humping your pussy against the heel of that hand`);
				} else {
					r.push(`using a hand to guide your member inside the slave's ass`);
					if (V.PC.vagina !== -1) {
						r.addToLast(`, not without teasing your own pussylips a bit`);
					}
				}
				r.addToLast(`. ${He} gasps when your other hand grabs one of ${his} shoulders and continues the massage. You quickly find that working out a knot in ${his} muscles produces reflexive reactions across ${his} whole body, notably including ${his} anal sphincter. After you've driven ${him} into a state of mindless satiation and climaxed yourself, you let ${him} slump to the floor and curl up around ${his} sweaty body.`);
				eventSlave.devotion += 2;
				r.push(VCheck.Anal(eventSlave, 1));
				r.toParagraph();
				return r.container();
			}
		}
	}
};