code:
App.Events.RESSSpaBoobs = class RESSSpaBoobs extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.spa > 0,
		]; // 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.boobs > 2000,
				s => s.devotion > 20,
				s => s.trust > 20,
				s => canDoAnal(s) || canDoVaginal(s),
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`The steamy air and hot water of the spa aren't only for slaves assigned to rest there full-time. When you head in to soak the day's stress away one evening, you see the back of`,
			contextualIntro(PC, eventSlave, true)
		);
		r.addToLast(`'s head resting against the edge of the warm pool; ${he}'s clearly come in after work.`);
		if (canHear(eventSlave)) {
			r.push(`${He} doesn't hear you come in and stays fully relaxed.`);
		} else {
			r.push(`${He}'s relaxed enough to exit the state of "high alert" ${his} deafness usually forces ${him} to be in.`);
		}
		r.push(`By the time you've showered`);
		if (S.Attendant) {
			r.addToLast(`, fucked the compliant ${S.Attendant.slaveName},`);
		}
		r.push(`and gotten ready to enter the pool, ${he}'s reached such a state of blissful relaxation that ${he} slides ${his} body off the ledge around the side of the pool and floats face-up with ${his} eyes closed.`);
		r.toParagraph();
		r.push(`The sight is comical.`);
		if (eventSlave.belly >= 5000 || eventSlave.weight > 95) {
			r.push(`Four`);
		} else {
			r.push(`Three`);
		}
		r.push(`things break the surface of the water: ${his} ${eventSlave.skin} face,`);
		if (eventSlave.belly >= 5000 || eventSlave.weight > 95) {
			r.push(`${his}`);
			if (eventSlave.belly >= 5000) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				}
			} else {
				r.push(`fat`);
			}
			r.push(`belly, and two enormous breasts.`);
		} else {
			r.push(`and two enormous breasts.`);
		}
		if (eventSlave.nipples === "huge") {
			r.push(`Each is capped by a gigantic nipple, soft with relaxation and the heat of the spa, but hugely prominent.`);
		}
		if (eventSlave.areolae > 1) {
			r.push(`${His} areolae spread widely around each nipple.`);
		}
		if (eventSlave.boobsImplant/eventSlave.boobs >= .50) {
			r.push(`${His} implants keep ${his} tits shaped in exactly the same way regardless of currents in the water, betraying their fake nature.`);
		} else if (eventSlave.boobsImplant === 0) {
			r.push(`${His} all-natural boobs move gently with currents in the water.`);
		} else {
			r.push(`${His} boobs bob gently to the currents in the water with just a bit more firmness than one would expect.`);
		}
		if (eventSlave.belly >= 500000) {
			r.push(`It's amazing ${he} can manage to stay afloat with ${his} middle that hugely distended.`);
		} else if (eventSlave.weight > 95) {
			r.push(`Water soundly laps against the sides of the flabby island that is ${his} gut.`);
		}
		r.push(`In any case, ${he}'s completely lost in the warmth and comfort of the water — and the relief of having the weight taken off ${his} chest`);
		if (eventSlave.belly >= 100000) {
			r.push(`and stomach`);
		}
		r.push(`for a brief moment.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Sit against the side of the pool with ${him} in your lap`, sit, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null),
			new App.Events.Result(`Fuck ${him} under the water`, fuck, virginityWarning()),
		]);

		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 sit() {
			const r = new SpacedTextAccumulator();
			r.push(`You`);
			if (V.PC.dick === 0) {
				r.push(`don a waterproof, vibrating strap-on and`);
			}
			r.push(`step into the pool and`);
			if (eventSlave.belly >= 450000) {
				r.push(`struggle to`);
			}
			r.push(`lift ${him} half-out of the water in a bridal carry, your arms behind ${his} shoulders and the backs of ${his} knees.`);
			if (canSee(eventSlave)) {
				r.push(`${His} eyes open`);
			} else {
				r.push(`${He} mumbles`);
			}
			r.push(`sleepily`);
			if (eventSlave.belly >= 1500) {
				r.push(`as ${he} rests a hand on ${his} ${belly} belly,`);
			}
			r.push(`and ${he} ${say}s`);
			if (eventSlave.lips > 70) {
				r.push(`through ${his} huge lips,`);
			} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
				r.push(`through ${his} piercings,`);
			} else {
				r.push(`quietly,`);
			}
			r.push(`"Hi, ${Master}." You sit against the side of the pool, letting ${his}`);
			if (eventSlave.butt > 8) {
				r.push(`massive`);
			} else if (eventSlave.butt > 5) {
				r.push(`huge`);
			} else if (eventSlave.butt > 2) {
				r.push(`healthy`);
			} else {
				r.push(`trim`);
			}
			r.push(`bottom sink down into your lap. ${He} shimmies ${himself} atop your`);
			if (V.PC.dick === 0) {
				r.push(`phallus,`);
			} else {
				r.push(`dick,`);
			}
			r.push(`gently seating it between ${his} buttocks, and cranes ${his} neck back to kiss the bottom of your chin. ${He} gradually comes out of ${his} heat stupor, riding ${himself} back and forth more and more until the`);
			if (eventSlave.anus > 2) {
				r.push(`slit of ${his} asspussy`);
			} else if (eventSlave.anus > 1) {
				r.push(`opening of ${his} anus`);
			} else {
				r.push(`pucker of ${his} butt`);
			}
			r.push(`rests against your`);
			if (V.PC.dick === 0) {
				r.push(`strongly vibrating strap-on.`);
			} else {
				r.push(`cock.`);
			}
			r.push(`You take ${his} hips and firmly thrust into ${his} rectum, eliciting a little whimper, but ${he} begins to bounce gently in the water, sodomizing ${himself}, ${his} gigantic breasts moving up and down and making concentric ripples spread outward. ${He}'s still very relaxed and ${his} first orgasm takes ${him} by surprise,`);
			if (eventSlave.balls > 0) {
				r.push(`${his} cum floating to the surface;`);
				if (canSee(eventSlave)) {
					r.push(`${he} points at it and giggles`);
				} else {
					r.push(`${he} feels it brush ${his} skin and giggles`);
				}
				r.push(`before getting`);
			} else {
				r.push(`making ${him} twitch and shudder with aftershocks as ${he} gets`);
			}
			r.push(`${his} feet up on the ledge to ride you harder. When you're done you let ${him} float again, but curiosity about how ${his} fucked butt feels under the water leads you to reach a hand`);
			if (hasBothLegs(eventSlave)) {
				r.push(`between ${his} legs`);
			} else {
				r.push(`underneath ${him}`);
			}
			r.push(`and grope ${his} anus. ${His} warm, relaxed`);
			if (eventSlave.anus > 2) {
				r.push(`asspussy`);
			} else if (eventSlave.anus > 1) {
				r.push(`backdoor`);
			} else {
				r.push(`tightness`);
			}
			r.push(`is so enticing you push ${him} to ${his} feet and take ${him} a second time, standing in the shoulder-depth water. By the time you're done ${he}'s so sexually exhausted that you carry ${him} to the shower.`);
			r.push(VCheck.Anal(eventSlave, 2));
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function fuck() {
			const r = new SpacedTextAccumulator();
			r.push(`You gather some necessary items into a pool bag and step stealthily into the water, taking ${him} by an ankle and towing ${him} toward the deep end. "Hi, ${Master}," comes a sleepy greeting from the slave as you pull ${him} through the water, ${his} boobs making twin bow waves. ${He} manages a shocked squeal as you quickly secure a weight belt`);
			if (eventSlave.belly >= 120000) {
				r.push(`above ${his}`);
			} else {
				r.push(`around ${his}`);
			}
			if (eventSlave.belly >= 1500) {
				r.push(`${belly}`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			}
			r.push(`middle and drop ${him}, letting ${him} sink so swiftly that`);
			if (eventSlave.butt > 5) {
				r.push(`${his} massive bottom pads ${him} against a painful thump on`);
			} else if (eventSlave.butt > 2) {
				r.push(`${his} healthy bottom pads ${him} against a painful thump on`);
			} else {
				r.push(`${his} bottom receives a painful thump against`);
			}
			r.push(`the bottom of the pool. Before ${he} can panic, ${he} feels your mouth against ${his}`);
			if (eventSlave.lips > 70) {
				r.push(`dick sucking`);
			} else if (eventSlave.lips > 20) {
				r.push(`lovely`);
			}
			r.push(`lips, breathing for ${him}. You have two long, flexible snorkels designed for exactly this, but you keep ${hers} away from ${him} and breathe ${his} air into ${him} for a short time, and ${he} trusts you enough to rely on you. When you finally give ${him} ${his} snorkel ${he} laughs, bubbles rising from around the mouthpiece, and then hugs you impulsively, intentionally giving you a huge faceful of boob. You pull ${his} weight belt down and tighten it around ${his} ankles so ${he}'s pinned standing on the bottom, and then`);
			if (V.PC.vagina !== -1) {
				r.push(`spread ${his} knees so you can scissor your pussy against ${him} in the near-zero gravity, the tangle of limbs and breasts swaying gently as you grind.`);
			} else {
				r.push(`insert yourself into the`);
				if (canDoVaginal(eventSlave)) {
					if (eventSlave.vagina > 3) {
						r.push(`welcoming gape of ${his} pussy.`);
					} else if (eventSlave.vagina > 2) {
						r.push(`loose embrace of ${his} pussy.`);
					} else if (eventSlave.vagina > 1) {
						r.push(`welcoming embrace of ${his} pussy.`);
					} else {
						r.push(`tight tight embrace of ${his} pussy.`);
					}
					r.push(`${He} enjoys the sensation of such an unusual fucking, wriggling against ${his} weighted feet and moaning through ${his} snorkel as you gently take ${him} under water. ${His} enormous breasts quiver in near-zero gravity with each thrust, until you notice the delicious motion and take one in each hand.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					if (eventSlave.anus > 2) {
						r.push(`loose slit of ${his} asspussy.`);
					} else if (eventSlave.anus > 1) {
						r.push(`welcoming pucker of ${his} anus.`);
					} else {
						r.push(`tight pucker of ${his} butt.`);
					}
					r.push(`${He} exaggerates ${his} discomfort, wriggling against ${his} weighted feet and squealing through ${his} snorkel as you gently sodomize ${him} under water. ${His} enormous breasts quiver in near-zero gravity with each thrust, until you notice the delicious motion and take one in each hand.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
			}
			r.push(`The amount of air you can pull through the snorkel just isn't enough to facilitate the throes of your lovemaking, so by the time you're done, ${he}'s so exhausted ${he} can barely float to the edge of the pool. Fortunately ${his} lovely tits make for quite the flotation device, so you gently guide ${him} to the shallow end`);
			if (V.PC.dick || eventSlave.balls) {
				r.addToLast(`, leaving a trail of cum in your wake`);
			}
			r.addToLast(`.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESSSurgeryAddict = class RESSSurgeryAddict 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 => s.rules.speech !== "restrictive",
				s => s.boobsImplant > 400,
				s => s.lipsImplant >= 30,
				s => s.buttImplant > 3,
				s => s.boobs < 9000 || s.butt < 8
			]
		];
	}

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

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

		let r = [];
		r.push(`Going about your day, you see`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`sitting`);
		if (hasAnyLegs(eventSlave)) {
			if (hasBothLegs(eventSlave)) {
				r.push(`cross-legged`);
			}
			r.push(`in`);
		} else {
			r.push(`propped against the doorway of`);
		}
		r.push(`the remote surgery room,`);
		if (canSee(eventSlave)) {
			r.push(`staring intently at`);
		} else {
			r.push(`gazing longingly towards`);
		}
		r.push(`the equipment. ${He}'s not breaking any rules, but this behavior is so strange you investigate. ${He} asks`);
		if (eventSlave.lips > 70) {
			r.push(`hesitantly through ${his} huge lips,`);
		} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
			r.push(`hesitantly through ${his} piercings,`);
		} else {
			r.push(`hesitantly,`);
		}
		r.push(Spoken(eventSlave, `"${Master}, I... I have a lot of implants. A lot."`));
		if (hasAnyArms(eventSlave)) {
			r.push(`${He} touches ${his} body absentmindedly.`);
		} else {
			r.push(`${He} wriggles ${his} body, trying to indicate ${his} implants.`);
		}
		r.push(`"Can... can you give me some more?"`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`${He} asked for it; give ${him} the works`, give),
			eventSlave.bellyPreg >= 5000
				? new App.Events.Result(`Not while ${he} is so pregnant`, pregnant)
				: new App.Events.Result(),
			new App.Events.Result(`No`, no),
		]);

		function give() {
			r = [];
			r.push(`As the sterile doors of the surgical equipment hiss closed over ${him}, you whisper in ${his} ear that ${he}'s about to be cut up. ${He} looks at you with a mix of fear and wild excitement. After nearly a whole week of constant surgery and expensive drug-induced recovery,`);
			if (canSee(eventSlave)) {
				r.push(`${he} finally gets to see ${his} new body in the mirror.`);
			} else if (!hasAnyArms(eventSlave)) {
				r.push(`you finally describe all the new implants in ${his} body and how they make ${him} look.`);
			} else {
				r.push(`you finally let ${him} feel ${his} new body, even helping ${his} hands to the less obvious changes.`);
			}
			r.push(`${He} has cartoonishly huge lips, boobs, and buttocks; ${he} looks like a caricature of a bimbo. ${He} cries with gratitude`);
			if (canSee(eventSlave)) {
				r.push(`to see ${himself},`);
			} else if (!hasAnyArms(eventSlave)) {
				r.push(`to`);
				if (canHear(eventSlave)) {
					r.push(`hear`);
				} else {
					r.push(`discover`);
				}
				r.push(`how ${he} looks,`);
			} else {
				r.push(`as ${he} feels ${his} new body,`);
			}
			r.push(`and can scarcely wait to recover enough to get fucked. <span class="devotion inc">${He} has become extremely devoted to you.</span>`);
			cashX(forceNeg(Math.trunc(125*V.upgradeMultiplierMedicine)), "slaveSurgery", eventSlave);
			eventSlave.devotion += 10;
			const boobImplant = Math.clamp(20000-eventSlave.boobs, 0, 2000);
			eventSlave.boobsImplant += boobImplant;
			eventSlave.boobs += boobImplant;
			const buttImplant = Math.clamp(10-eventSlave.butt, 0, 4);
			eventSlave.buttImplant += buttImplant;
			eventSlave.butt += buttImplant;
			const lipImplant = Math.clamp(80-eventSlave.lips, 0, 20);
			eventSlave.lipsImplant += lipImplant;
			eventSlave.lips += lipImplant;
			return r;
		}

		function pregnant() {
			return [`${He}'s clearly disappointed, but ${he} accepts your will and goes about ${his} business. After the incident, you notice that ${he} definitely seems to have a kink for implants. ${He} loves it when ${his} implants are groped, but ${his} favorite is when ${he} gets to fuck another slave with fake tits. ${He} can't keep ${his}`, ...noEnding()];
		}

		function no() {
			return [`${He}'s clearly disappointed, but ${he} accepts that you are watching out for ${his} health and goes about ${his} business. After the incident, you notice that ${he} definitely seems to have a kink for implants. ${He} loves it when ${his} implants are groped, but ${his} favorite is when ${he} gets to fuck another slave with fake tits. ${He} can't keep ${his}`, ...noEnding()];
		}

		function noEnding() {
			r = [];
			if (hasBothArms(eventSlave)) {
				r.push(`hands`);
			} else if (hasAnyArms(eventSlave)) {
				r.push(`fingers`);
			} else {
				r.push(`lips`);
			}
			r.push(`off a pair of bolted-on boobs.`);
			return r;
		}
	}
};

