code:
App.Events.RESSSexySuccubus = class RESSSexySuccubus 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.assignment !== Job.QUARTER,
				s => s.clothes === "a succubus outfit",
				s => s.devotion > 20,
				s => s.trust > 20,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;
		const {heP, himP, womanP, hisP} = getPronouns(PC).appendSuffix("P");

		V.nextLink = "Next Week";

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

		let r = [];
		r.push(
			`You cross paths with`,
			contextualIntro(PC, eventSlave, "DOM"),
			`as ${he} moves from the living area to ${eventSlave.assignment}, just starting ${his} day. ${He}'s full of energy, and ${his} succubus outfit is delightful. ${He}`
		);
		if (canSee(eventSlave)) {
			r.push(`sees your glance`);
		} else {
			r.push(`recognizes your whistle`);
		}
		r.push(`and greets you with a`);
		if (canSee(eventSlave)) {
			r.push(`wicked glint in ${his} eye,`);
		} else {
			r.push(`wicked smirk on ${his} face,`);
		}
		r.push(`bowing a bit to show off ${his}`);
		if (eventSlave.boobs > 6000) {
			r.push(`bare, inhumanly large breasts`);
		} else if (eventSlave.lactation > 0) {
			r.push(`bare udders, heavy with milk`);
		} else if (eventSlave.boobsImplant > 0) {
			r.push(`naked fake tits`);
		} else if (eventSlave.boobs > 800) {
			r.push(`heavy, naked breasts`);
		} else if (eventSlave.boobs > 300) {
			r.push(`naked little tits`);
		} else {
			r.push(`pretty chest`);
		}
		r.push(`and then continuing towards you with a pirouette. ${His} tail bounces flirtily, holding the back of ${his} skirt up to show off`);
		if (eventSlave.butt > 8) {
			r.push(`${his} absurdly wide bottom.`);
		} else if (eventSlave.analArea > 3) {
			r.push(`the broad area of puckered skin around ${his} slutty asspussy.`);
		} else if (eventSlave.buttImplant > 0) {
			r.push(`${his} butt implants.`);
		} else if (eventSlave.butt > 5) {
			r.push(`${his} big butt.`);
		} else if (eventSlave.anus > 1) {
			r.push(`a hint of ${his} asshole, which ${his} cute buttocks don't quite conceal.`);
		} else {
			r.push(`${his} cute bottom.`);
		}
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`${He} looks like`);
		if (eventSlave.bellyPreg >= 1500 || eventSlave.bellyImplant >= 1500) {
			r.push(`a lusty, pregnant, hungry`);
		} else if (eventSlave.bellyFluid >= 1500) {
			r.push(`a gluttonous, over-fed but still hungry`);
		} else if (eventSlave.height > 180) {
			r.push(`an imposing, hungry`);
		} else if (eventSlave.muscles > 30) {
			r.push(`a muscular, hungry`);
		} else if (eventSlave.weight > 10) {
			r.push(`a well-fed but still hungry`);
		} else if (eventSlave.energy > 95) {
			r.push(`a desperately hungry`);
		} else {
			r.push(`a cute, hungry little`);
		}
		r.push(`sex demon, and you tell ${him} so.`);
		if (eventSlave.intelligence > 50) {
			r.push(`The clever ${girl} knows all about succubi.`);
		} else if (eventSlave.intelligenceImplant >= 15) {
			r.push(`${He}'s been taught the basics about succubi.`);
		} else {
			r.push(`${He} quickly searches ${his} memory for the basic information about succubi that came with ${his} outfit.`);
		}
		if (SlaveStatsChecker.checkForLisp(eventSlave)) {
			r.push(`"Oh ${Master}, I'm thtarving," ${he} lisps,`);
		} else {
			r.push(`"Oh ${Master}, I'm ssstarving," ${he} moans,`);
		}
		r.push(`running ${his} tongue over ${his}`);
		if (eventSlave.lips > 40) {
			r.push(`whorish`);
		} else if (eventSlave.lips > 20) {
			r.push(`plush`);
		}
		r.push(`lips and sticking out ${his} chest to present ${his} boobs even more obviously.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} eat`, eat),
			(canDoVaginal(eventSlave) && PC.dick !== 0)
				? new App.Events.Result(`Feed ${him}`, feed, (eventSlave.vagina === 0) ?`This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			(canDoAnal(eventSlave) && eventSlave.anus > 0 && PC.dick !== 0)
				? new App.Events.Result(`Fuck ${him} without feeding ${him}`, fuck, (eventSlave.vagina === 0) ?`This option will take ${his} virginity` : null)
				: new App.Events.Result(),
		]);

		function eat() {
			r = [];
			r.push(`You tell ${him} ${he}'s a good little succubus, and you're going to let ${him} feed. ${He} knows exactly what you mean, and`);
			if (eventSlave.belly >= 300000) {
				r.push(`leans onto ${his} ${belly} stomach`);
			} else {
				if (eventSlave.belly >= 5000) {
					r.push(`gently lowers ${himself}`);
				} else {
					r.push(`gets`);
				}
				r.push(`to ${his} knees`);
			}
			r.push(`quickly, pressing ${him} ${eventSlave.nipples} nipples against your thighs and grasping your hips to give ${himself} leverage for some very aggressive oral. After`);
			if (PC.dick !== 0) {
				r.push(`a couple of lush sucks at each of your balls`);
				if (PC.vagina !== -1) {
					r.push(`and some eager nuzzling of your pussylips`);
				}
				r.push(r.pop() + `, ${he} moves straight to a hard blowjob, deepthroating your cock and almost ramming ${his} head against you.`);
				if (PC.vagina !== -1) {
					r.push(`${He} keeps ${his} tongue stuck out, and whenever ${he} gets you fully hilted, ${he} manages to reach your pussylips with it.`);
				}
				r.push(`${He}`);
				if (eventSlave.fetish === "cumslut") {
					r.push(`doesn't have to pretend to be starving for your cum.`);
				} else {
					r.push(`does a good job of acting like ${he}'s authentically starving for your cum.`);
				}
				r.push(`${He} groans with satisfaction when you blow your load down ${his} gullet,`);
			} else {
				r.push(`nuzzling ${his} nose against your moist cunt, ${he} starts to eat you out like ${he}'s starving, sparing no time for subtlety, lapping up your female juices with evident relish. You run your fingers through ${his} ${eventSlave.slaveName} hair, telling ${him} ${he}'ll have to survive on pussyjuice. ${He} replies, but you hold ${his} head hard against you as ${he} does, turning whatever ${he} says into an unintelligible, delectable mumbling into your womanhood. ${He} groans with satisfaction when you stiffen with orgasm, giving ${him} a final gush of girlcum,`);
			}
			r.push(`and`);
			if (eventSlave.belly >= 5000) {
				r.push(`hefts ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				} else {
					r.push(`bloated`);
				}
				r.push(`bulk up`);
			} else {
				r.push(`gets to ${his} feet`);
			}
			r.push(`licking ${his} lips and patting ${his} ${belly} stomach.`);
			if (eventSlave.belly >= 1500) {
				r.push(
					Spoken(eventSlave, `"That was such a big meal ${Master}, look how full it made me!"`),
					`${He} teases, pretending ${his}`
				);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`gravid belly is filled with your fluids.`);
				} else if (eventSlave.bellyImplant >= 1500) {
					r.push(`distended belly is filled with your fluids.`);
				} else {
					r.push(`wobbling, ${eventSlave.inflationType}-filled belly is filled with your fluids.`);
				}
				if (PC.balls >= 30) {
					r.push(`Seeing as ${he} took the entirety of your inhuman load, there is some truth to ${his} words.`);
				}
			}
			r.push(`${He}'s obviously <span class="trust inc">becoming more comfortable</span> playing the part of a vampiric sex`);
			if (eventSlave.fetish === "cumslut" && eventSlave.fetishStrength > 95) {
				r.push(`demon, and it's a role the incorrigible cumslut <span class="devotion inc">loves.</span>`);
				eventSlave.devotion += 2;
			} else if (eventSlave.fetish === "cumslut") {
				r.push(`demon, and it's a role that <span class="fetish inc">reinforces ${his} oral fixation.</span>`);
				eventSlave.fetishStrength += 4;
			} else if ((eventSlave.fetishStrength <= 95 || eventSlave.fetishKnown === 0) && random(0, 1) === 0) {
				r.push(`demon, and the role <span class="fetish gain">focuses ${his} attention on ${his} mouth.</span>`);
				eventSlave.fetishStrength = 10;
				eventSlave.fetishKnown = 1;
				eventSlave.fetish = "cumslut";
			} else {
				r.push(`demon.`);
			}
			eventSlave.trust += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			return r;
		}

		function feed() {
			r = [];
			r.push(`You tell ${him} ${he}'s a good little succubus, and you're going to feed ${him}.`);
			if (eventSlave.boobs > 2000) {
				r.push(`Reaching up under ${his} breasts for the top edge of ${his} outfit`);
			} else {
				r.push(`Grabbing ${his} outfit's top edge`);
			}
			r.push(`and seizing ${him} behind a knee with your other hand, you sling ${him} across`);
			if (eventSlave.belly >= 300000 || eventSlave.weight > 190) {
				r.push(`an unfortunate nearby tabletop. Once the table finishes its creaking and promises to hold ${his} weight, ${he}`);
			} else {
				r.push(`a convenient tabletop nearby. ${He}`);
			}
			r.push(`spreads ${his} legs for you, smiling with anticipation, ${his}`);
			if (eventSlave.vaginaLube > 0) {
				r.push(`cunt already soaking wet.`);
			} else if (eventSlave.labia > 0) {
				r.push(`prominent petals swollen with arousal.`);
			} else if (eventSlave.clit > 0) {
				r.push(`big bitch button stiff with arousal.`);
			} else {
				r.push(`cunt flushing with arousal.`);
			}
			r.push(`${He} reaches down around ${his} own ass and spreads ${his} pussy for you, only releasing ${his} fingertip grip on ${his} labia when ${he} feels you hilt yourself inside ${his}`);
			if (eventSlave.vagina > 2) {
				r.push(`cavernous`);
			} else if (eventSlave.vagina > 1) {
				r.push(`comfortable`);
			} else if (eventSlave.vagina > 0) {
				r.push(`caressing`);
			} else {
				r.push(`needy`);
			}
			r.push(`channel.`);
			r.push(VCheck.Vaginal(eventSlave, 1));
			r.push(`You're here to rut, not make love, and you give it to ${him} hard, forcing`);
			if (eventSlave.voice >= 3) {
				r.push(`high squeals`);
			} else {
				r.push(`animal grunts`);
			}
			r.push(`out of ${him}. ${He} climaxes strongly, and the glorious feeling finishes you as well, bringing rope after rope of your cum jetting into ${him}. ${He} groans at the feeling, and as ${he}`);
			if (eventSlave.belly >= 5000 || eventSlave.weight > 190) {
				r.push(`slowly`);
			}
			r.push(`gets to ${his} feet ${he} uses a hand to transfer a`);
			if (canTaste(eventSlave)) {
				r.push(`taste`);
			} else {
				r.push(`bit`);
			}
			r.push(`of the mixture of your seed and`);
			if (PC.vagina !== -1) {
				r.push(`both of your`);
			} else {
				r.push(`${his}`);
			}
			r.push(`pussyjuice to ${his} mouth.`);
			if (eventSlave.belly >= 750000) {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels like I'm going to burst! So many... ${Master} sure is potent! I hope ${heP} can handle them all!"`),
					`${He} groans, cradling ${his} ${belly} belly and pretending to be forced to the ground by ${his} pregnancy growing ever larger.`,
					Spoken(eventSlave, `"${Master}! They won't stop! Oh... So full... I can't stop conceiving!"`),
					`${He} rolls onto ${his} back and clutches ${his} absurd stomach.`,
					Spoken(eventSlave, `"So tight! So full! So Good! I need more! Oh, ${Master}..."`),
					`${He} may be getting a little too into the fantasy.`
				);
				if (eventSlave.broodmother === 2 && eventSlave.preg > 37) {
					r.push(
						`A gush of fluid flows from ${his} pussy, snapping ${him} out of ${his} roleplay.`,
						Spoken(eventSlave, `"${Master}! I need... One's coming now!"`),
						`You rub ${his} contracting stomach, enjoying the feeling of the life within shifting to take advantage of the free space. You sigh and lean down, the vessel of your spawn needs help after pinning ${himself} in such a compromising position. Holding ${his} belly clear of ${his} crotch, you watch ${him} steadily push out ${his} child before spasming with orgasm and freeing it effortlessly into the world. After collecting it for a servant to handle, you help the exhausted ${girl} back to ${his} feet. ${He} thanks you sincerely for the assist before going to clean ${himself} up. You barely have time to turn away before another splash catches your attention.`,
						Spoken(eventSlave, `"${Master}... Another's, mmmmh, coming..."`)
					);
				}
			} else if (eventSlave.belly >= 600000) {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels like I'm going to burst! So many... ${Master} sure is potent! I hope ${heP} can handle them all!"`),
					`${He} teases, cradling ${his} ${belly} belly and pretending to be forced to the ground by ${his} pregnancy growing ever larger.`
				);
			} else if (eventSlave.belly >= 450000) {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels so good!! So many... ${Master} sure is potent! I hope ${heP} can handle them all!"`),
					`${He} teases, cradling ${his} ${belly} belly and pretending to be forced to the ground by ${his} pregnancy growing ever larger.`
				);
			} else if (eventSlave.belly >= 300000) {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me... Oh god, it feels so good! I feel them moving! They're ready to come out ${Master}!"`),
					`${He} teases, cradling ${his} ${belly} belly and pretending it just grew that huge.`
				);
			} else if (eventSlave.belly >= 150000) {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you! There's so many in me, look how big I'm getting!"`),
					`${He} teases, cradling ${his} ${belly} belly and pretending it just rapidly became that large.`
				);
			} else if (eventSlave.belly >= 5000) {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I'm swelling so fast with imps for you!"`),
					`${He} teases, cradling ${his} ${belly} belly and pretending it just grew that big.`
				);
			} else {
				r.push(
					Spoken(eventSlave, `"Oh ${Master}! I feel it! Your seed is being devoured by my eggs! I can't wait to see how happy they make you!"`),
					`${He} teases, rubbing ${his} belly and pretending to conceive.`
				);
			}
			r.push(`${He}'s obviously <span class="trust inc">becoming more comfortable</span> playing the part of a sex demon whose hunger knows no`);
			eventSlave.trust += 4;
			if (eventSlave.fetish === "pregnancy" && eventSlave.fetishStrength > 95) {
				r.push(`end, and it's a role the pregnancy fetishist <span class="devotion inc">loves.</span>`);
				eventSlave.devotion += 2;
			} else if (eventSlave.fetish === "pregnancy") {
				r.push(`end, and it's a role that <span class="fetish inc">reinforces ${his} love of insemination.</span>`);
				eventSlave.fetishStrength += 4;
			} else if ((eventSlave.fetishStrength <= 95 || eventSlave.fetishKnown === 0) && random(0, 1) === 0) {
				r.push(`end, and the role <span class="fetish gain">focuses ${his} attention on insemination.</span>`);
				eventSlave.fetishStrength = 10;
				eventSlave.fetishKnown = 1;
				eventSlave.fetish = "pregnancy";
			} else {
				r.push(`end.`);
			}
			return r;
		}

		function fuck() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You tell ${him} ${he}'s a good little succubus. Thinking ${he} understands, ${he}`);
			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
				r.push(`turns and hugs the nearest wall,`);
				if (eventSlave.belly >= 300000) {
					r.push(`sliding ${his} ${belly} belly down it until it parts ${his} legs. ${He} shuffles onto it to offer you ${his} needy cunt.`);
				} else {
					r.push(`going up on tiptoe and cocking ${his} hips to offer you ${his} needy cunt.`);
				}
				r.push(`${He} moans as your dick`);
				if (eventSlave.vagina > 2) {
					r.push(`enters ${his} big cunt.`);
				} else if (eventSlave.vagina > 1) {
					r.push(`fills ${his} wet cunt.`);
				} else {
					r.push(`slides slowly inside ${his} tight cunt.`);
				}
				r.push(`As you fuck ${him}, you ask ${him} how succubi feed. "W-well," ${he} gasps, struggling to gather ${his} wits,`);
			} else {
				if (eventSlave.belly >= 300000) {
					r.push(`leans onto ${his} ${belly} belly`);
				} else {
					r.push(`gets down on ${his} knees`);
				}
				r.push(`and starts to suck you off. ${He} deepthroats you eagerly, stretching to tickle your balls with ${his} tongue as ${he} gets you all the way in, and then shifting a hand to roll them around as ${he} sucks. As ${he} blows you, you ask ${him} how succubi feed. "Well," ${he} gasps, popping your dickhead free of ${his} mouth and replacing the sucking with a stroking hand,`);
			}
			r.push(Spoken(eventSlave, `"${Master}, they can eat a ${womanP}'s essence by swallowing ${hisP} cum or getting ${himP} to ejaculate inside their pussies."`));
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(
				`You ask ${him} whether ${he} would like to feed off you.`,
				Spoken(eventSlave, `"Oh yes ${Master}, please. Please feed me,"`),
				`${he} begs. Too bad, you tell ${him}; ${he} gets to go hungry. After all, succubi can't feed using their butts.`
			);
			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
				r.push(`You withdraw from ${his} cunt and stuff your cock up ${his} ass without pausing or softening your thrusting at all.`);
			} else {
				r.push(`You pull ${him} to ${his} feet by the hair, spin ${him} around, shove ${him} up against the wall, and stuff your cock up ${his} ass.`);
			}
			if (eventSlave.anus > 2) {
				r.push(`It's not like ${his} experienced butt can't take an assraping, but`);
			} else if (eventSlave.anus > 1) {
				r.push(`${His} practiced ass relaxes and accommodates your dick, but`);
			} else {
				r.push(`${His} tight asshole spasms with pain as it stretches to accommodate you, and`);
			}
			r.push(`${he} whines at your sudden aggression, wiggling within your dominating grip. You fill ${his} ass with cum as ${he} struggles, still playing ${his} part, begging you not to cum in ${his} bottom, since succubi can't live on buttsex.`);
			eventSlave.trust += 4;
			if (eventSlave.fetish === "submissive" && eventSlave.fetishStrength > 95) {
				r.push(`It's a role the submissive slut <span class="devotion inc">loves.</span>`);
				eventSlave.devotion += 2;
			} else if (eventSlave.fetish === "submissive") {
				r.push(`It's a role that <span class="fetish inc">reinforces ${his} submissive streak.</span>`);
				eventSlave.fetishStrength += 4;
			} else if ((eventSlave.fetishStrength <= 95 || eventSlave.fetishKnown === 0) && random(0, 1) === 0) {
				r.push(`The role <span class="fetish gain">focuses ${his} attention on submission.</span>`);
				eventSlave.fetishStrength = 10;
				eventSlave.fetishKnown = 1;
				eventSlave.fetish = "submissive";
			} else {
				r.push(`${He} <span class="devotion inc">plays the role well.</span>`);
			}
			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", PC, "penetrative");
			} else {
				seX(eventSlave, "oral", PC, "penetrative");
			}
			r.push(VCheck.Anal(eventSlave, 1));
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSShapedAreolae = class RESSShapedAreolae 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.boobs > 1200,
				s => s.areolaeShape !== "circle",
				s => s.devotion > 50,
			]
		];
	}

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

		V.nextLink = "Next Week";

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

		const r = new SpacedTextAccumulator(node);
		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		r.addToLast(`'s breasts are real works of art. ${His}`);
		if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
			r.push(`massive fake`);
		} else if (eventSlave.boobsImplant > 0) {
			r.push(`massive, partially unnatural`);
		} else {
			r.push(`massive, sagging natural`);
		}
		r.push(`tits dominate ${his} figure, but the real attention getter are ${his} unique, ${eventSlave.areolaeShape}-shaped areolae. The darker flesh around ${his} nipples would be — should be — circular in any other ${woman}, and the cute ${eventSlave.areolaeShape} shapes around ${eventSlave.slaveName}'s nipples are proof of just how much you've modified ${him}. ${He}'s devoted to you, so much so that ${he} loves showing off ${his} special assets.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Show ${him} off around the arcology`, show),
			new App.Events.Result(`Use that pride as an advertisement`, use),

		]);

		function show() {
			const r = new SpacedTextAccumulator();
			r.push(`You give ${eventSlave.slaveName} a variation on a usual slave gown. It's just as gorgeous, but this one actually covers ${his}`);
			if (eventSlave.belly >= 1500) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnancy,`);
				} else {
					r.push(`belly,`);
				}
			}
			r.push(`ass and crotch as well. In fact, it covers ${his}`);
			if (isAmputee(eventSlave)) {
				r.push(`limbless torso and head completely: everything except the lower part of ${his} face, and ${his} boobs.`);
			} else {
				if (hasAllLimbs(eventSlave)) {
					r.push(`arms, legs,`);
				} else {
					r.push(`limbs`);
				}
				r.push(`and ${his} face from the nose up. The only flesh visible at all is ${his} mouth, ${his} chin, and ${his} huge breasts, supported and presented by gentle corseting.`);
			}
			if (!hasAnyLegs(eventSlave)) {
				r.push(`You carry ${him} around`);
			} else {
				r.push(`You place a gentle hand on the small of ${his} back to guide ${him}, and stroll around`);
			}
			if (V.club !== 0) {
				r.push(`${V.clubName}.`);
			} else {
				r.push(`${V.arcologies[0].name}'s clubs.`);
			}
			r.push(`${eventSlave.slaveName}`);
			if (canSee(eventSlave)) {
				r.push(`is blinded by the silk over ${his} face,`);
			} else {
				r.push(`may not be able to see,`);
			}
			r.push(`but ${he} can still`);
			if (canHear(eventSlave)) {
				r.push(`hear the appreciative murmurs`);
			} else {
				r.push(`feel the appreciative presence`);
			}
			r.push(`of onlookers as they eye ${his} magnificent breasts with their ${eventSlave.areolaeShape}-shaped areolae. ${He} shivers a little with suppressed pride. ${His} devotion to you has increased, and your reputation as a person with unique property grows.`);
			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			r.toParagraph();
			return r.container();
		}

		function use() {
			eventSlave.devotion += 4;
			cashX(500, "event", eventSlave);
			return `There's all sorts of business going on in ${V.arcologies[0].name}, from flesh rented or bought down to more pedestrian affairs. Advertisement never goes amiss. You place ${eventSlave.slaveName} naked on a slowly rotating pedestal surrounded by a clear plastiglass tube on a busy thoroughfare in the lower parts of ${V.arcologies[0].name}. These devices are often used to display slaves for sale or slave whores for rent; ${eventSlave.slaveName} is simply identified by your name as arcology owner, which is thus identified with business prosperity. ${He} spends the day serving as eye candy for passersby, rotating gently on the pedestal as ${he} shows off ${his} body, giving pride of place to ${his} ${eventSlave.areolaeShape}-shaped areolae. ${He} loves all the attention, and ${his} devotion to you has increased.`;
		}
	}
};