repo_name: Mirarara/fc

license: mit


code:
App.Events.RESSSurprisingWakeup = class RESSSurprisingWakeup 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.kindness !== undefined && s.kindness >= 100,
				s => (isSlaveAvailable(s) && canWalk(s)) || ([Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment)),
				s => s.relationship === -3,
				s => random(1, 200) < s.kindness || V.cheatMode === 1,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		const r = new SpacedTextAccumulator(node);
		r.push(`You are awakened from a sound sleep by someone eagerly`);
		if (PC.dick !== 0) {
			r.push(`sucking your dick.`);
		} else {
			r.push(`eating you out.`);
		}
		r.push(
			`Your slaves know better than to disturb you, let alone take the initiative, but you are shocked when you pull back the sheets and reveal the smile of`,
			contextualIntro(PC, eventSlave, true)
		);
		r.addToLast(`.`);
		if (!canTalk(eventSlave)) {
			r.push(`${He} promptly stops, flashes you an appreciative smile and goes right back to pleasing you.`);
		} else {
			r.push(
				`${He} pulls off you with a frown.`,
				Spoken(eventSlave, `"I'm sorry, ${Master},"`),
				`${he} ${say}s apologetically.`,
				Spoken(eventSlave, `"It's just, you've been so nice to me. This felt like the right thing to do."`),
				`${He} lowers ${his} head back to your crotch.`
			);
		}
		r.toParagraph();
		r.push(`${He} was mindbroken, but seems to have snapped out of it due to a deep love of you.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Permit ${him} to continue`, permit),
			new App.Events.Result(`Embrace ${him}`, embrace),
			new App.Events.Result(`Rape ${him}`, rape, virginityWarning()),
			new App.Events.Result(`Punish ${him} for waking you`, punish),
		]);

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

		function permit() {
			const r = new SpacedTextAccumulator();
			r.push(`You can't complain, it feels really good. You don't know where this skill was lurking in ${his} broken mind, but you're glad to see it put to good use.`);
			if (PC.dick !== 0) {
				r.push(`Just as you are about to cum, ${he} takes the full length of your dick down ${his} throat, diligently taking in every drop of cum.`);
			} else {
				r.push(`Even as you buck with pleasure, ${he} diligently keeps ${his} tongue to your clit and pussy, making sure you don't go a moment without pleasure.`);
			}
			r.push(`You don't have an orgasm like that every day, and as ${he} looks at you lovingly, you prod ${him} with your still hard`);
			if (PC.dick !== 0) {
				r.push(`cock`);
			} else {
				r.push(`clit`);
			}
			r.push(`for round two.`);
			r.push(`${He} is <span class="green">no longer mindbroken</span> and for whatever twisted reasons deeply and sincerely <span class="devotion inc">loves</span> and <span class="trust inc">trusts</span> you.`);
			eventSlave.devotion = 90;
			eventSlave.oldDevotion = 90;
			eventSlave.trust = 90;
			eventSlave.oldTrust = 90;
			eventSlave.sexualQuirk = "caring";
			eventSlave.fetish = "none";
			eventSlave.fetishKnown = 1;
			const geneIndex = V.genePool.findIndex(s => s.ID === eventSlave.ID);
			eventSlave.intelligence = V.genePool[geneIndex].intelligence;
			if (V.arcologies[0].FSPaternalist !== "unset") {
				r.push(`Society <span class="reputation inc">strongly approves</span> of ${eventSlave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`);
				V.arcologies[0].FSPaternalist += 0.01*V.FSSingleSlaveRep;
				repX(10*V.FSSingleSlaveRep*(V.arcologies[0].FSPaternalist/V.FSLockinLevel), "futureSocieties");
			}
			seX(eventSlave, "oral", PC, "penetrative", 2);
			eventSlave.kindness = 0;
			r.toParagraph();
			return r.container();
		}

		function embrace() {
			const r = new SpacedTextAccumulator();
			r.push(`You gently grab ${his} face and stare deeply into ${his} ${App.Desc.eyesColor(eventSlave)}.`);
			if (canSee(eventSlave)) {
				r.push(`They are full of life as opposed to their usual dullness.`);
			} else {
				r.push(`They are as dull as always, but that isn't ${his} fault. ${His} facial expressions at the act tell you all you need to know.`);
			}
			r.push(`You pull your ${wife} into a tight embrace — ${him} coming back to you is more than enough of a gift; ${he} needn't do anything more for now. You pull the covers over the both of you and begin to doze off, smiling at the warmth cuddling ever closer to you.`);
			r.push(`${He} is <span class="green">no longer mindbroken</span> and thanks to your care deeply and sincerely <span class="devotion inc">loves</span> and <span class="trust inc">trusts</span> you.`);
			eventSlave.devotion = 100;
			eventSlave.oldDevotion = 100;
			eventSlave.trust = 100;
			eventSlave.oldTrust = 100;
			eventSlave.sexualQuirk = "romantic";
			eventSlave.fetish = "none";
			eventSlave.fetishKnown = 1;
			const geneIndex = V.genePool.findIndex(s => s.ID === eventSlave.ID);
			eventSlave.intelligence = V.genePool[geneIndex].intelligence;
			if (V.arcologies[0].FSPaternalist !== "unset") {
				r.push(`Society <span class="reputation inc">strongly approves</span> of ${eventSlave.slaveName} being restored to sanity by the power of love, which advances ideals about enlightened slaveownership.`);
				V.arcologies[0].FSPaternalist += 0.01*V.FSSingleSlaveRep;
				repX(10*V.FSSingleSlaveRep*(V.arcologies[0].FSPaternalist/V.FSLockinLevel), "futureSocieties");
			}
			eventSlave.kindness = 0;
			r.toParagraph();
			return r.container();
		}

		function rape() {
			const fuckSlaves = fuckSlavesLength();
			const r = new SpacedTextAccumulator();
			r.push(`Getting head isn't going to cut it. You easily overpower the startled ${SlaveTitle(eventSlave)} and`);
			if (canDoVaginal(eventSlave)) {
				r.push(`flip ${him} onto ${his} back.`);
				if (PC.dick !== 0) {
					r.push(`You viciously rape ${him}, forcing yourself deep into ${him} before painting ${his} insides with your seed. You leave the quivering ${girl} to leak fluids while you get comfortable again.`);
					if (eventSlave.vagina === 0) {
						r.push(`${His} once virgin pussy now <span class="lime">gapes slightly</span> after your enjoyment of it.`);
						eventSlave.vagina++;
					}
				} else {
					r.push(`You don the biggest strap-on in reach and viciously rape ${him}, roughly groping ${his} breasts while you do. Once you are satisfied with the stimulation, you thrust hard and deep one last time for good measure, only to have the dildo stay firmly lodged in ${his} cunt. You shrug, not your problem.`);
					if (eventSlave.vagina === 0) {
						r.push(`${His} once virgin pussy now is now thoroughly stretched after your enjoyment of it. You watch ${his} body struggle to force the dildo out of ${him} until it manages to do so with a wet thud.`);
						eventSlave.vagina++;
					}
				}
				r.push(`${He} doesn't move from this position and barely reacts to your prodding; it seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake.`);
				seX(eventSlave, "vaginal", PC, "penetrative");
				if (canImpreg(eventSlave, PC)) {
					knockMeUp(eventSlave, 5, 0, -1);
				}
			} else if (canDoAnal(eventSlave)) {
				r.push(`force ${his} ass into the air.`);
				if (PC.dick !== 0) {
					r.push(`You viciously assrape ${him}, cumming strongly into ${his} spasming anus while making sure to save one last spurt to paint ${his} back with.`);
					if (eventSlave.anus === 0) {
						r.push(`${His} once virgin hole now <span class="lime">gapes slightly</span> after your enjoyment of it.`);
						eventSlave.anus++;
					}
				} else {
					r.push(`You don the biggest strap-on in reach and viciously assrape ${him}, forcing ${his} face into the sheets with one hand while roughly groping ${his} breasts with the other. Once you are satisfied with the stimulation, you thrust hard and deep one last time for good measure, only to have the dildo stay firmly lodged in ${his} ass. You shrug, not your problem.`);
					if (eventSlave.anus === 0) {
						r.push(`${His} once virgin hole now is now thoroughly stretched after your enjoyment of it. You watch ${his} body struggle to force the dildo out of rear until it manages to do so with a soft thud.`);
						eventSlave.anus++;
					}
				}
				r.push(`${He} doesn't move from this position and barely reacts to your prodding; it seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake.`);
				if (canImpreg(eventSlave, PC)) {
					knockMeUp(eventSlave, 5, 1, -1);
				}
				seX(eventSlave, "anal", PC, "penetrative");
			} else {
				r.push(`slam ${his} head into your crotch.`);
				if (PC.dick !== 0) {
					r.push(`You viciously facefuck ${him}, cumming strongly down ${his} gagging throat while making sure to save one last spurt to paint ${his} face with.`);
				} else {
					r.push(`As ${he} recoils, you grab a strap-on and force it into ${his} mouth before fastening it to yourself. Once you are situated, you viciously facefuck ${him} until you are satisfied. As ${he} struggles to catch ${his} breath, you toggle the release and reveal that it is a squirt dildo, painting ${his} face with fake semen.`);
				}
				r.push(`${He} falls backwards, where ${he} lays, unmoving. It seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake.`);
				seX(eventSlave, "oral", PC, "penetrative");
			}
			r.push(`You pull the blanket back over yourself and nudge ${him} off your bed; you'll deal with ${him} in the morning`);
			if (fuckSlaves > 1) {
				if (V.masterSuiteUpgradeLuxury === 2) {
					r.addToLast(`, which will likely entail pulling ${his} used body out of the fuckpit orgy`);
				} else {
					r.addToLast(`, assuming one of your other toys doesn't get to ${him} first`);
				}
			}
			r.addToLast(`.`);
			if (fuckSlaves > 1 && V.masterSuiteUpgradeLuxury === 2) {
				if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					if (eventSlave.anus < 3) {
						eventSlave.anus++;
					}
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves*2);
				}
				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					if (eventSlave.vagina < 3) {
						eventSlave.anus++;
					}
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves*2);
				}
				seX(eventSlave, "oral", PC, "penetrative", fuckSlaves*2);
			} else if (fuckSlaves > 1) {
				if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves*2);
				} else if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves*2);
				} else {
					seX(eventSlave, "oral", PC, "penetrative", fuckSlaves*2);
				}
			}
			eventSlave.kindness = -100;
			r.toParagraph();
			return r.container();
		}

		function punish() {
			const fuckSlaves = fuckSlavesLength();
			const r = new SpacedTextAccumulator();
			r.push(`In one swift motion you throw aside the cover and backhand the ${SlaveTitle(eventSlave)} for waking you. ${He} falls to your side, where ${he} lays, unmoving. It seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake. You pull the blanket back over yourself; you'll deal with ${him} in the morning`);
			if (fuckSlaves > 1) {
				if (V.masterSuiteUpgradeLuxury === 2) {
					r.addToLast(`, which will likely entail pulling ${his} used body out of the fuckpit orgy`);
				} else {
					r.addToLast(`, assuming one of your other toys doesn't get to ${him} first`);
				}
			}
			r.addToLast(`.`);
			if (fuckSlaves > 1 && V.masterSuiteUpgradeLuxury === 2) {
				if (canDoAnal(eventSlave) &&eventSlave.anus >0) {
					if (eventSlave.anus < 3) {
						eventSlave.anus++;
					}
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves*2);
				}
				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					if (eventSlave.vagina < 3) {
						eventSlave.vagina++;
					}
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves*2);
				}
				seX(eventSlave, "oral", PC, "penetrative", fuckSlaves*2);
			} else if (fuckSlaves > 1) {
				if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves);
				} else if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves);
				} else {
					seX(eventSlave, "oral", PC, "penetrative", fuckSlaves);
				}
			}
			eventSlave.kindness = -100;
			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESSTendonFall = class RESSTendonFall extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.slaves.length > 2,
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.devotion >= -20,
				s => s.heels === 1,
				s => shoeHeelCategory(s) > 0
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`There is a horrible crash from the bathroom. You rush in to see`,
			contextualIntro(PC, eventSlave, true),
			`curled up helplessly in the bottom of the shower with the water playing over ${his}`,
		);
		if (eventSlave.belly >= 5000) {
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`gravid`);
			} else {
				r.push(`rounded`);
			}
		} else {
			r.push(`altered`);
		}
		r.push(`body. ${He} takes off ${his} heels to shower, making ${him} unable to stand independently. Apparently, ${he} lost ${his} grip on the handrail while trying to soap ${himself}, and having fallen, can't seem to reach the rail to haul ${himself} up again.`);
		r.push(`${He} pleads`);
		if (canTalk(eventSlave)) {
			if (eventSlave.lips > 70) {
				r.push(`through ${his} huge lips`);
			} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
				r.push(`through ${his} piercings`);
			}
			r.addToLast(`, "Help me, ${Master}!"`);
		} else {
			r.push(`with you, desperately signing ${his} need for help.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Help ${him} clean ${himself}`, clean),
			(canDoVaginal(eventSlave) || canDoAnal(eventSlave))
				?	new App.Events.Result(`Fuck ${his} prostrate body`, prostate, (V.PC.dick !== 0 && ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)))) ? `This option will take ${his} virginity` : null)
				:	new App.Events.Result(),
			new App.Events.Result(`Let ${him} struggle`, struggle),
		]);

		function clean() {
			const r = new SpacedTextAccumulator();
			r.push(`You step into the running water and seat yourself in the shower, drawing ${him} into your lap. ${He} seems surprised and`);
			if (canSee(eventSlave)) {
				r.push(`stares at you through the steam`);
			} else {
				r.push(`gazes towards you`);
			}
			r.push(`for a moment before looking away with a blush. ${He} expects you to`);
			if (V.PC.dick === 0) {
				r.push(`ride ${his} wet face,`);
			} else {
				r.push(`insert your member into ${his} wet body,`);
			}
			r.push(`but finds you handing ${him} the soap instead. You gently support ${him} as ${he} washes, partaking of physical closeness and support. ${He} has become more devoted to you.`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function prostate() {
			let didVaginal = false;
			let didAnal = false;
			const r = new SpacedTextAccumulator();
			r.push(`You make no answer, entering the shower to stand over ${him} prostrate form. You reach down and grope ${him} soapy`);
			if (V.seeRace === 1) {
				r.push(`${eventSlave.race}`);
			}
			r.push(`buttocks, questing fingers moving towards ${his} asscrack.`);
			if (eventSlave.anus > 2 && canDoAnal(eventSlave)) {
				r.push(`${His} rectum is so fucked out and loose that your groping hand almost slides up it.`);
			} else if (eventSlave.vagina > 2 && canDoVaginal(eventSlave)) {
				r.push(`${His} pussy is so fucked out and loose that your groping hand almost slides up it.`);
			} else {
				r.push(`You finger fuck ${him} for a while, the sting of the soap on ${his} sensitive insides making ${him} gasp.`);
			}
			r.push(`As ${he} moans down on the shower floor, you lie down behind ${him}, spooning ${his} helpless body`);
			if (eventSlave.belly >= 5000) {
				r.addToLast(`, your hands encircling ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`middle`);
				}
			}
			r.addToLast(`.`);
			if (V.PC.dick !== 0) {
				r.push(`Your cock slides into ${him} with ease`);
			} else if (V.PC.boobs >= 300) {
				r.push(`${His} soft back is delicious against your hard nipples`);
			} else {
				r.push(`The contours of ${his} soft rear feel lovely against your feminine petals`);
			}
			r.push(`and the warm water playing over your warm bodies is a comforting accompaniment to the comforting sex.`);
			if (V.PC.dick === 0) {
				r.push(`You ride yourself against ${his} warm wet body until you climax from the rubbing alone`);
			} else {
				r.push(`You leave a load of cum in`);
				if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
					r.push(`each of ${his} holes`);
					didVaginal = true;
					didAnal = true;
				} else if (canDoAnal(eventSlave)) {
					r.push(`${his} loosened butthole`);
					didAnal = true;
				} else {
					r.push(`${his} loosened vagina`);
					didVaginal = true;
				}
				if (V.PC.vagina !== -1) {
					r.push(`and make ${him} eat your pussy for a quick aftershock,`);
				}
			}
			r.push(`and only then do you help ${him} back to ${his} feet. ${He} drips soap, water, and`);
			if (V.PC.dick === 0) {
				r.push(`your juices.`);
			} else {
				r.push(`ejaculate.`);
			}
			r.push(`<span class="devotion inc">${He} has become more submissive.</span>`);
			if (didVaginal && didAnal) {
				r.push(VCheck.Both(eventSlave, 1));
			} else if (didVaginal) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else if (didAnal ) {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function struggle() {
			eventSlave.devotion -= 5;
			return `${He} struggles for a while until you get bored and leave ${him} to it. Eventually ${his} thrashing brings another slave in, who helps ${him}. This interdependence between slaves reduces ${his} devotion.`;
		}
	}
};


code:
App.Events.RESSTerrifiedInspection = class RESSTerrifiedInspection 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.trust < -50,
				s => s.devotion <= 20,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`appears in the door of your office for a scheduled inspection. ${He} hesitates in the doorway,`,
		);
		if (canSee(eventSlave)) {
			r.push(`staring fixedly downward with huge ${App.Desc.eyesColor(eventSlave)},`);
		} else {
			r.push(`${his} face towards the floor,`);
		}
		r.push(`before stumbling forward to stand in front of your desk. ${His} chest is rising and falling with panicked hyperventilation. The poor ${SlaveTitle(eventSlave)} is terrified of you for some reason.`);
		r.toParagraph();
		r.push(`You let ${him} stand there naked and shivering while you finish what you're working on. ${He} holds ${his} ${eventSlave.skin}`);
		if (hasBothArms(eventSlave)) {
			r.push(`hands down at ${his} sides, just like ${he}'s supposed to, but they twitch`);
		} else {
			r.push(`hand down at ${his} side, just like ${he}'s supposed to, but it twitches`);
		}
		r.push(`inward occasionally, betraying ${his} desire to shield ${his}`);
		if (eventSlave.nipples === "huge") {
			r.push(`prominent nipples`);
		} else if (eventSlave.boobs > 1000) {
			r.push(`big tits`);
		} else {
			r.push(`chest`);
		}
		r.push(`and`);
		if (eventSlave.dick >= 10) {
			r.push(`massive, limp dick`);
		} else if (eventSlave.dick > 7) {
			r.push(`huge, limp dick`);
		} else if (eventSlave.dick > 3) {
			r.push(`big, limp dick`);
		} else if (eventSlave.dick > 0) {
			r.push(`limp little prick`);
		} else if (eventSlave.clit > 1) {
			r.push(`absurd clit`);
		} else if (eventSlave.labia > 0) {
			r.push(`pretty petals`);
		} else if (eventSlave.vagina === -1) {
			r.push(`smooth, featureless groin`);
		} else {
			r.push(`pussy`);
		}
		r.push(`from your view. The wait gives license to ${his} fears. ${His}`);
		if (eventSlave.lips > 70) {
			r.push(`ridiculous`);
		} else if (eventSlave.lips > 0) {
			r.push(`plush`);
		}
		r.push(`lips are quivering, and tears are quickly gathering at the corners of ${his} eyes.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Confirm ${his} fears about you`, confirm),
			new App.Events.Result(`Conduct a straightforward inspection`, conduct),
		]);

		function confirm() {
			const r = new SpacedTextAccumulator();
			if (canSee(eventSlave)) {
				r.push(`You throw ${him} a black cloth bag and tell ${him} to put it over ${his} head. ${He} obeys hurriedly, though ${he} cannot quite restrain ${his} tears from running down ${his} ${eventSlave.skin} cheeks as ${he} dons the bag, blinding ${himself}.`);
			}
			r.push(`${He} trembles, blind and terrified, for several agonized minutes before a strangled sob escapes ${him}. ${He} immediately cringes, expecting to be punished, but nothing happens. You let ${him} stand there for almost an hour, until you're sure ${he}'s let ${his} guard down, and then approach ${him} quietly. You consider ${his} body, your personal property, carefully; and on careful consideration, you aim a vicious flick at ${his}`);
			if (eventSlave.balls > 3) {
				r.push(`nutsack.`);
			} else if (eventSlave.dick > 0) {
				r.push(`cockhead.`);
			} else if (eventSlave.clit > 1) {
				r.push(`prominent clit.`);
			} else if (eventSlave.labia > 0) {
				r.push(`prominent labia.`);
			} else if (eventSlave.nipples === "huge") {
				r.push(`one of ${his} vulnerable nipples.`);
			} else {
				r.push(`one of ${his} nipples.`);
			}
			r.push(`A flick barely registers on the list of ways you can administer pain to a slave, but after so much sensory deprivation, it knocks ${him} halfway to the ground with a shriek of surprise and agony. ${He} crouches involuntarily, cherishing ${his} stinging`);
			if (eventSlave.balls > 3) {
				r.push(`testicles`);
			} else if (eventSlave.dick > 0) {
				r.push(`prick`);
			} else if (eventSlave.clit > 1) {
				r.push(`bitch button`);
			} else if (eventSlave.labia > 0) {
				r.push(`pussylips`);
			} else {
				r.push(`nipple`);
			}
			r.push(`with both hands, sobbing. You`);
			if (canSee(eventSlave)) {
				r.push(`pluck the bag off ${his} head and`);
			}
			r.push(`tell ${him} to get out. ${He} half-walks, half-crawls away,`);
			if (canSee(eventSlave)) {
				r.push(`shielding ${his} eyes from the sudden brightness,`);
			}
			r.push(`<span class="trust dec">choking on ${his} tears.</span>`);
			eventSlave.trust -= 5;
			r.toParagraph();
			return r.container();
		}

		function conduct() {
			const title = (eventSlave.rudeTitle === 1) ? PoliteRudeTitle(eventSlave) : Master;
			const r = new SpacedTextAccumulator();
			r.push(`You order ${him} to spin slowly in place in a matter-of-fact tone of voice. ${He} does,`);
			if (eventSlave.weight > 160) {
				r.push(`${his} fat body wobbling a little with the motion.`);
			} else if (eventSlave.belly >= 10000) {
				r.push(`${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly swinging wide as ${he} turns.`);
			} else if (eventSlave.weight > 95) {
				r.push(`${his} chubby body wobbling a little with the motion.`);
			} else if (eventSlave.weight > 30) {
				r.push(`${his} chubby belly wobbling a little with the motion.`);
			} else if (eventSlave.dick > 1) {
				r.push(`${his} soft dick waving a little with the motion.`);
			} else if (eventSlave.boobs > 800) {
				r.push(`${his} udders swaying a little with the motion.`);
			} else if (eventSlave.butt > 4) {
				r.push(`${his} ass jiggling a little with the motion.`);
			} else if (eventSlave.muscles > 5) {
				r.push(`${his} abs playing across ${his} midsection as ${he} does`);
			} else {
				r.push(`${his} trim rear catching your eye.`);
			}
			r.push(`In the same straightforward tone, you ask about ${his} health. ${He} swallows nervously and stammers,`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth/8 && eventSlave.preg < eventSlave.pregData.normalBirth/3.33) {
				r.push(`"I, I haven't been feeling good in the morning,`);
			} else if (eventSlave.health.condition < -20) {
				r.push(`"I, I don't feel very good,`);
			} else if (eventSlave.preg.isBetween(0, eventSlave.pregData.normalBirth / 6.66)) {
				r.push(`"I, I feel a little off. The food`);
				if (canTaste(eventSlave)) {
					r.push(Spoken(eventSlave, `tastes`));
				} else {
					r.push(Spoken(eventSlave, `seems`));
				}
				r.push(Spoken(eventSlave, `weird lately and my breasts are really sensitive,`));
			} else if (eventSlave.health.condition > 20) {
				r.push(`"I'm, I'm okay,`);
			} else {
				r.push(`"I, I feel healthy,`);
			}
			if (eventSlave.preg > eventSlave.pregData.normalBirth-2 && eventSlave.pregControl !== "labor suppressors") {
				r.push(`and I think it might be time soon,`);
			}
			r.push(`${title}."`);
			r.toParagraph();
			r.push(`You then conduct a more thorough inspection, from the top of ${his} ${eventSlave.hColor}-haired head on down. ${He} complies submissively, obviously expecting to be abused at any moment. ${He} obediently`);
			if (eventSlave.boobs > 1000) {
				r.push(`lifts each of ${his} massive breasts one by one to display each of them from all angles.`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`allows you to do as you will to ${his} gravid stomach.`);
			} else {
				r.push(`opens ${his} mouth and sticks out ${his} tongue on command.`);
			}
			r.push(`${He} even obeys an instruction to`);
			if (eventSlave.dick > 1) {
				r.push(`take ${himself} by the dickhead and pull ${his} member flat up against ${his} abdomen.`);
			} else if (eventSlave.dick > 0) {
				r.push(`take ${his} little dickhead between a thumb and forefinger and hold ${himself} out straight to reveal how tiny ${he} really is.`);
			} else if (eventSlave.clit > 1) {
				r.push(`push back ${his} hood to reveal all of ${his} enormous clit.`);
			} else if (eventSlave.labia > 1) {
				r.push(`spread ${his} meaty labia to reveal ${his} cunt.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`really show off ${his} smooth groin, displaying every bit of it, down to the tiny hole that's its only feature.`);
			} else {
				r.push(`spread ${his} pussylips to show off ${his} cunt.`);
			}
			r.toParagraph();
			r.push(`Finally the inspection reaches ${his} backdoor, so you tell ${him} to turn around, bend over, and pull ${his} buttocks apart as wide as ${he} can. ${He} tenses in fear, obviously expecting anal rape, but after a moment of hesitation, ${he} obeys. ${He} turns,`);
			if (eventSlave.belly >= 10000) {
				r.push(`carefully bends,`);
			} else {
				r.push(`bends,`);
			}
			r.push(`and`);
			if (eventSlave.butt > 5) {
				r.push(`grabs a handful of buttcheek in`);
				if (hasBothArms(eventSlave)) {
					r.push(`both hands,`);
				} else {
					r.push(`${his} hand,`);
				}
				r.push(`trembling as ${he} spreads ${his} ass to reveal`);
			} else if (eventSlave.butt > 2) {
				r.push(`harshly pulls ${his} own buttcheeks apart, clearly hoping that if ${he} treats ${himself} this way, you won't. ${He} reveals`);
			} else {
				r.push(`even though ${his} trim ass has already revealed everything, uses ${his} ${hands} to spread ${himself} even wider to show off`);
			}
			if (eventSlave.anus > 2) {
				r.push(`${his} poor, overused asshole, which despite ${his} terror is still gaping a little.`);
			} else if (eventSlave.anus > 1) {
				r.push(`${his} asshole, which is clenched tight in terror.`);
			} else {
				r.push(`${his} invitingly tight asshole, which is clenched hard in terror.`);
			}
			r.push(`Maintaining your neutral tone, you ask ${him} how ${he} feels about anal sex.`);
			if (eventSlave.anus === 0) {
				r.push(
					Spoken(eventSlave, `"It's s-scary, ${title}. I'm afraid it'll h-hurt,"`),
					`${he} gasps out.`
				);
			} else if (eventSlave.fetishKnown === 1 && eventSlave.fetish === "buttslut") {
				r.push(
					Spoken(eventSlave, `"It's o-okay, ${title}. I d-don't hate it,"`),
					`${he} gasps out.`
				);
			} else if (eventSlave.sexualFlaw === "hates anal") {
				r.push(
					Spoken(eventSlave, `"I h-hate it, ${title}. It's d-dirty and it hurt,"`),
					`${he} gasps out.`
				);
			} else if (eventSlave.anus > 2) {
				r.push(
					Spoken(eventSlave, `"It's not that bad, ${title}. I'm used to getting assfucked, I guess,"`),
					`${he} ${say}s haltingly.`
				);
			} else {
				r.push(
					Spoken(eventSlave, `"I h-hate it, ${title}. I'm n-not used to it, and it hurts,"`),
					`${he} gasps out.`
				);
			}
			r.push(`Without another word, you tell ${him} ${he} can go. ${He} looks around to gape uncomprehendingly at you for a moment before letting go of ${his} buttocks, straightening up, and`);
			if (eventSlave.belly >= 10000) {
				r.push(`quickly waddling,`);
			} else {
				r.push(`fleeing,`);
			}
			r.push(`feeling rather mystified that you <span class="trust inc">didn't use ${him}.</span>`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESSTittymonsterInspection = class RESSTittymonsterInspection 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.assignment !== Job.QUARTER,
				s => s.boobs > 25000,
				s => s.belly < 100000,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, hers
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;
		const arms = hasBothArms(eventSlave) ? "arms" : "arm";

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`You enter your office from other business a few minutes after the scheduled start of`,
			contextualIntro(PC, eventSlave, true)
		);
		r.addToLast(`'s inspection. The`);
		if (V.boobAccessibility === 1) {
			r.push(`accessibility aids for slaves with immobilizing breasts`);
		} else {
			r.push(`slaves who helped ${him} in`);
		}
		r.push(`have gone, leaving ${him} waiting for you in front of your desk. The sight is an arresting one. ${He}'s kneeling, but ${his} boobs are so enormous that they're resting on the ground in front of ${him}, completely concealing ${his} body below the chest`);
		if (eventSlave.belly >= 120000) {
			r.addToLast(`, save for the protruding mass of ${his}`);
			if (eventSlave.pregType > 8) {
				r.push(`hyper pregnant`);
			} else if (eventSlave.pregType > 4) {
				r.push(`${pregNumberName(eventSlave.pregType, 1)}-filled`);
			} else {
				r.push(`overly distended`);
			}
			r.push(`belly`);
		}
		r.addToLast(`. With ${his} ${arms} tucked back, and ${his} torso,`);
		if (eventSlave.belly < 120000) {
			if (eventSlave.bellyPreg > 100) {
				r.push(`pregnancy,`);
			} else if (eventSlave.belly > 100) {
				r.push(`swollen stomach,`);
			} else {
				r.push(`abdomen,`);
			}
		}
		r.push(`and legs hidden, ${he} appears to consist of a`);
		if (eventSlave.face > 95) {
			r.push(`gorgeous,`);
		} else if (eventSlave.face > 50) {
			r.push(`beautiful,`);
		} else if (eventSlave.face >= 10) {
			r.push(`pretty,`);
		} else if (eventSlave.face >= 0) {
			r.push(`nice,`);
		} else {
			r.push(`homely,`);
		}
		r.push(`${eventSlave.faceShape} face, a`);
		if (eventSlave.collar === "none") {
			r.push(`bare`);
		} else {
			r.push(`collared`);
		}
		r.push(`neck, ${eventSlave.skin},`);
		if (eventSlave.muscles > 95) {
			r.push(`hugely muscled`);
		} else if (eventSlave.muscles > 30) {
			r.push(`strong`);
		} else if (eventSlave.shoulders > 0) {
			r.push(`broad`);
		} else if (eventSlave.shoulders < 0) {
			r.push(`feminine`);
		} else if (eventSlave.muscles > 5) {
			r.push(`toned`);
		} else {
			r.push(`soft`);
		}
		r.push(`shoulders, and below that, breasts`);
		if (eventSlave.belly >= 120000) {
			r.push(`parted by ${his} ${belly} dome of a stomach`);
		}
		r.addToLast(`. ${He} greets you`);
		if (eventSlave.devotion > 50) {
			r.push(`devotedly, behaving for all the world like ${he}'s pleased to be`);
		} else if (eventSlave.devotion >= -20) {
			r.push(`properly, with just a hint of unhappiness about being`);
		} else {
			r.push(`with more than a hint of resentment over being`);
		}
		r.push(`pinned to the floor by ${his} own tits.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Continue ${his} inspection as scheduled`, scheduled),
			new App.Events.Result(`Use ${him} as a cushion`, cushion),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Enjoy ${his} helplessness`, helplessness, virginityWarning())
				: new App.Events.Result()
		]);

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

		function scheduled() {
			const r = new SpacedTextAccumulator();
			r.push(`You're already late for this little meeting; you wouldn't want to keep ${him} here when you both have more productive things to do. ${His} inspection is exemplarily routine; ${he} has nothing significant to report. When all is said and done, you dismiss ${him}, and ${he} stands up,`);
			if (eventSlave.devotion > 20) {
				r.push(`genuinely`);
			} else {
				r.push(`quickly`);
			}
			r.push(`thanks you for your time, and leaves.`);
			r.toParagraph();
			return r.container();
		}

		function cushion() {
			const r = new SpacedTextAccumulator();
			r.push(`You tell ${him} ${he}'s looking very nice today. Surprised, ${he} manages`);
			if (eventSlave.devotion > 20) {
				r.push(`to thank you prettily, wondering`);
			} else {
				r.push(`to thank you hesitantly, worrying about`);
			}
			r.push(`what comes next. You pick up a tablet, come around your desk, and fold yourself into a lotus position, just in front of ${him} and with your back to ${him}. Struck by this strange and trusting maneuver, ${he} keeps still, letting you get yourself situated. You slide backward until you are pressed against the mound of breasts behind you, and then relax into their soft, fleshy mass. Your back nestles naturally into ${his} cleavage, and the give of ${his} huge mammaries conforms to you, allowing you to rest your elbows comfortably on each breast as though they were armrests. Feeling the weight of you against ${his} chest, ${eventSlave.slaveName} throws ${his} arms back, bracing ${himself} against the floor.`);
			if (eventSlave.belly >= 15000) {
				r.push(`You can feel ${his} full, taut,`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
				r.push(`just barely once you have sunk deep into ${his} cleavage.`);
			}
			r.push(`You begin to tap away at the tablet, and ${he} realizes`);
			if (eventSlave.devotion > 20) {
				r.push(`with pleased surprise`);
			} else {
				r.push(`with mixed resentment and relief`);
			}
			r.push(`that you intend to use ${him} as a sort of human cushion for a while. From where ${he}'s sitting, ${he}`);
			if (canSee(eventSlave)) {
				r.push(`can easily read over your shoulder, and you make no attempt to stop ${him};`);
			} else {
				r.push(`could read over your shoulder, if ${he} could see;`);
			}
			r.push(`keeping secrets from your slaves is generally impractical, and`);
			if (eventSlave.devotion > 20) {
				r.push(`this ${SlaveTitle(eventSlave)} is trustworthy.`);
			} else {
				r.push(`there's nothing ${he} could do with your secrets, even if ${he} were to try.`);
			}
			r.push(`After an hour or so, you inspect ${him} and dismiss ${him}, and ${he} leaves <span class="trust inc">trusting ${his} bizarre place</span> in your world.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}

		function helplessness() {
			const r = new SpacedTextAccumulator();
			r.push(`You give ${him} no orders at all, since ${his} helplessness makes ${him}`);
			if (eventSlave.devotion > 20) {
				r.push(`cooperation`);
			} else {
				r.push(`consent`);
			}
			r.push(`completely unnecessary for what you're planning. ${He} makes to turn as you come around behind ${him}, but ${he} can manage only a partial crane of ${his} shoulders and neck to`);
			if (canSee(eventSlave)) {
				r.push(`see`);
			} else {
				r.push(`figure out`);
			}
			r.push(`what you're doing. Seizing ${his} ankles, you haul ${his} legs out from under ${his} boobs and body, and then push ${him} forward, balancing ${his} body atop ${his} tits as though they were an exercise ball.`);
			if (eventSlave.devotion > 20) {
				r.push(`${He} giggles at this,`);
			} else {
				r.push(`${He} struggles a little at the sudden discomfort,`);
			}
			r.push(`and tries to steady ${himself} with ${his} hands, so you pull them around behind ${him} and pin ${his} arms to ${his} ${eventSlave.skin} back with one of your hands. You`);
			if (V.PC.dick !== 0) {
				r.push(`shove your dick up`);
			} else {
				r.push(`pull on a strap-on with your other hand and insert it into`);
			}
			r.push(`${his} defenseless`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy.`);
			} else {
				r.push(`asshole.`);
			}
			r.push(`Then you fuck ${him}.`);
			r.push(VCheck.Simple(eventSlave, 1));
			r.toParagraph();

			r.push(`You're physically fit to begin with, and between that and all the practice you get, you pride yourself on your`);
			if (V.PC.dick !== 0) {
				if (V.PC.vagina !== -1) {
					r.push(`master level futa skills.`);
				} else {
					r.push(`cocksmanship.`);
				}
			} else {
				r.push(`power with a strap-on.`);
			}
			r.push(`You can fuck hard, and ${eventSlave.slaveName} gets fucked hard. Having all of ${his} weight on ${his} tits, and being sawed back and forth on top of those tits, is not comfortable.`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina < 3) {
					r.push(`Worse, only the most veteran cunt could accept this kind of treatment without some pain, and ${hers} is far tighter than you're treating it.`);
				}
			} else {
				if (eventSlave.anus < 3) {
					r.push(`Worse, only the most veteran asspussy could accept this kind of treatment without some pain, and ${hers} is far tighter than you're treating it.`);
				}
			}
			if (eventSlave.voice === 0) {
				r.push(`Since ${he} cannot groan, ${he} begins to gasp raggedly`);
			} else {
				r.push(`${He} begins to grunt and groan`);
			}
			r.push(`with each forward thrust as you penetrate ${him}, pressing ${him} forward across ${his} cushion of boobs. ${He} tries to take some of the weight off with ${his} feet, but after some vain scrabbling ${he}'s obliged to give up and take it.`);
			r.toParagraph();

			r.push(`When you're finished, you withdraw and drop ${him}, letting ${him} slump against ${his} sore breasts. ${He}'s too tired and overstimulated to do anything but stay limp, and ${his} relaxed`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy`);
			} else {
				r.push(`butthole`);
			}
			if (V.PC.dick !== 0) {
				r.push(`releases drips of your cum to go sliding down ${his} thighs.`);
			} else {
				r.push(`glistens attractively with lube.`);
			}
			r.push(`You direct`);
			if (V.boobAccessibility === 1 || V.pregAccessibility === 1) {
				r.push(`the accessibility assistance functions of your office to`);
			} else {
				r.push(`the slaves who helped ${him} in to return and`);
			}
			r.push(`help ${him} get cleaned up, and turn to your desk to get some work done as they struggle with the mountain of exhausted, fucked-out tits discarded in the middle of your office.`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.assignment !== Job.QUARTER,
				s => s.boobs > 600,
				s => s.boobShape === "torpedo-shaped",
				s => s.devotion >= -50,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(`The penthouse bathroom has a long counter and mirror arrangement with many sinks, so a number of slaves can get ready at once. During those moments of the day when`);
		if (V.slaves.length > 10) {
			r.push(`many`);
		} else {
			r.push(`more than one`);
		}
		r.push(
			`of them have just been awoken and showered and are hurrying to prettify themselves, this row of sinks presents one of the nicer sights in the arcology, a neatly spaced line of slave butts and a matching line of breasts reflected in the mirror.`,
			contextualIntro(V.PC, eventSlave, true),
			`is especially impressive. ${His}`
		);
		if (eventSlave.boobs > 4000) {
			r.push(`monstrous`);
		} else if (eventSlave.boobs > 2000) {
			r.push(`huge`);
		} else {
			r.push(`big`);
		}
		r.push(`torpedo-shaped tits stick out a long way when ${he}'s standing upright in the nude like this.`);
		r.toParagraph();
		r.push(`With ${his}`);
		if (eventSlave.belly >= 100000) {
			if (eventSlave.bellyPreg >= 1500) {
				r.push(`${belly} pregnant`);
			} else {
				r.push(belly);
			}
			r.push(`belly`);
		} else if (eventSlave.weight > 130) {
			r.push(`fat belly`);
		} else if (eventSlave.belly >= 10000) {
			if (eventSlave.bellyFluid >= 10000) {
				r.push(`${eventSlave.inflationType}-stuffed`);
			} else if (eventSlave.bellyPreg >= 1500) {
				r.push(`enormously pregnant`);
			} else {
				r.push(`enormously distended`);
			}
			r.push(`belly`);
		} else if (eventSlave.weight > 30) {
			r.push(`soft belly`);
		} else if (eventSlave.belly >= 1500) {
			if (eventSlave.bellyFluid >= 1500) {
				r.push(`${eventSlave.inflationType}-filled`);
			} else if (eventSlave.bellyPreg >= 1500) {
				r.push(`pregnant`);
			} else {
				r.push(`implant rounded`);
			}
			r.push(`belly`);
		} else if (eventSlave.muscles > 30) {
			r.push(`ripped abs`);
		} else if (eventSlave.muscles > 5) {
			r.push(`toned stomach`);
		} else {
			r.push(`middle`);
		}
		r.push(`against the edge of the counter as ${he} leans forward a little to`);
		if (eventSlave.makeup !== 0) {
			r.push(`finish ${his} makeup,`);
		} else {
			r.push(`apply lotion to ${his} face,`);
		}
		r.push(`${his} ${eventSlave.nipples} nipples are`);
		if (eventSlave.boobs > 6000) {
			r.push(`pressed against the mirror.`);
		} else if (eventSlave.boobs > 4000) {
			r.push(`almost brushing the mirror.`);
		} else if (eventSlave.boobs > 2000) {
			r.push(`halfway to the mirror.`);
		} else {
			r.push(`over the sink.`);
		}
		r.push(`${He}'s concentrating on ${his} task, and every little motion of ${his} ${arms} makes ${his} spectacularly pointed breasts sway a little.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Give them a surprise massage`, surprise),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Make ${him} bounce them painfully`, bounce, ((eventSlave.vagina === 0 && canDoVaginal(eventSlave)) || (eventSlave.anus === 0 && canDoAnal(eventSlave))) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result()
		]);

		function surprise() {
			const r = new SpacedTextAccumulator();
			r.push(`You move stealthily up behind ${him} in a predatory crouch, your arms forward and your fingers spread. When ${he} reaches up to`);
			if (eventSlave.makeup !== 0) {
				r.push(`do ${his} eyes,`);
			} else {
				r.push(`massage ${his} forehead,`);
			}
			r.push(`you take advantage of ${his} newly vulnerable flanks and reach around ${him} to take ${his} torpedo tits in hand. ${He}`);
			if (eventSlave.voice !== 0) {
				r.push(`howls`);
			} else {
				r.push(`makes the raspy noise that mute slaves make when`);
			}
			r.push(`in shock, writhing away from the grasping digits. Your hands aren't particularly cold, but ${he}'s deliciously warm from the shower and you're holding onto ${him} firmly. ${His}`);
			if (eventSlave.butt > 12) {
				r.push(`titanic ass`);
			} else if (eventSlave.butt > 5) {
				r.push(`massive ass`);
			} else if (eventSlave.butt > 2) {
				r.push(`plush bottom`);
			} else {
				r.push(`trim behind`);
			}
			r.push(`bumps into you as ${he} recoils, and ${he} freezes, realizing who you are. You slide your grip back towards ${him}, down away from the point of each tit, grab ${his} back where ${he}'s broader, and knead ${him} gently, moving forward down ${his} breasts.`);
			if (eventSlave.fetish === "boobs") {
				if (eventSlave.fetishKnown !== 1) {
					r.push(`${His} chest swells in your embrace as ${he} sucks in ${his} breath, stiffening with arousal. ${He} seems to love breast play, and if properly encouraged, might orgasm to it.`);
					eventSlave.fetishKnown = 1;
				} else {
					r.push(`${He} stiffens with arousal, since breast play is the main sexual event as far as ${he}'s concerned.`);
					if (canAchieveErection(eventSlave) && (eventSlave.chastityPenis === 1)) {
						r.push(`There's an audible little smack as ${he} achieves an erection, bringing ${his} dickhead against the bottom of the counter.`);
					}
				}
			} else if (eventSlave.devotion > 50) {
				r.push(`${He} softens into your`);
				if (V.PC.boobs >= 300) {
					r.push(`bosom,`);
				} else {
					r.push(`chest,`);
				}
				r.push(`wriggling ${his} back into you to get comfortable.`);
			} else if (eventSlave.devotion > 20) {
				r.push(`${He} makes an effort to relax, and you can feel the stiffness go out of ${his} back, pressed against your`);
				if (V.PC.boobs >= 300) {
					r.push(`bosom.`);
				} else {
					r.push(`chest.`);
				}
			} else {
				r.push(`${He} remains stiff and afraid, shivering a little against your`);
				if (V.PC.boobs >= 300) {
					r.push(`bosom.`);
				} else {
					r.push(`chest.`);
				}
			}
			r.push(`${He} expects to get fucked, but you just massage ${his} breasts thoroughly, give ${his}`);
			if (eventSlave.pregKnown === 1) {
				r.push(`belly`);
			} else {
				r.push(`butt`);
			}
			r.push(`a possessive pat, and continue on your way. ${He} thanks you`);
			if (eventSlave.devotion > 50) {
				r.push(`with touching sincerity`);
			} else if (eventSlave.devotion > 20) {
				r.push(`sincerely`);
			} else {
				r.push(`hesitantly`);
			}
			r.push(`and returns to ${his} business, <span class="mediumaquamarine">smiling a little.</span>`);
			eventSlave.trust += 4;
			if (eventSlave.lactation > 0) {
				eventSlave.lactationDuration = 2;
				eventSlave.boobs -= eventSlave.boobsMilk;
				eventSlave.boobsMilk = 0;
			} else {
				r.push(induceLactation(eventSlave, 3));
			}
			r.toParagraph();
			return r.container();
		}

		function bounce() {
			const r = new SpacedTextAccumulator();
			r.push(`Appearing behind ${him}, you order ${him} to bounce up and down. You don't mention ${his} prominent tits, but ${he} knows exactly what you mean and is`);
			if (eventSlave.devotion > 50) {
				r.push(`eager to please.`);
			} else if (eventSlave.devotion > 20) {
				r.push(`willing to please.`);
			} else {
				r.push(`willing to debase ${himself} to avoid punishment.`);
			}
			r.push(`${He} bounces up and down, watching for your reaction in the mirror. Harder, you tell ${him}, and ${he} bounces harder. Harder, you tell ${him} again, and then again. ${He} jumps up and down hard enough that ${his} promontories slap painfully against ${him},`);
			if (eventSlave.fetish === "masochist") {
				if (eventSlave.fetishKnown !== 1) {
					r.push(`making ${him} gasp with arousal. ${He} stares at ${himself} in shock, and then at your reflection, mystified and a little frightened that you might have seen. You did see, and you're not perplexed. ${eventSlave.slaveName} is a sexual masochist, and if properly encouraged, can probably be trained to be a proper slut for pain.`);
					eventSlave.fetishKnown = 1;
				} else {
					r.push(`making the masochistic ${SlaveTitle(eventSlave)} gasp with arousal.`);
				}
			} else if (eventSlave.devotion > 50) {
				r.push(`extracting a gasp as ${he} willingly causes ${himself} considerable discomfort at your command.`);
			} else if (eventSlave.devotion > 20) {
				r.push(`making ${him} wince. ${He} starts to look afraid.`);
			} else {
				r.push(`and ${he} starts to cry, more from fear than from the pain.`);
			}
			r.toParagraph();
			r.push(`Pleased, you tell ${him} to keep it up as best ${he} can, and trap ${his} hips against the edge of the counter before sliding`);
			if (V.PC.dick !== 0) {
				r.push(`your cock`);
			} else {
				r.push(`a strap-on`);
			}
			if (canDoVaginal(eventSlave)) {
				r.push(`into ${his} pussy.`);
			} else {
				r.push(`up ${his} asshole.`);
			}
			r.push(`It's not a comfortable angle, and between the rough penetration and the continued mammary torture,`);
			if (eventSlave.fetish === "masochist") {
				r.push(`${he} orgasms promptly`);
				if (eventSlave.balls > 0) {
					r.addToLast(`, scattering cum all over the counter`);
				}
			} else {
				r.push(`tears begin to run down ${his} cheeks`);
			}
			r.addToLast(`. When you climax, you grab the undersides of ${his} breasts and hoist ${him} up in a parody of exaltation, thrusting as far into ${him} as you can manage`);
			if (V.PC.dick !== 0) {
				r.push(`and`);
				if (canDoVaginal(eventSlave)) {
					r.push(`coming inside ${him}`);
				} else {
					r.push(`blowing your load in ${his} butt`);
				}
			}
			r.addToLast(`. The thrust, the lift, and the harsh hold on ${his} poor boobs extracts`);
			if (eventSlave.voice !== 0) {
				r.push(`a shriek`);
			} else {
				r.push(`the pathetic little gasping noise that mute slaves make when in agony`);
			}
			r.push(`from ${his}`);
			if (eventSlave.lactation > 0) {
				r.addToLast(`, not to mention`);
				if (eventSlave.lactation === 1) {
					r.push(`a few drops of ${milkFlavor(eventSlave)}milk`);
				} else {
					r.push(`an ejaculation-like stream of ${milkFlavor(eventSlave)}milk`);
				}
				r.push(`from each of ${his} nipples`);
			}
			r.addToLast(`. You discard your toy on the counter,`);
			if (eventSlave.fetish === "masochist") {
				r.push(`leaving the poor pain addict in a state of <span class="hotpink">high sexual satiation,</span> even if ${he} does move ${his} battered breasts gingerly as ${he} climbs down.`);
				eventSlave.devotion += 4;
			} else {
				r.push(`leaving ${him} to climb down ${himself}, <span class="gold">fearfully</span> watching your receding back as ${he} gets off the counter, favoring ${his} battered breasts.`);
				eventSlave.trust -= 4;
			}
			r.push(VCheck.Simple(eventSlave, 1));
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.assignment !== Job.QUARTER,
				s => s.devotion <= 20,
				s => s.trust <= -20,
				s => s.genes === "XY",
				s => s.dick > 0,
				s => s.chastityPenis !== 1,
				s => s.vagina === -1,
				s => s.attrXY < 50,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`stumbles into your office naked for ${his} weekly inspection, so apprehensive that ${he} can hardly walk. ${He}'s been like this ever since ${he} became one of your sex slaves,`,
		);
		if (V.week-eventSlave.weekAcquired === 0) {
			r.push(`just this week.`);
		} else if (V.week-eventSlave.weekAcquired === 1) {
			r.push(`just last week.`);
		} else {
			r.push(`${num(V.week-eventSlave.weekAcquired)} weeks ago.`);
		}
		r.push(`It's not surprising; slaves like ${him} usually require some time and training to accept that they're slavegirls. ${He} lacks the natural attraction to men that might have made the idea more comfortable for ${him}, and the resulting sexual anxiety combined with understandable fear of sexual use makes ${him} extremely unhappy to be naked in front of someone ${he} knows can fuck ${him} at will.`);
		r.toParagraph();
		r.push(`${He} has ${his} hands balled into fists at ${his} sides, and clearly wants nothing more than to use them to cover ${his}`);
		if (eventSlave.chastityPenis === 1) {
			r.push(`pitiful caged dick.`);
		} else if (eventSlave.balls === 0) {
			r.push(`pathetic, ballsless bitchclit.`);
		} else if (eventSlave.aphrodisiacs > 0 || eventSlave.inflationType === "aphrodisiac") {
			r.push(`aphrodisiac-induced erection.`);
		} else if (eventSlave.dick > 3) {
			r.push(`impressively sized but pathetically soft dick.`);
		} else {
			r.push(`soft, pathetic little dick.`);
		}
		r.push(`${He} knows that that's not allowed, and keeps ${his} hands where they are, though it's a struggle. ${He}`);
		if (canSee(eventSlave)) {
			r.push(`sees you looking at`);
		} else {
			r.push(`knows you are eyeing`);
		}
		r.push(`${his} body like a slaveowner looks at one of ${hisP} sex slaves, and ${he} shivers.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			canDoAnal(eventSlave)
				? new App.Events.Result(`Fuck ${him}`, fuck, eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null)
				: new App.Events.Result(),
			new App.Events.Result(`Humiliate ${him} in public`, humiliate)
		]);

		function fuck() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You announce that you're going to fuck ${his}`);
			if (eventSlave.anus === 0) {
				r.push(`virgin`);
			}
			r.push(`asspussy. To your complete lack of surprise, ${he} can't hide ${his} horror at the prospect of`);
			if (V.PC.dick !== 0) {
				r.push(`having a cock inside ${him},`);
			} else {
				r.push(`being fucked with a strap-on,`);
			}
			r.push(`and ${his}`);
			if (canSee(eventSlave)) {
				r.push(`wide, ${App.Desc.eyesColor(eventSlave)} track`);
			} else {
				r.push(`terrified face follows`);
			}
			r.push(`your movements closely as you stand up and`);
			if (V.PC.dick !== 0) {
				r.push(`reveal the formidable member`);
			} else {
				r.push(`don the strap-on`);
			}
			r.push(`you're about to breed ${him} with. You order ${him} to`);
			if (hasAnyLegs(eventSlave)) {
				r.push(`kneel`);
			} else {
				r.push(`get`);
			}
			r.push(`on the couch, which ${he} does, cringing in fear of being buttfucked, but knowing disobedience will be worse; and then you order ${him} to reach down and spread ${his} butt for you, as wide as it'll go. ${He} complies,`);
			if (eventSlave.butt > 12) {
				r.push(`grabbing as much flesh as ${he} can of each monstrous buttock and heaving them as far apart as ${he} can manage in an attempt`);
			} else if (eventSlave.butt > 6) {
				r.push(`taking a handful of each massive buttock and heaving them apart to reveal ${his}`);
			} else if (eventSlave.butt > 3) {
				r.push(`pulling ${his} plush buttocks apart`);
			} else {
				r.push(`even though ${his} cute ass doesn't have to be spread`);
			}
			r.push(`to reveal ${his}`);
			if (eventSlave.anus > 2) {
				r.push(`whorish anal slit.`);
			} else if (eventSlave.butt > 1) {
				r.push(`relaxed rear hole.`);
			} else {
				r.push(`tight little rosebud.`);
			}
			r.push(`You let ${him} soak in ${his} discomfort,`);
			if (V.PC.dick !== 0) {
				r.push(`stroking your cock gently`);
			} else {
				r.push(`rubbing a little lube on the tip of your phallus`);
			}
			r.push(`and letting ${him} see how big it is. ${His} cringing even extends to ${his} asshole,`);
			if (eventSlave.analArea > 3) {
				r.push(`the huge area of crinkled skin`);
			} else if (eventSlave.analArea > 1) {
				r.push(`the crinkled skin around ${his} anus`);
			} else {
				r.push(`${his} little pucker`);
			}
			r.push(`tensing as ${he} anticipates anal sex.`);
			eventSlave.trust -= 3;

			r.toParagraph();
			App.Events.addResponses(frag, [
				new App.Events.Result(`Make sure ${he} gets off on it`, off),
				new App.Events.Result(`Rape ${him}`, rape),
			]);
			return r.container();

			function off() {
				const r = new SpacedTextAccumulator();
				r.push(`You press`);
				if (V.PC.dick !== 0) {
					r.push(`yourself`);
				} else {
					r.push(`your weapon`);
				}
				r.push(`past ${his} sphincter with care, and ${his} posture softens a little as ${he} realizes you aren't going to hurt ${him}. Once you've hilted`);
				if (V.PC.dick !== 0) {
					r.push(`your cock`);
				} else {
					r.push(`the strap-on`);
				}
				r.push(`inside ${him}, you caress ${his}`);
				if (eventSlave.belly >= 150000) {
					r.push(`${belly} distended`);
				} else if (eventSlave.weight > 95) {
					r.push(`fat`);
				} else if (eventSlave.belly >= 5000) {
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy swollen`);
					} else if (eventSlave.bellyImplant >= 3000) {
						r.push(`implant swollen`);
					} else {
						r.push(`${eventSlave.inflationType}-bloated`);
					}
				} else if (eventSlave.weight > 30) {
					r.push(`chubby`);
				} else if (eventSlave.waist < -95) {
					r.push(`narrow`);
				} else if (eventSlave.muscles > 30) {
					r.push(`muscular`);
				} else if (eventSlave.waist < -10) {
					r.push(`wasp`);
				} else if (eventSlave.weight > 10) {
					r.push(`soft`);
				} else if (eventSlave.muscles > 5) {
					r.push(`toned`);
				} else {
					r.push(`thin`);
				}
				r.push(`waist, running your hands across ${his} skin. Then you`);
				if (eventSlave.piercing.genitals.smart) {
					r.push(`activate ${his} smart frenulum piercing.`);
				} else {
					r.push(`secure a couple of little egg vibes to ${his} dick.`);
				}
				r.push(`${He} gasps as the vibration starts, and then gasps again as ${his} anus tightens involuntarily with the stimulation, squeezing the`);
				if (V.PC.dick !== 0) {
					r.push(`warm penis`);
				} else {
					r.push(`phallus`);
				}
				r.push(`that fills it. ${He}`);
				if (eventSlave.voice > 0) {
					r.push(`moans openly`);
				} else {
					r.push(`rasps mutely`);
				}
				r.push(`as you pull out and then thrust into ${him}. Much against ${his} will, ${he}`);
				if (canAchieveErection(eventSlave)) {
					r.push(`quickly becomes erect.`);
				} else {
					r.push(`starts to drip precum, which is ${his} ballsless body's way of showing arousal.`);
				}
				if (eventSlave.fetish === "buttslut") {
					if (eventSlave.fetishKnown === 1) {
						if (eventSlave.fetishStrength > 95) {
							r.push(`Every time ${he} takes it up the butt, ${he}'s reminded that ${he}'s a natural buttslut, and the reminder <span class="fetish inc">helps ${him} relax and accept sodomy.</span>`);
							eventSlave.fetishStrength += 10;
						} else {
							r.push(`${He} knows ${he} gets off easily on anal stimulation, but taking it like this still isn't ${his} favorite activity. Still, the`);
							if (eventSlave.prostate > 0) {
								r.push(`prostate`);
							} else {
								r.push(`rectal`);
							}
							r.push(`stimulation does its work, and ${he} <span class="devotion inc">submits to having ${his} favorite hole pleasured.</span>`);
							eventSlave.devotion += 3;
						}
					} else {
						r.push(`You notice that ${he} stiffens again, looking down at ${his} traitorous member in shock at how much ${he} enjoys the sensation of`);
						if (eventSlave.prostate > 0) {
							r.push(`prostate`);
						} else {
							r.push(`rectal`);
						}
						r.push(`stimulation. <span class="fetish gain">${He}'s a buttslut!</span>`);
						eventSlave.fetishKnown = 1;
					}
				}
				r.push(VCheck.Anal(eventSlave, 1));
				r.push(`Not long after you penetrate ${him}, ${he}`);
				if (eventSlave.balls > 0) {
					r.push(`squirts a weak ejaculation onto the couch.`);
				} else {
					r.push(`shivers and releases some watery fluid.`);
				}
				r.push(`${He} had almost forgotten that ${he} was being fucked like a girl, and stiffens uncomfortably when ${he} feels you`);
				if (V.PC.dick !== 0) {
					r.push(`fill ${his} rectum with your hot seed.`);
				} else {
					r.push(`grip ${his} hips harder and shake with your own climax.`);
				}
				r.push(`As ${he} gets up from the couch, ${he} seems subdued and submissive. After all, if ${he}'s submitting to you, that absolves ${him} of responsibility for what ${he}'s becoming.`);
				eventSlave.devotion += 5;
				r.toParagraph();
				return r.container();
			}

			function rape() {
				const r = new SpacedTextAccumulator();
				r.push(`You grab ${his} hips, getting a good grip, and spear the poor ${SlaveTitle(eventSlave)} without any hint of mercy. ${He}`);
				if (eventSlave.voice > 0) {
					r.push(`screams in pain and fear,`);
				} else {
					r.push(`sucks in a great sobbing gasp,`);
				}
				r.push(`and tries to wriggle away despite ${his} intention of submitting to your use, but you hold ${him} in place and rape ${his} ass.`);
				r.push(VCheck.Anal(eventSlave, 1));
				r.push(`${He} tries to maintain ${his} position, crying openly, but eventually slides off ${his} perch on the couch, pulling ${his} hole off your`);
				if (V.PC.dick !== 0) {
					r.push(`dick.`);
				} else {
					r.push(`strap-on.`);
				}
				r.push(`You grab ${him} by`);
				if (eventSlave.hLength > 20) {
					r.push(`hair`);
				} else {
					r.push(`neck`);
				}
				r.push(`and smash ${his} face into the angle of the couch, leaving ${his} poor butt completely vulnerable. ${He} can't see you line up to ream ${him} again, but ${he} knows it's coming and cries, quivering. After a while, you haul ${him} up to ${his} feet and keep fucking ${him}, the uncomfortable angle of standing anal forcing new`);
				if (eventSlave.voice > 0) {
					r.push(`squeals`);
				} else {
					r.push(`rasps`);
				}
				r.push(`out of ${him}. You pour degradation into ${his} ear as you take your pleasure from ${his} unhappy body, telling ${him} that ${he}'s your fuckmeat. ${He} believes you, and when you finally orgasm and let ${him} slide off your hateful`);
				if (V.PC.dick !== 0) {
					r.push(`penis,`);
				} else {
					r.push(`strap-on,`);
				}
				r.push(`${he}'s <span class="trust dec">already terrified</span> of the next time you feel like fucking ${him}.`);
				eventSlave.trust -= 5;
				r.toParagraph();
				return r.container();
			}
		}

		function humiliate() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You get up from behind your desk, drawing an apprehensive`);
			if (canSee(eventSlave)) {
				r.push(`stare.`);
			} else {
				r.push(`look.`);
			}
			r.push(`To ${his} bemusement, you order ${him} to follow you and leave your office. ${He} hurries to obey, ${his} footsteps pattering along behind you, but they become much more hesitant as you make your way out of the penthouse and ${he} realizes that ${he}'s about to be in public, naked. You don't bother looking back, knowing that ${he}'s sufficiently afraid of you to obey. On the border between your private domain and the public hustle and bustle of the arcology's public life, ${he} stops for a long moment before scurrying to catch up with you, barely even noticing that ${he} just swallowed ${his} sense of shame to obey you and avoid punishment. You stroll along, greeting leading citizens and taking in the hum of your people. ${eventSlave.slaveName} grows increasingly embarrassed under the hot stares of passersby, cringing closer and closer to your protective side as ${he} notices how`);
			if (canSee(eventSlave)) {
				r.push(`many gazes rest with open hunger on`);
			} else {
				r.push(`many lewd comments focus on`);
			}
			r.push(`${his} mouth, ${his} crotch, and ${his} ass.`);
			eventSlave.devotion += 3;

			r.toParagraph();
			App.Events.addResponses(frag, [
				new App.Events.Result(`Make ${him} perform oral on you, right here`, perform),
				new App.Events.Result(`Make ${him} cum in public`, cum)
			]);

			return r.container();

			function perform() {
				const r = new SpacedTextAccumulator();
				r.push(`You reach around, place a dominating hand on ${his} shoulder, pull ${him} around in front of you, and push ${him} down to ${his} knees. ${He} quickly realizes what's coming, and ${his} ${eventSlave.skin} cheeks blush furiously as you reveal your`);
				if (V.PC.dick !== 0) {
					r.push(`meaty dick`);
				} else {
					r.push(`flushed pussy`);
				}
				r.push(`and offer it to ${him}. ${He} gets busy, burying ${his} head against you with a speed that seems surprising until it occurs to you that this allows ${him} to hide ${his} face. Deciding to accept this tiny compromise, you run a possessive hand`);
				if (eventSlave.hLength < 5) {
					r.push(`across ${his} smooth scalp`);
				} else if (eventSlave.hLength < 20) {
					r.push(`through ${his} short hair`);
				} else {
					r.push(`through ${his} tresses`);
				}
				r.push(`and murmur praise for ${his} enthusiasm. ${He} stiffens at the implication that ${he} wants to be`);
				if (V.PC.dick !== 0) {
					r.push(`polishing your penis`);
				} else {
					r.push(`eating you out`);
				}
				r.push(`in broad daylight, but after a slight pause ${he} decides that this isn't bad. As`);
				if (V.PC.dick !== 0) {
					r.push(`${his} head continues to bob back and forth as ${he} sucks your dick,`);
				} else {
					r.push(`${he} continues nuzzling ${his} nose and mouth against your wet cunt,`);
				}
				r.push(`${he} fails to notice ${his} <span class="devotion inc">second major submission today.</span>`);
				if (eventSlave.fetish === "humiliation") {
					if (eventSlave.fetishKnown === 1) {
						r.push(`Since ${he} has a humiliation fetish, the embarrassment has been arousing ${him} even as it's been torturing ${him}. Unsatisfied with just this, ${his} need to be shamed obliges ${him} to cock ${his} hips and make sure onlookers can see ${his} asspussy as ${he} services you with ${his} mouth.`);
						if (eventSlave.fetishStrength > 95) {
							r.push(`<span class="fetish inc">${His} need for humiliation has deepened.</span>`);
							eventSlave.fetishStrength += 10;
						} else {
							r.push(`Such abject sluttery <span class="devotion inc">helps convince ${him} of ${his} status as a slave ${girl}.</span>`);
							eventSlave.devotion += 3;
						}
					} else {
						r.push(`To your surprise, ${he} even starts to glance around, checking to verify that ${he}'s still being watched. <span class="fetish gain">${He}'s a humiliation slut!</span>`);
						eventSlave.fetishKnown = 1;
					}
				}
				eventSlave.devotion += 5;
				seX(eventSlave, "oral", V.PC, "penetrative");
				r.toParagraph();
				return r.container();
			}
			function cum() {
				const r = new SpacedTextAccumulator();
				r.push(`You produce three little egg vibrators, which instantly steal ${his} anxious attention away from the passersby who`);
				if (canSee(eventSlave)) {
					r.push(`stare`);
				} else {
					r.push(`whistle catcalls`);
				}
				r.push(`at ${him}. You require ${him} to hold ${his} dick out while you use an elastic band to attach one of the vibrators to the underside of its head. ${He} doesn't get to touch ${himself} much anymore, and the half-forgotten sensations of doing so almost make ${him} forget that ${he}'s naked in public, and almost certainly about to do something very embarrassing. Then you order ${him} to hold ${his} dick up and place another vibrator`);
				if (eventSlave.scrotum > 0) {
					r.push(`against ${his} sensitive scrotum.`);
				} else {
					r.push(`against the sensitive skin where ${his} scrotum used to be.`);
				}
				r.push(`Finally, you order ${him} to bend over and offer you ${his} asshole. ${He} obeys, with apprehension, and is actually relieved when you just place the final vibrator against, but not inside, ${his}`);
				if (eventSlave.anus > 1) {
					r.push(`asspussy.`);
				} else {
					r.push(`pucker.`);
				}
				r.push(`${He} finds ${himself} ordered to kneel and put ${his} hands on ${his} head; and ordering ${him} to hold this position, you use remote control of the vibrators to force ${him} to cum twice. ${He} can't`);
				if (canSee(eventSlave)) {
					r.push(`tear ${his} eyes away from`);
				} else {
					r.push(`tune out`);
				}
				r.push(`the citizens who stare and laugh as ${he}`);
				if (eventSlave.balls > 0) {
					r.push(`spurts ${his} seed`);
				} else {
					r.push(`dribbles weakly`);
				}
				r.push(`onto the floor.`);
				if (eventSlave.fetish === "humiliation") {
					if (eventSlave.fetishKnown === 1) {
						if (eventSlave.fetishStrength > 95) {
							r.push(`Though ${he}'s still unhappy about being a slave ${girl}, <span class="fetish inc">appetite for humiliation has deepened.</span>`);
							eventSlave.fetishStrength += 10;
						} else {
							r.push(`The abject humiliation slut climaxes harder each time, and can't stop ${himself} <span class="trust inc">glancing at you with something like trust.</span>`);
							eventSlave.trust += 3;
						}
					} else {
						r.push(`With a mix of horror and dawning arousal, ${he} discovers that ${he} enjoys the stares. <span class="fetish gain">${He}'s a humiliation slut!</span>`);
						eventSlave.fetishKnown = 1;
					}
				}
				r.push(`As ${he} follows you back to your penthouse, ${he} seems almost cheerful, and will definitely be <span class="trust inc">more trusting of strange orders</span> in the future.`);
				eventSlave.trust += 5;
				r.toParagraph();
				return r.container();
			}
		}
	}
};