repo_name: Elohiem/fc

license: mit


code:
App.Events.RESSShiftDoorframe = class RESSShiftDoorframe 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 => ([Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment)),
				canTalk,
				s => s.devotion > 20,
				s => s.trust >= -20,
				s => (canDoAnal(s) || canDoVaginal(s)),
				s => s.chastityPenis !== 1 || s.dick === 0,
				s => s.skill.entertainment >= 60,
			]
		];
	}

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

		V.nextLink = "Next Week";

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		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. Just coming to ${his} shift is`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), "."));
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`You're at your desk as ${he} arrives; ${his} predecessor passes ${him} on the way out. ${eventSlave.slaveName} pauses for a moment in the doorway, and then decides to give you a show. ${He} spreads ${his} legs until ${his}`);
		if (eventSlave.shoes === "heels") {
			r.push(`heels click against`);
		} else if (eventSlave.shoes === "extreme heels") {
			r.push(`ridiculous heels click against`);
		} else if (eventSlave.shoes === "none") {
			r.push(`bare feet come up against`);
		} else {
			r.push(`${eventSlave.shoes} come up against`);
		}
		r.push(`the door frame to either side of ${him}. ${He} reaches out to press ${his} palms against the door frame to either side of ${his} body, and runs them slowly up the frame, gradually stretching out ${his}`);
		const averageHeight = Height.mean(eventSlave);
		if (eventSlave.height > (averageHeight + 15)) {
			r.push(`tall`);
		} else if (eventSlave.height < (averageHeight - 15)) {
			r.push(`short`);
		}
		if (eventSlave.weight > 130) {
			r.push(`fat`);
		} else if (eventSlave.weight > 95) {
			r.push(`plump`);
		} else if (eventSlave.weight > 10) {
			r.push(`plush`);
		} else if (eventSlave.weight < -10) {
			r.push(`thin`);
		} else {
			r.push(`trim`);
		}
		if (eventSlave.belly >= 750000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`grotesquely pregnant`);
			} else {
				r.push(`grotesquely inflated`);
			}
		} else if (eventSlave.belly >= 600000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`dangerously pregnant`);
			} else {
				r.push(`dangerously distended`);
			}
		} else if (eventSlave.belly >= 450000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`immensely pregnant`);
			} else {
				r.push(`immensely distended`);
			}
		} else if (eventSlave.belly >= 150000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`massively pregnant`);
			} else {
				r.push(`massively distended`);
			}
		} else if (eventSlave.belly >= 120000) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`enormously pregnant`);
			} else {
				r.push(`greatly gravid`);
			}
		} else if (eventSlave.belly >= 10000) {
			if (eventSlave.bellyPreg > 3000) {
				r.push(`heavily pregnant`);
			} else if (eventSlave.bellyImplant > 3000) {
				r.push(`very gravid`);
			} else {
				r.push(`taut`);
			}
		} else if (eventSlave.belly >= 5000) {
			if (eventSlave.bellyPreg > 3000) {
				r.push(`very pregnant`);
			} else if (eventSlave.bellyImplant > 3000) {
				r.push(`gravid`);
			} else {
				r.push(`distended`);
			}
		} else if (eventSlave.belly >= 1500) {
			if (eventSlave.bellyPreg > 0) {
				r.push(`slightly pregnant`);
			} else if (eventSlave.bellyImplant > 0) {
				r.push(`slightly distended`);
			} else {
				r.push(`bloated`);
			}
		}
		r.push(`form. ${He}'s good at this, so you let ${him} continue;`);
		if (eventSlave.clothes !== "no clothing") {
			r.push(`${his} clothes rapidly form a pile at ${his} feet.`);
		} else {
			r.push(`${he}'s already naked.`);
		}
		r.push(`${He} begins to buck and bend, making sure to show you that ${he}'s`);
		if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			r.push(`limp and submissive for ${his} ${getWrittenTitle(eventSlave)}.`);
		} else if (eventSlave.dick > 0) {
			r.push(`rock hard at the prospect of getting`);
			if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
				r.push(`to fuck`);
			} else {
				r.push(`fucked by`);
			}
			r.push(`${his} ${getWrittenTitle(eventSlave)}.`);
		} else if (eventSlave.clit > 0) {
			r.push(`so horny for ${his} ${getWrittenTitle(eventSlave)} ${he}'s got a stiffly prominent clit.`);
		} else if (eventSlave.labia > 1) {
			r.push(`so horny for ${his} ${getWrittenTitle(eventSlave)} ${his} dangling petals are swollen and moist.`);
		} else if (eventSlave.vagina === -1) {
			r.push(`ready for ${his} ${getWrittenTitle(eventSlave)}.`);
		} else {
			r.push(`wet for ${his} ${getWrittenTitle(eventSlave)}.`);
		}
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`Finally, ${he} pulls ${himself} over to one side of the door frame,`);
		if (eventSlave.belly >= 5000) {
			r.push(`leaning far forward to accommodate ${his} gravid body and`);
		}
		r.push(`clasping it like a lover.`);
		if (eventSlave.boobs > 2000) {
			r.push(`${He} nestles it between ${his} enormous tits, forcing them apart,`);
		} else if (eventSlave.boobs > 800) {
			r.push(`${He} presses ${his} big breasts against it lasciviously, letting them pop around it one by one,`);
		} else {
			r.push(`${He} rubs ${his} chest against it, up and down,`);
		}
		r.push(`and licks ${his}`);
		if (eventSlave.lips > 70) {
			r.push(`ridiculous lips`);
		} else if (eventSlave.lips > 40) {
			r.push(`lewd lips`);
		} else {
			r.push(`lips`);
		}
		r.push(`until they're so wet they leave a strand of saliva between ${his} mouth and the frame. ${He} then gives up all pretense,`);
		if (eventSlave.belly >= 5000) {
			r.push(`shifts ${his} bulk back,`);
		}
		r.push(`and begins to openly grind ${himself} against the door frame, ${his}`);
		if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			r.push(`limp dick dribbling precum down it.`);
		} else if (eventSlave.dick > 0) {
			r.push(`erection leaving precum all along it.`);
		} else if (eventSlave.vagina === -1) {
			r.push(`buttocks parting against it as ${he} rubs ${his} asspussy against the hard door frame.`);
		} else {
			r.push(`pussy leaving moisture as ${he} humps it.`);
		}
		r.push(`${He}'s certainly taking the colloquial term <i>fucked by the arcology</i> literally.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`As if the invitation wasn't already blindingly clear, ${he} reaches a hand down without pausing ${his} door frame rape to`);
		if (eventSlave.butt > 10) {
			r.push(`slap an immense buttock and let it jiggle.`);
		} else if (eventSlave.butt > 5) {
			r.push(`heft and massage a massive buttock.`);
		} else if (eventSlave.butt > 2) {
			r.push(`massage ${his} plush butt.`);
		} else {
			r.push(`massage ${his} trim butt.`);
		}
		r.push(`${He} pulls the buttock closest to you aside, giving you a clear view of ${his}`);
		if (canDoVaginal(eventSlave)) {
			if (eventSlave.vagina >= 10) {
				r.push(`gaping birth hole`);
				if (eventSlave.belly >= 100000) {
					r.push(`and nearly prolapsing cervix`);
				}
				r.push(r.pop() + `. ${He} runs ${his} fingers around its edge before sinking ${his} fist into it and preparing ${himself} like a good slave${girl} for ${his} ${getWrittenTitle(eventSlave)}.`);
			} else if (eventSlave.vagina > 2) {
				r.push(`lewd, well traveled pussy. ${He} traces a finger around it before sinking ${his} hand into it and spreading ${himself} wide like a good slave${girl} for ${his} ${getWrittenTitle(eventSlave)}.`);
			} else if (eventSlave.vagina > 1) {
				r.push(`loose pussy. ${He} traces a finger around it before spreading ${himself} wide like a good slave${girl} for ${his} ${getWrittenTitle(eventSlave)}.`);
			} else if (eventSlave.vagina > 0) {
				r.push(`tight pussy. ${He} traces a finger around it before spreading ${himself} like a good slave${girl} for ${his} ${getWrittenTitle(eventSlave)}.`);
			} else {
				r.push(`virgin pussy. ${He} traces a finger around it before spreading ${himself} like a good slave${girl} for ${his} ${getWrittenTitle(eventSlave)}.`);
			}
		} else {
			if (eventSlave.anus > 2) {
				r.push(`lewd anal slit.`);
			} else if (eventSlave.anus > 1) {
				r.push(`loose asshole.`);
			} else {
				r.push(`tight anus.`);
			}
			r.push(`${He} clenches it and relaxes it, clenches it and relaxes it, winking ${his} butthole at ${his} ${getWrittenTitle(eventSlave)} like a good anal slave.`);
		}
		App.Events.addParagraph(node, r);

		let choices = [];
		if (canDoVaginal(eventSlave)) {
			choices.push(new App.Events.Result(`Make love`, loveVagina, (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null));
			choices.push(new App.Events.Result(`Pound that pussy`, poundVagina, (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null));
		}
		if (canDoAnal(eventSlave)) {
			choices.push(new App.Events.Result(`Make butt love`, loveButt, (eventSlave.anus === 0 && canDoAnal(eventSlave)) ? `This option will take ${his} anal virginity` : null));
			choices.push(new App.Events.Result(`Pound that ass`, poundButt, (eventSlave.anus === 0 && canDoAnal(eventSlave)) ? `This option will take ${his} anal virginity` : null));
		}
		if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
			choices.push(new App.Events.Result(`Invite ${him} 'in'`, invitation, `This option will penetrate you`)); // TODO: This response needs to be reviewed (or gated) after PC body is implemented
		}
		App.Events.addResponses(node, choices);

		function loveResponse(genitalText, genitalCondition) {
			r = [];
			r.push(`There's a glint`);
			if (canSee(eventSlave)) {
				r.push(`in ${his} eyes as ${he} sees`);
			} else if (canHear(eventSlave)) {
				r.push(`on ${his} face as ${he} hears`);
			} else {
				r.push(`on ${his} face as ${he} senses`);
			}
			r.push(`you stand up from your desk;`);
			if (eventSlave.height >= 185) {
				r.push(`${he}'s tall enough for standing ${genitalText}, so as you approach ${he} just turns ${his} head back to face the door frame and cocks ${his} hips.`);
			} else if (eventSlave.height < 160) {
				r.push(`${he}'s so short standing ${genitalText} is a stretch, so as you approach ${he} goes up on tiptoe with one leg and runs the other up the wall, using it as support to hike ${his} ass as high as ${he} can manage.`);
			} else {
				r.push(`${he}'s shorter than you, so as you approach ${he} goes up on tiptoe to bring ${his} ass to just the right height for standing ${genitalText}.`);
			}
			r.push(`You don't penetrate ${him} right away, though; you`);
			if (eventSlave.butt > 5) {
				r.push(`knead ${his} mass of assflesh,`);
			} else if (eventSlave.butt > 2) {
				r.push(`heft a big buttock in each hand,`);
			} else {
				r.push(`cup ${his} nice little buttocks,`);
			}
			r.push(`briefly tease ${his}`);
			if (genitalCondition > 2) {
				if (genitalText === "sex") {
					r.push(`loose pussy`);
				} else {
					r.push(`gaping asshole`);
				}
			} else if (genitalCondition > 1) {
				if (genitalText === "sex") {
					r.push(`ready pussy`);
				} else {
					r.push(`ready asshole`);
				}
			} else {
				if (genitalText === "sex") {
					r.push(`fresh pussy`);
				} else {
					r.push(`inexperienced asshole`);
				}
			}
			r.push(`with one finger, and then run your hands around ${his}`);
			if (eventSlave.waist < -95) {
				r.push(`cartoonishly narrow`);
			} else if (eventSlave.waist < -10) {
				r.push(`wasp`);
			} else if (eventSlave.waist < 10) {
				r.push(`pretty`);
			} else {
				r.push(`thick`);
			}
			r.push(`waist and up ${his}`);
			if (eventSlave.belly >= 100000 || (eventSlave.weight <= 130 && eventSlave.belly >= 1500)) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
				r.push(`belly`);
			} else if (eventSlave.weight > 130) {
				r.push(`fat gut`);
			} else if (eventSlave.muscles > 30) {
				r.push(`ripped abs`);
			} else if (eventSlave.weight > 30) {
				r.push(`fat belly`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush stomach`);
			} else if (eventSlave.weight >= -10) {
				r.push(`taut stomach`);
			} else {
				r.push(`skinny body`);
			}
			r.push(`to rest`);
			if (eventSlave.boobs > 2000) {
				r.push(`buried under ${his} enormous breasts.`);
			} else if (eventSlave.boobs > 800) {
				r.push(`under ${his} heavy breasts.`);
			} else if (eventSlave.boobs > 200) {
				r.push(`under the curve of ${his} breasts.`);
			} else {
				r.push(`against ${his} trim chest.`);
			}
			r.push(`Despite ${his} poise ${he} sighs at your impromptu massage, gasps at your`);
			if (V.PC.belly >= 5000) {
				r.push(`pregnancy pushing`);
			} else if (V.PC.boobs >= 300) {
				r.push(`erect nipples brushing`);
			} else if (V.PC.title === 0) {
				r.push(`flat chest pressing`);
			} else {
				r.push(`muscular chest pressing`);
			}
			r.push(`against ${his} back, and shudders when your`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`stiff prick`);
			}
			r.push(`comes to rest between ${his} legs`);
			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
				r.push(r.pop() + `, the moist heat of your pussy very obvious at the base of your cock`);
			}
			r.push(r.pop() + `. You bring ${him} to a fine point of arousal, enjoying ${his} body, pulling ${his} ${eventSlave.skin} chin around to kiss ${his}`);
			if (eventSlave.lips > 60) {
				r.push(`bimbo`);
			} else if (eventSlave.lips > 40) {
				r.push(`big`);
			} else if (eventSlave.lips > 20) {
				r.push(`soft`);
			}
			r.push(`lips. ${He}'s so ready that when you finally penetrate ${him}, ${he} orgasms slightly after one thrust,`);
			return r;
		}

		function loveVagina() {
			r = [...loveResponse("sex", eventSlave.vagina)];
			if (eventSlave.dick > 6 && !canAchieveErection(eventSlave)) {
				r.push(`releasing a spurt of cum onto the floor`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`releasing a spurt of cum against the door frame.`);
			} else if (eventSlave.dick > 0) {
				r.push(`spurting cum against the door frame.`);
			} else {
				r.push(`grinding ${himself} between you and the door frame.`);
			}
			r.push(His);
			if (eventSlave.vagina > 2) {
				r.push(`well-traveled vagina clenches down to almost virgin tightness`);
			} else if (eventSlave.vagina > 1) {
				r.push(`veteran vagina tightens powerfully`);
			} else {
				r.push(`tight vagina tightens mercilessly`);
			}
			r.push(`with the orgasm, eliciting a sob of overstimulation, which you draw into a series of sobs by slowly fucking ${him} despite ${his} climax. You are gentle with ${him}, and continue teasing ${his} body, so that ${his} arousal builds again and ${he} manages to climax a second time when you do. You let ${him} out from between you and the door frame to wash, and return to work, but when ${he} emerges from a quick trip to the bathroom ${he}`);
			if (eventSlave.belly >= 300000) {
				r.push(`leans against ${his} ${belly} stomach,`);
			} else {
				r.push(`kneels on the couch,`);
			}
			r.push(`spreads ${his} lips with one hand,`);
			if (!canTalk(eventSlave)) {
				r.push(`and <span class="trust inc">earnestly asks</span> for more.`);
			} else {
				r.push(`and <span class="trust inc">asks earnestly,</span>`);
				r.push(Spoken(eventSlave, `"More please, ${Master}."`));
			}
			eventSlave.trust += 4;
			r.push(VCheck.Vaginal(eventSlave, 1));
			return r;
		}

		function loveButt() {
			r = [...loveResponse("anal", eventSlave.anus)];
			if (eventSlave.dick > 6 && !canAchieveErection(eventSlave)) {
				r.push(`releasing a spurt of cum onto the floor`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`releasing a spurt of cum against the door frame.`);
			} else if (eventSlave.dick > 0) {
				r.push(`spurting cum against the door frame.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`grinding ${his} featureless crotch against the door frame.`);
			} else {
				r.push(`leaving a little girlcum on the door frame.`);
			}
			r.push(`${His}`);
			if (eventSlave.anus > 2) {
				r.push(`tired sphincter clenches down to almost virgin tightness`);
			} else if (eventSlave.anus > 1) {
				r.push(`veteran sphincter tightens powerfully`);
			} else {
				r.push(`tight sphincter tightens mercilessly`);
			}
			r.push(`with the orgasm, eliciting a sob of overstimulation, which you draw into a series of sobs by slowly assfucking ${him} despite ${his} climax. You are gentle with ${his} butt, and continue teasing ${his} body, so that ${his} arousal builds again and ${he} manages to climax a second time when you do. You let ${him} out from between you and the door frame to wash, and return to work, but when ${he} emerges from a quick trip to the bathroom ${he}`);
			if (eventSlave.belly >= 300000) {
				r.push(`leans against ${his} ${belly} stomach,`);
			} else {
				r.push(`kneels on the couch,`);
			}
			r.push(`spreads ${his} buttocks with one hand,`);
			if (!canTalk(eventSlave)) {
				r.push(`and <span class="trust inc">earnestly asks</span> for more.`);
			} else {
				r.push(`and <span class="trust inc">asks earnestly,</span>`);
				r.push(Spoken(eventSlave, `"More please, ${Master}."`));
			}
			eventSlave.trust += 4;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function poundResponse() {
			r = [];
			r.push(`You choose your moment carefully, waiting until`);
			if (canSee(eventSlave)) {
				r.push(`${he} turns ${his} gaze away from you for an instant. When ${he} looks back, your desk chair is empty;`);
			} else if (canHear(eventSlave)) {
				r.push(`the ambient sound is loud enough for you to sneak up on ${him};`);
			} else {
				r.push(`you're certain ${he} won't notice you;`);
			}
			r.push(`for all ${his} sexual poise ${he}'s surprised by the force of your`);
			if (V.PC.belly >= 5000) {
				r.push(`pregnancy`);
			} else if (V.PC.boobs >= 300) {
				r.push(`tits`);
			} else {
				r.push(`chest`);
			}
			r.push(`crashing into ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`back, forcing ${his}`);
			if (eventSlave.belly >= 1500) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
				r.push(`belly`);
			}
			r.push(`against the door frame.`);
			return r;
		}

		function poundVagina() {
			r = [...poundResponse()];
			if (eventSlave.height >= 185) {
				r.push(`${He}'s so tall ${his} butt is at the perfect height right where it is, so ${he} relaxes as much as possible, trapped against the door frame.`);
			} else if (eventSlave.height < 160) {
				r.push(`${He}'s short enough that even tiptoes aren't enough, and you force ${him} up between you and the door frame, pinning ${his} little body helplessly in place.`);
			} else {
				r.push(`${He} squirms up on tiptoes to get ${his} hips to the right height, trapped between you and the door frame.`);
			}
			r.push(`None too soon, for the next thing ${he} feels is the pleasure of standing vaginal penetration,`);
			if (eventSlave.vagina > 2) {
				r.push(`though it's nothing new to ${him}.`);
			} else if (eventSlave.vagina > 1) {
				r.push(`veteran pussy notwithstanding.`);
			} else {
				r.push(`inserting slowly into ${his} still-tight pussy.`);
			}
			r.push(`You pump ${him} hard from the first stroke, making it clear you're taking your pleasure, leaving ${him} nothing to do but cling to the door frame and try to ride it out. At first ${he} was squashed painfully against it, but ${he} manages to`);
			if (eventSlave.belly >= 5000) {
				r.push(`shift ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
				r.push(`beside the frame and`);
			}
			r.push(`cock ${his} hips out at enough of an angle that ${he} can get back to`);
			if (eventSlave.dick > 6 && !canAchieveErection(eventSlave)) {
				r.push(`rubbing ${his} oversized cock between it and ${his} leg.`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`humping ${his} pathetic limp dick against it.`);
			} else if (eventSlave.dick > 0) {
				r.push(`rubbing ${his} cock against it.`);
			} else {
				r.push(`humping ${his} abdomen against it.`);
			}
			r.push(`${He} eventually shudders and spasms in orgasm,`);
			if (eventSlave.dick > 0) {
				r.push(`the ejaculate running down ${his} leg`);
			} else {
				r.push(`${his} legs almost give out`);
			}
			r.push(`making obvious ${his} pleasure in getting ${his} pussy fucked by you. You climax in triumph yourself before pulling the bitch off the door frame and flinging ${him} towards the bathroom to clean ${himself} up. When ${he} emerges, ${he} comes over to sit quietly next to your desk, looking up at you <span class="devotion inc">obediently.</span>`);
			eventSlave.devotion += 4;
			r.push(VCheck.Vaginal(eventSlave, 1));
			return r;
		}

		function poundButt() {
			r = [...poundResponse()];
			if (eventSlave.height >= 185) {
				r.push(`${He}'s so tall ${his} butt is at the perfect height right where it is, so ${he} relaxes as much as possible, trapped against the door frame.`);
			} else if (eventSlave.height < 160) {
				r.push(`${He}'s short enough that even tiptoes aren't enough, and you force ${him} up between you and the door frame, pinning ${his} little body helplessly in place.`);
			} else {
				r.push(`${He} squirms up on tiptoes to get ${his} butt to the right height, trapped between you and the door frame.`);
			}
			r.push(`None too soon, for the next thing ${he} feels is the discomfort of standing anal penetration,`);
			if (eventSlave.anus > 2) {
				r.push(`though it's nothing new to ${him}.`);
			} else if (eventSlave.anus > 1) {
				r.push(`veteran asshole notwithstanding.`);
			} else {
				r.push(`worsened by ${his} tight little sphincter.`);
			}
			r.push(`You ravage ${his} ass hard from the first stroke, making it clear you're taking your pleasure, leaving ${him} nothing to do but cling to the door frame and try to ride it out. At first ${he} was squashed painfully against it, but ${he} manages to`);
			if (eventSlave.belly >= 5000) {
				r.push(`shift ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
				r.push(`beside the frame and`);
			}
			r.push(`cock ${his} hips out at enough of an angle that ${he} can get back to`);
			if (eventSlave.dick > 6 && !canAchieveErection(eventSlave)) {
				r.push(`rubbing ${his} oversized cock between it and ${his} leg`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`humping ${his} pathetic limp dick against it`);
			} else if (eventSlave.dick > 0) {
				r.push(`rubbing ${his} cock against it`);
			} else if (eventSlave.vagina === -1) {
				r.push(`grind ${his} smooth groin against it instinctively, even though that's not very useful`);
			} else {
				r.push(`humping ${his} pussy against it`);
			}
			r.push(`for stimulation. ${His} asshole eventually spasms in orgasm, but it's spasmed so frequently during the rough sodomy that you don't realize the slut came to having ${his} asshole savaged until`);
			if (eventSlave.dick > 0) {
				r.push(`you notice the ejaculate running down ${his} leg.`);
			} else {
				r.push(`an aftershock almost makes ${his} legs give out.`);
			}
			r.push(`You climax in triumph yourself before pulling the bitch off the door frame and flinging ${him} towards the bathroom to clean ${himself} up. When ${he} emerges, ${he} comes over to sit quietly next to your desk, looking up at you <span class="devotion inc">obediently,</span> though you do notice ${he} sits to one side to take a bit of weight off ${his} poor rear.`);
			eventSlave.devotion += 4;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function invitation() {
			r = [];
			r.push(`There's a glint`);
			if (canSee(eventSlave)) {
				r.push(`in ${his} eyes as ${he} sees`);
			} else if (canHear(eventSlave)) {
				r.push(`on ${his} face as ${he} hears`);
			} else {
				r.push(`on ${his} face as ${he} senses`);
			}
			r.push(`you stand up from your desk and saunter over;`);
			if (eventSlave.height >= 185) {
				r.push(`${he}'s tall enough for standing`);
				if (V.PC.vagina !== -1) {
					r.push(`sex,`);
				} else {
					r.push(`anal,`);
				}
				r.push(`so as you approach ${he} just readies ${himself} to fuck ${his} lover.`);
			} else if (eventSlave.height < 160) {
				r.push(`${he}'s so short standing anal is a stretch, so once you approach you get down on your knees and greet the dick that will soon be in your`);
				if (V.PC.vagina !== -1) {
					r.push(`pussy.`);
				} else {
					r.push(`asshole.`);
				}
			} else {
				r.push(`${he}'s shorter than you, so as you approach ${he} goes up on tiptoe to bring ${his} dick to just the right height for standing sex.`); // TODO: add check when PC body is implemented
			}
			r.push(`${He} doesn't penetrate you right away, though; ${he}`);
			if (V.PC.butt >= 5) {
				r.push(`kneads your mass of assflesh`);
			} else if (V.PC.butt >= 4) {
				r.push(`hefts a huge buttock in each hand`);
			} else if (V.PC.butt >= 3) {
				r.push(`gives your big butt a slap`);
			} else {
				r.push(`cups your nice little buttocks`);
			}
			r.push(`before bending you over, bringing ${his} ${hasBothArms(eventSlave) ? `hands` : `hand`} to your`);
			if (V.PC.title === 0) {
				r.push(`wide hips`);
			} else {
				r.push(`masculine hips`);
			}
			r.push(`and mounting you.`);
			if (eventSlave.belly >= 100000) {
				r.push(`You grunt as the weight of ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
				r.push(`belly comes to rest on your back`);
				if (eventSlave.belly >= 300000) {
					r.push(r.pop() + `, the sheer gravity of it threatening to force you to the floor`);
				}
				r.push(r.pop() + `.`);
			} else if (eventSlave.boobs >= 15000) {
				r.push(`You grunt as you feel the weight of ${his} massive breasts slam into your back`);
				if (eventSlave.boobs >= 30000) {
					r.push(`before falling to your sides`);
				}
				r.push(r.pop() + `.`);
			} else if (eventSlave.weight > 160) {
				r.push(`You grunt as you feel the weight of ${his} fat gut settle on your back.`);
			}
			/* .vagina trainwreck ahead */
			if (eventSlave.dick === 1) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`${He} slips ${his} tiny dick into your vagina. Fortunately your custom cunt is capable of making even the most embarrassing of dicks pleasurable; though you wish ${he} could fill you a little better.`);
					} else if (V.PC.career === "escort") {
						r.push(`You sigh as ${his} tiny dick enters your stretched pussy. You're far too traveled to enjoy such a meager offering.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You sigh as ${his} tiny dick enters your used pussy. You've been stretched out so much from childbirth that ${he} just can't satisfy you anymore.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile. Suddenly, the size of ${his} cock doesn't seem to matter as much anymore.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You sigh as ${his} tiny dick enters your used pussy. ${He} stands no chance of competing with your old Master.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile. Suddenly, the size of ${his} cock doesn't seem to matter as much anymore.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You can barely feel ${him} slip into your loose cunt, but ${he} is so small it's not like you're missing much.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You feel ${him} slip into your vagina and abruptly stop; you sigh over how unsatisfyingly small ${he} is.`);
					} else {
						r.push(`You squirm as ${he} slips into your tight pussy. While ${his} length may be disappointing, ${he} stands no chance of stretching you out.`);
					}
				} else {
					r.push(`You have to check to see if ${he}'s even in your tight rear, only to find ${he} is already fully hilted. You sigh as ${he} thrusts into you: no prostate stimulation today.`);
				}
			} else if (eventSlave.dick === 2) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`${He} slips ${his} cute dick into your vagina. Fortunately your custom cunt is capable of making ${his} embarrassing offering pleasurable; though you wish ${he} could fill you a little better.`);
					} else if (V.PC.career === "escort") {
						r.push(`You sigh as ${his} cute dick enters your stretched pussy. You're far too traveled to enjoy such a meager offering, no matter how pathetically adorable it is.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You sigh as ${his} cute dick enters your abused pussy. You've been stretched out so much from childbirth that ${he} just can't satisfy you anymore.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile. Hopefully such a cute penis puts a cute baby in you.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You sigh as ${his} cute dick enters your used pussy. ${He} stands no chance of competing with your old Master.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile. You doubt ${his} children will stand up to his either.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You can barely feel ${him} slip into your loose cunt, but ${he} is so small it's not like you're missing much.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You feel ${him} slip into your vagina and sigh over how unsatisfyingly small ${he} is.`);
					} else {
						r.push(`You squirm as ${he} slips into your tight pussy. ${He} should be thankful you're so tight.`);
					}
				} else {
					r.push(`You sigh as you feel ${him} slip ${his} cute dick into your tight rear; no prostate stimulation today.`);
				}
			} else if (eventSlave.dick === 3) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`You shudder as ${he} slips ${his} dick into your vagina.`);
					} else if (V.PC.career === "escort") {
						r.push(`You sigh as ${his} dick slips into your stretched pussy. You're far too traveled for even average cocks these days.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You sigh as ${his} dick enters your abused pussy. You've been stretched out so much from childbirth that ${he} just can't satisfy you anymore.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You sigh as ${his} dick enters your used pussy. ${He} stands no chance of competing with your old Master.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You've gotten rather loose after your multiple children, so ${his} average cock is somewhat underwhelming.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You shiver with pleasure as ${he} slips ${his} dick into your pussy.`);
					} else {
						r.push(`You squirm as ${he} slips ${his} dick into your tight pussy, the sensation making you quiver with pleasure.`);
					}
				} else {
					r.push(`You squirm as you feel ${him} slip ${his} dick into your tight rear, the sensation making you quiver with pleasure.`);
					if (V.PC.dick !== 0) {
						r.push(`Your erection firmly`);
						if (V.PC.belly >= 10000) {
							r.push(`pushes into the underside of your belly,`);
						} else {
							r.push(`sticks out from under you,`);
						}
						r.push(`overstimulated from ${his} cock teasing your prostate.`);
					}
				}
			} else if (eventSlave.dick === 4) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`You shudder as ${he} slips ${his} big dick into your vagina.`);
					} else if (V.PC.career === "escort") {
						r.push(`You shudder as ${his} big dick slips into your stretched pussy. ${He} could use to be a little wider, but at least you can feel ${him}.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You shudder as ${his} big dick slips into your stretched pussy. ${He} could use to be a little wider, but at least you can feel ${him} after the havoc wreaked by your children.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You shudder as ${his} big dick slips into your used pussy. ${He}'s just the right size for you to remember your Master.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You've gotten rather loose after your multiple children, so ${his} big cock is a welcome feeling.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You moan with pleasure as ${he} slips ${his} big dick into your pussy, stretching you to your limit.`);
					} else {
						r.push(`You squirm as ${he} slips ${his} big dick into your tight pussy, the sensation making you quiver with pleasure and a little pain. ${He} gives you a chance to get used to ${his} size before continuing.`);
					}
				} else {
					r.push(`You squirm as you feel ${him} slip ${his} big dick into your tight rear, the sensation making you quiver with pleasure and a little pain. ${He} gives you a chance to get used to ${his} size before continuing.`);
					if (V.PC.dick !== 0) {
						r.push(`Your erection firmly`);
						if (V.PC.belly >= 10000) {
							r.push(`pushes into the underside of your belly,`);
						} else {
							r.push(`sticks out from under you,`);
						}
						r.push(`overstimulated from ${his} cock teasing your prostate.`);
					}
				}
			} else if (eventSlave.dick === 5) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`You shudder with delight as ${his} impressive dick stretches you perfectly.`);
					} else if (V.PC.career === "escort") {
						r.push(`You quiver with pleasure as ${his} impressive dick slips into your stretched pussy. It takes a lot to satisfy you and ${he} is not disappointing.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You quiver with pleasure as ${his} impressive dick slips into your stretched pussy. Even given the state of your pussy, ${he} fills you completely and perfectly.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You quiver with pleasure as ${his} impressive dick slips into your used pussy. ${He}'s bigger than your Master was and is hitting all the right places.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You've gotten rather loose after your multiple children, but you still find ${his} impressive dick almost uncomfortably large.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You squeal with mixed pleasure and pain as ${he} pushes ${his} impressive dick into your pussy, stretching you past your limit. ${He} gives you a chance to get used to ${his} size before continuing.`);
					} else {
						r.push(`You grit your teeth as ${he} slips ${his} impressive dick into your tight pussy, stretching you considerably. ${He} gives you a chance to get used to ${his} size before continuing.`);
					}
				} else {
					r.push(`You grit your teeth as you feel ${his} slip ${his} impressive dick into your tight rear, stretching you considerably. You bring a hand to your lower belly, feeling the bulge of ${his} cock deep within you. ${He} gives you a chance to get used to ${his} size before continuing, not that it will help much.`);
					if (V.PC.dick !== 0) {
						r.push(`Your erection firmly`);
						if (V.PC.belly >= 10000) {
							r.push(`pushes into the underside of your belly,`);
						} else {
							r.push(`sticks out from under you,`);
						}
						r.push(`overstimulated from ${his} cock teasing your prostate.`);
					}
				}
			} else if (eventSlave.dick === 6) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`You shudder with overwhelming pleasure as ${his} huge dick fills you completely.`);
					} else if (V.PC.career === "escort") {
						r.push(`You moan with pleasure as ${his} huge dick completely fills your stretched pussy. You gently caress ${his} dick through the bulge in your middle.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You moan with pleasure as ${his} huge dick completely fills your stretched pussy. You gently caress ${his} dick through the bulge in your middle.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You moan with pleasure as ${his} huge dick stretches your used pussy. ${He}'s far bigger than your Master ever was.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A small tickling in your belly reminds you you're fertile.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You may be rather loose after your multiple children, but ${his} huge dick is uncomfortably large.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You grit your teeth as ${he} pushes ${his} huge dick into your pussy, trying to bear being so painfully overstretched. ${He} gives you a chance to get used to ${his} size before continuing, not that it will help much.`);
					} else {
						r.push(`You cry out as ${he} forces ${his} huge dick into your too-tight pussy, nearly breaking you. ${He} considers pulling back out, but you pat the bulge in your lower belly and urge ${him} to continue. ${He} tries ${his} best to allow you to get comfortable, not that it will help much.`);
					}
				} else {
					r.push(`You cry out as ${he} forces ${his} huge dick into your too-tight rear, nearly breaking you. ${He} considers pulling back out, but you pat the bulge in your lower belly and urge ${him} to continue. ${He} tries ${his} best to allow you to get comfortable, not that it will help much.`);
					if (V.PC.dick !== 0) {
						r.push(`Your erection firmly`);
						if (V.PC.belly >= 10000) {
							r.push(`pushes into the underside of your belly,`);
						} else {
							r.push(`sticks out from under you,`);
						}
						r.push(`overstimulated from ${his} cock teasing your prostate.`);
					}
				}
			} else if (eventSlave.dick === 7) {
				if (V.PC.vagina !== -1) {
					if (V.PC.newVag === 1) {
						r.push(`You nearly blank out with pleasure as ${his} gigantic dick puts your new pussy to the test.`);
					} else if (V.PC.career === "escort") {
						r.push(`You drool with pleasure as ${his} gigantic dick completely fills your stretched depths. You gently caress ${his} dick through the bulge in your middle.`);
					} else if (V.PC.counter.birthsTotal >= 10) {
						r.push(`You drool with pleasure as ${his} gigantic dick completely fills your stretched pussy. Your cervix happily kisses the tip of ${his} dick, eager to get better acquainted.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`You can't help but wiggle against the monster in you like a bitch in heat.`);
						}
					} else if (V.PC.career === "servant") {
						r.push(`You moan with pleasure as ${his} gigantic dick stretches your used pussy to its limit. ${He}'s far bigger than your Master ever was, but it would be hard to even find a rival for this dick to begin with.`);
						if (canImpreg(V.PC, eventSlave)) {
							r.push(`A distinct hunger in your belly reminds you you're fertile and wriggling your hips like a bitch in heat.`);
						}
					} else if (V.PC.counter.birthsTotal > 2) {
						r.push(`You've had multiple children and ${his} gigantic dick feels like giving birth in reverse.`);
					} else if (V.PC.career === "gang" || V.PC.career === "celebrity" || V.PC.career === "wealth") {
						r.push(`You nearly break your teeth as ${he} pushes ${his} gigantic dick into your pussy, trying to bear nearly tearing. ${He} gives you a chance to get used to ${his} size before continuing, not that it will help much.`);
					} else {
						r.push(`You cry out as ${he} forces ${his} gigantic dick into your too-tight pussy, threatening to ruin you before reaching your cervix. ${He} considers pulling back out, but ${he} fills you so completely your vagina won't let go of what its got. Finally adjusting to the mass wedged inside you, you give the bulge in your lower belly an appreciative pat and urge ${him} to continue. It takes some time to get warmed up enough to handle ${him}, but the feeling is unimaginable.`);
					}
				} else {
					r.push(`You cry out as ${he} forces ${his} gigantic dick into your too-tight rear, threatening to ruin you. ${He} considers pulling back out, but ${he} fills you so completely your anus won't let ${him} go. Finally adjusting to the mass wedged inside you, you give the bulge in your lower belly an appreciative pat and urge ${him} to continue. It takes some time to get warmed up enough to handle ${him}, but the feeling is unimaginable.`);
					if (V.PC.dick !== 0) {
						r.push(`Your erection firmly`);
						if (V.PC.belly >= 10000) {
							r.push(`pushes into the underside of your belly,`);
						} else {
							r.push(`sticks out from under you,`);
						}
						r.push(`overstimulated from ${his} cock crushing your prostate.`);
					}
				}
			} else if (eventSlave.dick === 8) {
				r.push(`titanic dick`);
			} else if (eventSlave.dick === 9) {
				r.push(`absurd dick`);
			} else if (eventSlave.dick === 10) {
				r.push(`inhuman dick`);
			} else {
				r.push(`hypertrophied dick`);
			}
			r.push(`${He} gently fucks you,`);
			if (eventSlave.balls > 8) {
				r.push(`${his} oversized balls slapping your thighs with every thrust,`);
			}
			r.push(`making sure you're enjoying ${his} penis as much as physically possible. You climax`);
			if (V.PC.dick !== 0) {
				r.push(r.pop() + `, spurting your own line across the floor`);
			}
			r.push(`as ${he} cums inside, eliciting a gasp from the horny ${girl}. ${He} apologizes profusely for cumming in you, but after ${he} helps clean you up and back to your desk, all is forgiven. As you work, you can't help but steal glances at ${his} renewed erection. ${He} winks`);
			if (!canTalk(eventSlave)) {
				r.push(`and <span class="trust inc">earnestly asks</span> for more when you get the chance.`);
			} else {
				r.push(`and <span class="trust inc">asks earnestly,</span>`);
				r.push(Spoken(eventSlave, `"Want some more, ${Master}?"`));
			}
			eventSlave.trust += 4;
			if (V.PC.vagina !== -1) {
				seX(eventSlave, "penetrative", V.PC, "vaginal");
			} else {
				seX(eventSlave, "penetrative", V.PC, "anal");
			}
			if (canImpreg(V.PC, eventSlave)) {
				r.push(knockMeUp(V.PC, 20, 0, eventSlave.ID));
			}
			return r;
		}
	}
};


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) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [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);

		V.nextLink = "Next Week";

		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(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		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,
		]; // 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),
			]
		];
	}

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

		V.nextLink = "Next Week";

		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(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		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();
		}
	}
};