code:
App.Events.RESSFearfulHumiliation = class RESSFearfulHumiliation 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.fetish === "humiliation" || s.energy > 95,
				s => s.devotion <= 50,
				s => s.devotion >= -20,
				s => canDoAnal(s) || canDoVaginal(s),
				s => s.anus !== 0,
				s => s.vagina !== 0,
				s => s.fetishKnown === 1,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		App.Events.addParagraph(node, [
			`Even if ${he} isn't yet a truly devoted sex slave,`,
			contextualIntro(V.PC, eventSlave, true),
			`generally obeys orders. ${He} blushes furiously when given any sexual command, but ${his} true feelings about humiliation become clear when ${he} is ordered to serve in front of others, even other slaves. It sometimes seems the number of people watching ${him} get fondled, used, or fucked directly reduces the distance between ${him} and ${his} next blushing or even sobbing orgasm.`
		]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Publicly prove the depths of ${his} humiliation to ${him}`, prove),
			new App.Events.Result(`Use a bait and switch tactic on ${him}, before public use`, tactic),
		]);

		function prove() {
			let r = [];
			r.push(`You drag a fearful, embarrassed,`);
			if (eventSlave.belly >= 1500) {
				if (eventSlave.bellyPreg >= 0) {
					r.push(`pregnant`);
				} else {
					r.push(`swollen`);
				}
			}
			r.push(`and totally naked ${eventSlave.slaveName} out into a public hall. A small knot of passersby gather around grinning, enjoying the sight of ${his} nakedness and anticipating a show. To ${his} surprise, you order ${him} to take a few minutes to recount ${his} life story. ${He}'s hesitant at first, but obeys, only realizing as ${he} nears the present day what an abject story of degradation and humiliation ${his} life truly is. ${He} continues shakily, describing in brief ${his} current life, crying a little and trembling with arousal. At a whispered command from you, ${he} concludes`);
			if (!canTalk(eventSlave)) {
				r.push(`in embarrassed gestures, "and now my ${getWrittenTitle(eventSlave)} is going to fuck my worthless body in public."`); // not spoken!
			} else {
				r.push(Spoken(eventSlave, `"and now my ${Master} is going to fuck my worthless body in public."`));
			}
			r.push(`You take ${him} standing there, as ${he} cries with mixed shame and sexual pleasure.`);
			if (!canDoVaginal(eventSlave)) {
				r.push(`${He}`);
				if (eventSlave.dick > 0) {
					r.push(`cums even though ${he}'s soft`);
				} else {
					r.push(`climaxes even though ${he}'s filled`);
				}
				r.push(`with the shame,`);
				if (V.PC.dick === 0) {
					r.push(`${his} anus clenching around the strap-on you're pumping in and out of it.`);
				} else {
					r.push(`adding a sad little dribble to the load dripping out of ${his} asshole.`);
				}
			} else {
				if (V.PC.dick === 0) {
					r.push(`You make ${him} clean ${his} pussyjuice off your strap-on with ${his} bitch mouth before you take it off.`);
				} else {
					r.push(`As you pull out of ${his} clenching pussy, cum runs down ${his} quavering thighs.`);
				}
			}
			r.push(`<span class="devotion inc">${He} has become more submissive to you,</span> and <span class="reputation inc">your reputation has increased.</span>`);
			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function tactic() {
			let r = []; // TODO: redo art with "nicest clothing"
			r.push(`You instruct ${him} to get cleaned up and get dressed in ${his} nicest clothing. ${He} obeys, mystified, and is further puzzled to find that you're taking ${him} out for a nice evening at a small bar. You share a tasty meal and listen to good music played on the little stage by an older slave. As the set concludes, you lean over and give ${eventSlave.slaveName} ${his} real orders for the evening. ${He} freezes in terror but eventually makes ${his} way up to the stage, strips in front of all the patrons, and says`);
			if (!canTalk(eventSlave)) {
				r.push(
					`in embarrassed gestures,`,
					Spoken(eventSlave, `"Please use me, I'm cheap."`)
				);
			} else {
				r.push(Spoken(eventSlave, `"One credit per fuck, if you'll do my worthless body on stage."`));
			}
			r.push(`By the end of the night, ${he}'s been fucked by almost everyone in the bar, and ${his} itch for humiliation has been well and truly scratched. As you collect ${his} earnings from the thoroughly pleased bartender, ${he} lies quiescent in a puddle of cum and exhaustion. You've collected a decent fee, and your reputation has increased.`);
			repX(500, "event", eventSlave);
			cashX(100, "event", eventSlave);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative", 10);
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 25, 2, -2));
				}
			} else if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative", 20);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 50, 0, -2));
				}
			} else {
				seX(eventSlave, "anal", "public", "penetrative", 20);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 50, 1, -2));
				}
			}
			return r;
		}
	}
};


code:
App.Events.RESSFirstPeriod = class RESSFirstPeriod extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeAge === 1,
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				(s) => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				(s) => s.actualAge < 18,
				(s) => s.devotion > 20,
				(s) => s.ovaries === 1,
				(s) => s.pubertyXX === 0,
				(s) => s.preg === 0,
				(s) => s.physicalAge + s.birthWeek / 52 >= s.pubertyAgeXX - 0.5,
			]
		];
	}

	get weight() {
		return 10;
	}

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

		App.Events.drawEventArt(node, slave);

		r.push(
			App.UI.DOM.slaveDescriptionDialog(slave),
			`appears in the door of your office, uncertain if ${he} should disturb you. ${He} stumbles through the doorway, hands on ${his}`
		);
		if (slave.weight >= 95) {
			r.push(`fat belly,`);
		} else if (slave.belly >= 2000) {
			r.push(`bloated belly,`);
		} else if (slave.weight >= 30) {
			r.push(`chubby belly,`);
		} else {
			r.push(`flat belly,`);
		}
		r.push(`before stepping forward to stand in front of your desk. ${His} chest is rising and falling with panicked hyperventilation. The poor ${girl} is terrified for some reason.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`You press ${him} on why ${he} is acting this way.`);
		if (canTalk(slave)) {
			r.push(
				Spoken(slave, `"My belly, ${Master},"`),
				`${he} ${say}s apologetically.`,
				Spoken(slave, `"It hurts and I don't know why. It just started recently."`)
			);
		} else {
			r.push(`${He} uses gestures to point to ${his} stomach, and explains that ${he} is feeling an unusual pain.`);
		}
		r.push(`You check ${his} records and discover ${he} has very likely just become a woman.`);
		slave.pubertyXX = 1;
		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Explain ${he}'s just becoming a woman`, justWoman));
		if (V.PC.dick !== 0 && slave.eggType === "human") {
			choices.push(new App.Events.Result(`Demonstrate what this means`, demonstrate, (slave.vagina === 0) ? `This option will take ${his} virginity` : null));
		}
		choices.push(new App.Events.Result(`Tell ${him} ${he}'ll just be taking it up the ass more`, ass, (slave.anus === 0) ? `This option will take ${his} anal virginity` : null));

		App.Events.addResponses(node, choices);

		function justWoman() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell ${him} that ${he} is just undergoing ${his} first period, and that the pain ${he} is feeling is perfectly natural.`);
			if (canTalk(slave)) {
				r.push(
					Spoken(slave, `"I-I'm a woman now? ${Master}, that m-means, I can get pregnant now."`),
					`${He} trails off.`
				);
			} else {
				r.push(`${He} brings ${his} hands back to ${his} stomach, an elated look on ${his} face. ${He} makes a gesture resembling a rounded belly.`);
			}
			r.push(`Whether or not ${he} gets pregnant is for you to decide, but for now you tell ${him} what ${he} should expect to change, both in and to ${his} body. ${slave.slaveName} appreciates you taking the time to explain ${his} developing body.`);
			slave.trust += 5;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function demonstrate() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell ${him} that ${he} is just becoming a woman, and to celebrate, you are going to put a child in ${him}.`);
			if (!canTalk(slave)) {
				r.push(`${He} gasps and rubs a hand across ${his} stomach.`);
			} else {
				r.push(Spoken(slave, `"But I'm still a child myself, ${Master}, I can't get pregnant yet!"`));
			}
			r.push(`You tell ${him} that prior to this week, that would have been true. However, now that ${he} has become fertile, it's time that ${he} learned what ${his} body was made for. You guide ${him} to the couch and tell ${him} to lie on ${his} back so that you may take ${him}. ${He} breaks down when ${he} feels your cock enter ${his}`);
			if (slave.vagina === 0) {
				r.push(`delightfully tight, virgin`);
			} else if (slave.vagina === 1) {
				r.push(`deliciously tight`);
			} else if (slave.vagina === 2) {
				r.push(`well experienced`);
			} else {
				r.push(`fucked-out`);
			}
			r.push(`cunt. ${His} new urges cause ${him} to reach up to hug ${himself} close to you,`);
			if (slave.boobs < 600) {
				r.push(`${his} modest breasts let ${him} snuggle close to you, face-to-face, as you take ${him}.`);
			} else if (slave.boobs < 10000) {
				r.push(`${his} big tits form a soft cushion between you as you take ${him}.`);
			} else {
				r.push(`${his} massive tits stop ${him} from bringing ${himself} too close to you as you take ${him}.`);
			}
			r.push(`${He} enjoys ${himself} immensely, but ${he} loses it again when ${he} feels your seed in ${him}, realizing that ${he} will find ${himself} swelling with your child over the coming months. ${He} has become more submissive to your will now that ${his} very first egg has been fertilized by ${his} ${getWrittenTitle(slave)}.`);
			slave.devotion += 5;
			slave.preg = 1;
			slave.pregWeek = 1;
			slave.pregKnown = 1;
			slave.pregSource = -1;
			slave.pregType = setPregType(slave);
			WombImpregnate(slave, slave.pregType, -1, 1);
			r.push(VCheck.Vaginal(slave, 1));

			App.Events.addParagraph(frag, r);
			return frag;
		}

		function ass() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`In one swift motion, you pull out a chastity belt and lock it onto ${him}. ${He} gasps as ${he} feels it hug close to ${his} pussy. You explain that ${he} has just become a woman, and thus, will be taking it up the ass until you decide it's time for ${him} to become pregnant.`);
			if (!canTalk(slave)) {
				r.push(`${He} rubs a hand across ${his} stomach.`);
			} else {
				r.push(Spoken(slave, `"You don't want me to get pregnant, ${Master}?"`));
			}
			r.push(`You bring ${him} over to the couch, set ${him} on your lap, and teasingly call ${him} a buttslut. Every so often you graze a finger around ${his} chastity belt, noting how much ${his} body wants you in ${him}, but you only make it the center of attention once the poor over-aroused slave`);
			if (!canTalk(slave)) {
				r.push(`begins to use piteous gestures to beg you abjectly to penetrate ${him}.`);
			} else {
				r.push(
					`${say}s,`,
					Spoken(slave, `"I can't take it any more, ${Master}! Please fuck me pregnant!"`)
				);
			}
			r.push(`You snicker, but remind ${him} that no matter how much ${he} wants to be knocked up, ${his} belt will direct all the dicks ${he} takes into ${his} rear. You line up and insert your`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`cock`);
			}
			r.push(`with ${his} ass and begin fucking ${him}, all the while reminding ${him} that ${he} will not be getting pregnant. When ${he} finally orgasms,`);
			if (V.PC.dick === 0) {
				r.push(`${his} unabashed enjoyment`);
			} else {
				r.push(`the strength of ${his} spasming sphincter`);
			}
			r.push(`sends you over as well. ${He}'s left in a confused haze; ${his} body tells ${him} to get pregnant, but you tell ${him} to take it anally. ${He} sides with your decision and vows to be an anal whore for you.`);
			if (slave.fetish === "none") { // TODO: text and the original "coral" color suggests fetish loss here, perhaps pregnancy.
				r.push(`<span class="fetish loss">Overcoming ${his} urges to become a mother via anal causes ${him} to become a buttslut.</span>`);
				slave.fetish = "buttslut";
				slave.fetishStrength = 10;
			}
			slave.devotion += 5;
			slave.chastityVagina = 1;
			r.push(VCheck.Anal(slave, 1));

			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};

repo_name: Banyanael/fc

license: mit


code:
App.Events.RESSFucktoyTribbing = class RESSFucktoyTribbing extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => fuckSlavesLength() > 2,
			() => V.PC.vagina > -1,
		]; // 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),
				canDoVaginal,
				s => s.dick === 0,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, hers, girl, woman
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const {hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");

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

		const r = new SpacedTextAccumulator(node);
		r.push(`With a mind as busy as yours, you sometimes wake up in the middle of the night for no reason that you can remember.`);
		if (V.PC.actualAge >= 50) {
			r.push(`These incidents have become more common as you age; merely one of time's little mutilations.`);
		}
		r.push(`Naturally, waking up in the middle of the night feels much different than it did back before you owned an arcology. Now you have your choice from a virtual buffet of sleeping slaves if you don't feel like going back to sleep right away.`);
		r.toParagraph();

		r.push(`The slave on your left is sleeping on ${hisU} back, and is touching you lightly at the hip and shoulder. The slave on your right, though, is nestled in close, ${his} shoulder under your arm and ${his} head resting gently on your`);
		if (V.PC.boobs >= 1400) {
			r.push(`enormous`);
			if (V.PC.boobsImplant > 0) {
				r.push(`firm`);
			} else {
				r.push(`pillowy`);
			}
			r.push(`breast.`);
		} else if (V.PC.boobs >= 1200) {
			r.push(`huge`);
			if (V.PC.boobsImplant > 0) {
				r.push(`firm`);
			} else {
				r.push(`pillowy`);
			}
			r.push(`breast.`);
		} else if (V.PC.boobs >= 1000) {
			r.push(`big`);
			if (V.PC.boobsImplant > 0) {
				r.push(`firm`);
			} else {
				r.push(`soft`);
			}
			r.push(`breast.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`bare breast.`);
		} else if (V.PC.title === 0) {
			r.push(`flat chest.`);
		} else {
			r.push(`toned chest.`);
		}
		r.push(`${He}'s straddling your leg on that side, and as your waking consciousness coalesces, you become more and more aware`);
		if (eventSlave.belly >= 10000) {
			r.push(`of the weight of ${his} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnancy`);
			} else {
				r.push(`stomach`);
			}
			r.push(`on your`);
			if (V.PC.belly >= 5000) {
				r.push(`own gravid`);
			}
			r.push(`middle and`);
		}
		r.push(`that ${his} mons is pressed against your thigh. ${He} has one leg thrown over yours in ${his} sleeping embrace, placing ${his} own`);
		if (eventSlave.muscles > 30) {
			r.push(`muscular`);
		} else if (eventSlave.weight > 10) {
			r.push(`plush`);
		} else {
			r.push(`feminine`);
		}
		r.push(
			`thigh against your womanhood in turn. It's`,
			contextualIntro(V.PC, eventSlave, true)
		);
		r.addToLast(`, and you feel yourself begin to grow wet as you gaze at ${him} in the dim light and feel ${his} slumbering heat.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Make love to ${him}`, love),
			new App.Events.Result(`Fuck ${him}`, fuck),
		]);

		function love() {
			const r = new SpacedTextAccumulator();
			r.push(`You crane your neck down and kiss ${him} on the lips. ${He} awakens slowly, gently, ${his} ${App.Desc.eyesColor(eventSlave)} fluttering open, looking black in the nighttime gloom. ${He} smiles into your mouth, and you feel ${his} pulse quicken through the extensive contact down your bodies. You interlace your fingers between ${hers} and turn, pressing ${him} back down into the soft sheets. ${He} opens ${himself} for you, spreading ${his} legs wide and embracing you with them, making sure to run ${his} heels up the backs of your calves in a way that sends a shiver up your spine. Feeling this through your kissing mouths, ${he} smiles into you, a pleased expression ${he} maintains as you`);
			if (eventSlave.belly >= 300000 && V.PC.belly >= 5000) {
				r.push(`struggle to find a position to handle both your pregnancy and ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`${belly} gravid middle`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`struggle to find a position to handle ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			} else if (eventSlave.belly >= 5000 && V.PC.belly >= 5000) {
				r.push(`shift into a position to better accommodate both your pregnancy and ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`${belly} gravid middle`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			} else if (V.PC.belly >= 5000) {
				r.push(`shift into a position to better accommodate your pregnancy and`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`shift into a position to better accommodate ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			}
			r.push(`begin to gently press your womanhood against ${hers}.`);
			r.toParagraph();

			if (eventSlave.fetishKnown === 0) {
				r.push(`Knowing little about ${his} sexual peccadilloes, but confident that ${he}'ll do ${his} best to enjoy your lovemaking, you continue this shockingly intimate intercourse until ${he} climaxes.`);
			} else if (eventSlave.fetish === "none") {
				r.push(`Knowing ${him} to be quite endearingly vanilla, you continue this shockingly intimate intercourse until ${he} climaxes, kissing ${him} all the way through your soft missionary lovemaking.`);
			} else if (eventSlave.fetish === "buttslut") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you slide a hand around behind and under ${him} so you can tease ${his} ass. ${He} gives ${his} butt a little wiggle of thanks, and orgasms promptly.`);
				seX(eventSlave, "anal", V.PC, "penetrative");
			} else if (eventSlave.fetish === "cumslut") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you slide your tongue into ${his} mouth, making your kisses so frankly sexual and penetrative that you're practically making oral love at the same time as you do it missionary style.`);
			} else if (eventSlave.fetish === "sadist") {
				r.push(`You know ${his} tastes, but by the act of this intimate missionary lovemaking, you wordlessly command ${him} to join you for more conventional pleasures, if only for the moment. ${He} complies with pleasure, climaxing with surprising speed; perhaps ${he} appreciates the change.`);
			} else if (eventSlave.fetish === "masochist") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you nip ${his} lower lip in your teeth with each kiss, and rake your nails across ${his} flanks just hard enough to hurt a little. ${He} climaxes quickly to the mixed pain and missionary intimacy.`);
			} else if (eventSlave.fetish === "dom") {
				r.push(`You know ${his} tastes, but by the act of this intimate missionary lovemaking, you wordlessly command ${him} to join you for more equal pleasures, if only for the moment. ${He} complies with something like relief, climaxing with surprising speed; perhaps ${he} appreciates a turn on the bottom.`);
			} else if (eventSlave.fetish === "submissive") {
				r.push(`Being on the bottom for some missionary lovemaking is very much to ${his} tastes, and ${he} rises to the point of climax with almost indecent speed. You slow your pace to nothing more than a gentle pressure now and then, and keep ${him} on the edge of orgasm for a long time.`);
			} else if (eventSlave.fetish === "boobs") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you make sure your nipples line up`);
				if (eventSlave.nipples === "fuckable") {
					r.push(`and interlock`);
				}
				r.push(`with ${hers} as best you can. You note the buck of pleasure this produces each time you get it perfectly right as you make love to ${him}.`);
			} else if (eventSlave.fetish === "pregnancy" && eventSlave.pregKnown === 1) {
				r.push(`Being on the bottom for some missionary lovemaking is very much to ${his} tastes, even though ${he} is already pregnant. ${He} builds to orgasm slowly, reveling in the feeling of being your ${woman}.`);
			} else if (eventSlave.fetish === "pregnancy") {
				r.push(`Being on the bottom for some missionary lovemaking is very much to ${his} tastes, even though the encounter isn't particularly likely to get ${him} pregnant. ${He} builds to orgasm slowly, reveling in the feeling of being your ${woman}.`);
			}
			if (canFemImpreg(V.PC, eventSlave)) {
				r.push(knockMeUp(V.PC, 5, 0, eventSlave.ID));
			}
			r.push(`As you made love to ${him}, the gentle motions, feminine sighs, and delicate aroma of pleasure woke the other slaves in bed with you, and they began their own intimacy with each other. As you go back to sleep, you're surrounded with something very like Sapphic paradise. ${eventSlave.slaveName} nestles up to you once more, embracing you with trust born of love.`);
			eventSlave.trust += 4;
			seX(eventSlave, "vaginal", V.PC, "penetrative");
			r.toParagraph();
			return r.container();
		}

		function fuck() {
			const r = new SpacedTextAccumulator();
			r.push(`You feel your libido building, building, building within you, an endless cycle that mounts rapidly to an inevitable explosion. It comes, and you perform a catlike glide around until your head is at ${his} feet. As you did, you infiltrated one of your legs between ${hers} from its convenient starting point. ${He} wakes suddenly to the feeling of being manhandled, and then comes fully awake to the shockingly intimate sensation of your pussies pressed together as closely as physically possible.`);
			r.toParagraph();

			r.push(`Holding ${his} upper thighs with your hands to pull ${him} against you, you grind into ${him}, fucking ${him} about as comprehensively as it's possible for someone without a cock to fuck a ${woman}. ${He}'s most definitely up for it, and you see ${his} eyes fly wide in the gloom as the full weight of the pleasure crashes into ${him}. It's not exactly a position for lovemaking, since your faces are about as far apart as they can possibly be during sex, but kissing be damned, you're here to fuck. Naturally, this evolution wakes everyone else up too, and before long, there's a regular lesbian orgy going on. When it's over, ${eventSlave.slaveName} finds ${himself} returning exhaustedly to sleep, one of your arms curled`);
			if (eventSlave.belly >= 5000) {
				r.push(`under ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
			} else {
				r.push(`around ${his} middle`);
			}
			r.push(`to cup ${his} pussy possessively. ${He} finds that <span class="devotion inc">${he} doesn't mind.</span> ${He}'s your ${girl}.`);
			eventSlave.devotion += 4;
			seX(eventSlave, "vaginal", V.PC, "penetrative");
			if (canFemImpreg(V.PC, eventSlave)) {
				r.push(knockMeUp(V.PC, 5, 0, eventSlave.ID));
			}
			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESSGaggedSlave = class RESSGaggedSlave 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.devotion > 20,
				s => s.mouthAccessory !== "none"
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`You cross paths with`,
			contextualIntro(V.PC, eventSlave, true),
			`as ${he} returns from ${eventSlave.assignment} after a long day. One of the things most readily apparent about ${eventSlave.slaveName} is the`
		);
		if (eventSlave.mouthAccessory === "ball gag") {
			r.push(`ball gag keeping ${his} mouth filled,`);
		} else if (eventSlave.mouthAccessory === "bit gag") {
			r.push(`cruel bit gag keeping ${his} jaw locked,`);
		} else if (eventSlave.mouthAccessory === "ring gag") {
			r.push(`cruel ring gag keeping ${his} mouth stretched open,`);
		} else if (eventSlave.mouthAccessory === "dildo gag") {
			r.push(`dildo gag filling ${his} mouth and throat,`);
		} else if (eventSlave.mouthAccessory === "massive dildo gag") {
			r.push(`dildo gag hugely distending ${his} throat,`);
		}
		r.push(`the existence of which is a constant reminder to ${him} of ${his} submission to you and your immense power over ${him}.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`Since ${he} cannot speak through ${his} gag, ${he} merely gestures ${his} recognition of your presence and lingers in case you wish to use ${him}. Though ${he} does ${his} best to avoid showing ${his} discomfort, it is clear from the expression on ${his}`);
		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(`face that the gag is a distressing addition to ${his} life. When you don't immediately give your assent one way or another, ${he} kneels before you out of`);
		if (eventSlave.devotion > 50) {
			r.push(`submission.`);
		} else {
			r.push(`fatigue after ${his} long day.`);
		}
		r.push(`From ${his} new position beneath you, ${he} must crane ${his} neck so ${his}`);
		if (canSee(eventSlave)) {
			r.push(App.Desc.eyesColor(eventSlave));
		} else {
			r.push(`sightless eyes`);
		}
		r.push(`may meet yours. With ${his} mouth gagged, ${he} is almost the perfect image of a submissive slave.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} something else to gag on`, give),
			new App.Events.Result(`Remove the gag for a few minutes`, remove),
			new App.Events.Result(`Torment ${him} with the gag`, torment),
		]);

		function give() {
			r = [];
			r.push(`As pleasant an image as ${eventSlave.slaveName}'s mouth filled by a ${eventSlave.mouthAccessory} is, one of ${his} mouth's primary purposes is still to provide you with ample`);
			if (V.PC.dick !== 0) {
				r.push(`blowjobs`);
				if (V.PC.vagina !== -1) {
					r.push(`and`);
				}
			}
			if (V.PC.vagina !== -1) {
				r.push(`cunnilingus`);
			}
			r.push(r.pop() + ".");
			r.push(`With ${eventSlave.slaveName} already kneeling, it is merely a matter of undoing ${his} gag before you can put ${his} mouth to work.`);
			if (eventSlave.skill.oral >= 100) {
				r.push(`Though ${he} has spent much time gagged, ${his} mastery at giving oral is unaffected.`);
			} else if (eventSlave.skill.oral > 60) {
				r.push(`Though ${he} has spent much time gagged, ${his} oral skills still provide ample pleasure.`);
			} else {
				r.push(`${His} time spent gagged has limited the growth of ${his} mediocre oral skills, though ${he} is still able to provide some relief.`);
			}
			if (eventSlave.teeth === "pointy") {
				r.push(`Though your attention is largely sapped by ${his} tender oral ministrations, you note that ${he} takes care not to rake you with ${his} shark-like teeth.`);
			} else if (eventSlave.lips > 40) {
				r.push(`Though your attention is largely sapped by ${his} tender oral ministrations, you note that ${his} huge lips are soft and pillowy against you.`);
			} else if (eventSlave.teeth === "fangs" || eventSlave.teeth === "fang") {
				r.push(`Though your attention is largely sapped by ${his} tender oral ministrations, you note that ${he} takes care to not poke you with ${his}`);
				if (eventSlave.teeth !== "fang") {
					r.push(`fangs.`);
				} else {
					r.push(`fang.`);
				}
			} else if (eventSlave.teeth === "gapped") {
				r.push(`Though your attention is largely sapped by ${his} tender oral ministrations, you note that ${he} takes care to let you get snagged between ${his} front teeth.`);
			} else if ((eventSlave.teeth === "straightening braces") || (eventSlave.teeth === "cosmetic braces")) {
				r.push(`Though your attention is largely sapped by ${his} tender oral ministrations, you note that ${he} takes care to keep ${his} braces off you.`);
			}
			r.push(`When you eventually move on, it is with`);
			if (eventSlave.hLength > 1) {
				r.push(`a ruffle of ${eventSlave.slaveName}'s ${eventSlave.hColor} hair`);
			} else {
				r.push(`a rub to ${eventSlave.slaveName}'s scalp`);
			}
			r.push(`and the return of the gag to ${his} mouth. Though ${his} continued gagging is an uncomfortable experience, ${eventSlave.slaveName} enjoyed being free of it for a moment, even if just to pleasure you.`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", V.PC, "penetrative");
			return r;
		}

		function remove() {
			eventSlave.trust += 4;
			return `You wordlessly remove the ${eventSlave.mouthAccessory} and watch as ${eventSlave.slaveName} opens and closes ${his} mouth testingly, as if ${he} has forgotten what it feels like to do so without obstruction. Though you eventually return to the gag to its rightful place in ${his} mouth, ${he} trusts you more for granting ${him} a few moments respite from the gag.`;
		}

		function torment() {
			r = [];
			r.push(`Though having a ${eventSlave.mouthAccessory} constrict ${his} mouth is torment enough, you take the time to linger and add to ${his} torturous existence. ${eventSlave.slaveName} soon discovers that the straps of a gag can always be made tighter, the`);
			if (eventSlave.mouthAccessory === "ball gag") {
				r.push(`ball can always be made larger,`);
			} else if (eventSlave.mouthAccessory === "bit gag") {
				r.push(`bit can always be made thicker,`);
			} else if (eventSlave.mouthAccessory === "ring gag") {
				r.push(`ring can always be made wider,`);
			} else if (eventSlave.mouthAccessory === "dildo gag") {
				r.push(`dildo can always be made larger,`);
			} else if (eventSlave.mouthAccessory === "massive dildo gag") {
				r.push(`dildo can always be made wider and longer,`);
			}
			r.push(`and the punishments rendered for daring to show any discomfort can always be harsher and stricter. Come the end of your session with ${him}, ${eventSlave.slaveName}`);
			if (eventSlave.fetish === "masochist") {
				r.push(`is mortified by the intensity of ${his} orgasms, <span class="devotion inc">and more convinced than ever that ${he}'s a pain slut,</span> and yet`);
			}
			r.push(`<span class="trust dec">scuttles away quickly, having learnt a harsh lesson about your power over ${his} body.</span>`);
			eventSlave.trust -= 5;
			if (eventSlave.fetish === "masochist") {
				eventSlave.devotion += 4;
			}
			return r;
		}
	}
};


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

	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 PC = V.PC;

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`You encounter`,
			contextualIntro(PC, eventSlave, true),
			`at the beginning of ${his} day, as ${he} finishes ${his} morning ablutions and heads off to`,
		);
		if (eventSlave.clothes !== "no clothing") {
			r.push(`get dressed.`);
		} else {
			r.push(`${his} assignment, since ${he}'s not allowed clothes and therefore doesn't need to dress.`);
		}
		r.push(`${He} seems happy today, and ${his} ${eventSlave.skin} body glows with warmth and cleanliness from the hot shower. When ${he}`);
		if (canSee(eventSlave)) {
			r.push(`sees`);
		} else {
			r.push(`notices`);
		}
		r.push(`you, ${he} greets you properly, yet positively, smiling at you and`);
		if (eventSlave.boobs > 3000) {
			r.push(`presenting ${his} enormous breasts`);
		} else if (eventSlave.lips > 70) {
			r.push(`pursing ${his} huge lips`);
		} else if (eventSlave.boobs > 800) {
			r.push(`bouncing ${his} big breasts`);
		} else if (eventSlave.lips > 20) {
			r.push(`pursing ${his} pretty lips`);
		} else {
			r.push(`sticking out ${his} chest`);
		}
		r.push(`in an automatic gesture of easy sexual availability. Suddenly, ${he} remembers something, and looks thoughtful. Since ${he}'s so trusting, ${he} asks you the question that just occurred to ${him}.`);
		r.toParagraph();
		r.push(
			`"${Master}," ${he} ${say}s,`,
			Spoken(eventSlave, `"may I have my asshole tightened?"`)
		);
		r.toParagraph();
		r.push(`There's no trace of awareness on ${his} face of the open lewdness of the question;`);
		if (eventSlave.career === "a bioreactor") {
			r.push(`${he}'s spent time in an industrial Dairy with a phallus the size of a horse's pounding ${his} ass day and night.`);
		} else if (eventSlave.career === "a dairy cow") {
			r.push(`${he} used to be a mindless cow, bred daily by equally mindless bulls. The massively hung beasts would frequently miss their mark and end up roughly fucking ${his} asshole.`);
		} else if (eventSlave.career === "a slave" || V.week-eventSlave.weekAcquired > 50) {
			r.push(`${he}'s been a sex slave so long that ${he}'s completely internalized the idea of ${his} ass being a sex organ.`);
		} else if (eventSlave.counter.anal > 2000) {
			r.push(`${he}'s had ${his} ass fucked so many times that ${he} thinks of it as an inherently sexy thing.`);
		} else {
			r.push(`${he}'s so devoted to you that ${he}'s made a conscious effort to think of ${his} ass as sexy.`);
		}
		r.push(`${He} continues in ${his}`);
		if (eventSlave.voice === 1) {
			r.push(`deep`);
		} else if (eventSlave.voice === 2) {
			r.push(`soft`);
		} else {
			r.push(`bubblegum bimbo's`);
		}
		r.push(
			`voice, ${say}ing,`,
			Spoken(eventSlave, `"It's not bad. It's easy to take anything up it. And when I walk I can feel my anal slit sort of working around back there, which is kind of fun. But I was just thinking, as I was washing my asspussy. It'd be nice`)
		);
		switch (eventSlave.fetish) {
			case "submissive":
				r.push(Spoken(eventSlave, `to feel just a little afraid when I'm on my face and about to get fucked.`));
				break;
			case "cumslut":
				r.push(Spoken(eventSlave, `to be able to keep loads of cum in my ass for later, instead of having them just drip right out.`));
				break;
			case "buttslut":
				r.push(Spoken(eventSlave, `to be able to feel a little more sensation back there again. Buttsex is still fun and absolutely my favorite thing, but I remember it being even better.`));
				break;
			case "masochist":
				r.push(Spoken(eventSlave, `if I could feel anal pain again. That burning feeling used to be one of my favorites.`));
				break;
			default:
				r.push(Spoken(eventSlave, `to be able to be a better anal lover. I do my best, but I can't squeeze very well any more.`));
		}
		r.push(`May I?" ${He} spins,`);
		if (eventSlave.belly >= 5000) {
			r.push(`spreading ${his} legs for ${his} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly while`);
		}
		r.push(`bending at the waist`);
		if (eventSlave.butt > 6) {
			r.push(`and prising ${his} monstrous buttocks apart`);
		} else if (eventSlave.butt > 3) {
			r.push(`spreading ${his} healthy buttocks`);
		}
		r.push(`to reveal ${his} gaping anus. It could indeed benefit from surgical repair.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} the surgery`, give),
			new App.Events.Result(`Fill ${his} gape`, fill),
			(V.HeadGirlID !== 0 && eventSlave.assignment !== Job.HEADGIRL)
				? new App.Events.Result(`Double up on ${his} ass with your Head Girl`, double)
				: new App.Events.Result()
		]);

		function give() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You schedule ${him} for the surgery. Like all invasive procedures, it affects ${his} health, but ${he}'s effectively an anal virgin again. ${He} trusts you a bit more for granting ${his} request, and is eager for buttsex that's more interesting than having a hotdog thrown down ${his} hallway.`);
			eventSlave.trust += 3;
			eventSlave.anus = 0;
			cashX(forceNeg(V.surgeryCost), "slaveSurgery", eventSlave);
			surgeryDamage(eventSlave, 10);
			if (eventSlave.skill.anal > 10) {
				eventSlave.skill.anal -= 10;
			}

			r.toParagraph();
			App.Events.addResponses(frag, [
				new App.Events.Result(`Break ${him} in again"`, again, `This option will take ${his} anal virginity`)
			]);
			return r.container();

			function again() {
				const r = new SpacedTextAccumulator();
				r.push(`${His} ass is yours all over again. As soon as ${his} newly tight rosebud has recovered enough, you visit ${him} in the surgery, without even waiting for ${him} to leave it. You flip ${him} over on the recovery bed and force`);
				if (V.PC.dick !== 0) {
					r.push(`your cock`);
				} else {
					r.push(`a strap-on`);
				}
				r.push(`up ${his} butt while ${he} wriggles with eager discomfort; squealing in pretended horror. ${His} renewed anal virginity was very brief; ${his} ass is once again broken in for penetration. For ${his} part, ${he} thoroughly enjoyed losing ${his} anal cherry, again.`);
				eventSlave.devotion += 5;
				eventSlave.anus = 1;
				seX(eventSlave, "anal", V.PC, "penetrative");
				knockMeUp(eventSlave, 5, 1, -1); // review: add to r.push
				r.toParagraph();
				return r.container();
			}
		}

		function fill() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You announce that you can fill ${him} just fine, and you'll make ${him} feel it just as though ${he} were an anal virgin again. ${He} looks simultaneously intrigued and apprehensive`);
			if (!canDoAnal(eventSlave)) {
				r.push(`as you remove ${his} anal chastity`);
			}
			r.addToLast(`, but starts to get to ${his} knees like a good anal slut. You stop ${him} before ${he} can`);
			if (eventSlave.belly >= 300000) {
				r.push(`lean onto ${his} ${belly} belly`);
			} else {
				r.push(`face the ground`);
			}
			r.push(`and offer you ${his} ass. You're going to need some lubricant for this, but the ${SlaveTitle(eventSlave)}'s saliva should be plenty. As you`);
			if (V.PC.dick !== 0) {
				r.push(`aim your dick`);
			} else {
				r.push(`swiftly pull on a strap-on and aim it`);
			}
			r.push(`at ${his} face, ${he} realizes that ${his} spit is going to be the only relief ${his} fucked-out butt is going to have for whatever you're planning. ${He} blows you with desperate eagerness, doing ${his} absolute best to coat your`);
			if (V.PC.dick !== 1) {
				r.push(`weapon's`);
			}
			r.push(`shaft with as much saliva as ${he} can. You pull it free of ${his} mouth with a wet pop, and ${he} immediately faces the floor, cocking ${his} hips and spreading ${his} huge asspussy for you.`);
			r.toParagraph();
			r.push(`After watching the way it contracts slightly as ${he} breathes hard for a while, letting ${him} feel the apprehension, you shove`);
			if (V.PC.dick !== 0) {
				r.push(`yourself`);
			} else {
				r.push(`the phallus`);
			}
			r.push(`inside ${him}. ${He} takes it without any reaction at all, and ${his} gaped hole cups it only loosely. Grabbing ${him} by the shoulders, you haul ${his} torso up so it's against your`);
			if (V.PC.belly >= 5000) {
				r.push(`pregnancy,`);
				if (V.PC.belly >= 10000) {
					r.push(`capped by its popped navel,`);
				}
			} else if (V.PC.boobs >= 300) {
				r.push(`breasts, capped by their rock-hard nipples,`);
			} else if (V.PC.title === 0) {
				r.push(`flat chest, capped by its rock-hard nipples,`);
			} else {
				r.push(`muscular chest,`);
			}
			r.push(`and push three of your fingers into ${his} mouth. ${He} gags, surprised, but you shove them in farther, collecting as much spit as you can reach. Then you let ${him} fall back down again. ${He} knows what you're going to do, and moans as you slide your fingers in alongside your`);
			if (V.PC.dick !== 0) {
				r.push(`cock,`);
			} else {
				r.push(`strap-on,`);
			}
			r.push(`taking huge shuddering gasps as ${he} feels ${his} sphincter accommodate the abuse. Slowly, you slide your thumb in as well, pushing it around`);
			if (V.PC.dick !== 0) {
				r.push(`your stiff prick`);
			} else {
				r.push(`the unyielding phallus`);
			}
			r.push(`until you're holding it as if masturbating. And then you masturbate. Inside ${his} ass. ${He} begins to scream, but manages to prevent ${himself} from resisting. ${He} does ${his} desperate best to take your crushing abuse of ${his} worn-out hole, and collapses when you finally orgasm and let ${him} go. ${He} does ${his} best to offer some sort of submissive thanks, but is barely coherent, and crawls off to shower again, ${his} lewd sphincter pulsing as ${he} goes.`);
			eventSlave.devotion += 5;
			r.push(VCheck.Anal(eventSlave, 1));
			r.toParagraph();
			frag.append(App.Events.eventFetish(eventSlave, "buttslut"));
			frag.append(App.Events.eventFetish(eventSlave, "masochist"));
			return r.container();
		}

		function double() {
			App.Events.refreshEventArt([eventSlave, S.HeadGirl]);
			const {He2, he2, his2} = getPronouns(S.HeadGirl).appendSuffix('2');
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator();
			r.push(`You page ${S.HeadGirl.slaveName} for some assistance filling up a loose hole, and ${he2} comes quickly,`);
			if (canPenetrate(S.HeadGirl)) {
				r.push(`precum already visible at the tip of ${his2} erection.`);
			} else {
				r.push(`bringing a strap-on.`);
			}
			r.push(`When ${he2} arrives, it's to the sight of ${eventSlave.slaveName} sitting on your lap,`);
			if (!canDoAnal(eventSlave)) {
				r.push(`anal chastity discarded,`);
			}
			r.push(`with your`);
			if (V.PC.dick !== 0) {
				r.push(`cock`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`up ${his} ridiculous anal gape, waiting for a second phallus while your hands tease ${his} ${eventSlave.nipples} nipples. Seeing that backup has arrived, you lean back and shift your grip to the back of the receptacle's lower thighs, pulling ${him} up and shifting ${his} hips to offer your Head Girl another berth in ${eventSlave.slaveName}'s ass. This pulls ${his} loose sphincter up, producing a little gape above the top of your invading shaft, and ${S.HeadGirl.slaveName} loses no time in fucking it. ${He2} gives ${eventSlave.slaveName} a kiss, but soon breaks the lip lock, since ${he2}'s more interested in making eyes at you over your mutual anal conquest's shuddering shoulder. As`);
			if (V.PC.dick !== 0) {
				if (canPenetrate(S.HeadGirl)) {
					r.push(`your dicks slide against each other,`);
				} else {
					r.push(`your dick slides against ${his2} strap-on,`);
				}
			} else {
				if (canPenetrate(S.HeadGirl)) {
					r.push(`your strap-on slides against ${his2} dick,`);
				} else {
					r.push(`your strap-ons slide against each other,`);
				}
			}
			r.push(`your trusty Head Girl whispers that ${he2} loves you. ${eventSlave.slaveName} makes an inarticulate noise of anal distress that probably means approximately the same thing.`);
			eventSlave.devotion += 4;
			r.push(VCheck.Anal(eventSlave, 2));
			if (canImpreg(eventSlave, S.HeadGirl)) {
				knockMeUp(eventSlave, 5, 1, V.HeadGirlID);
			}
			S.HeadGirl.devotion += 4;
			r.toParagraph();
			frag.append(App.Events.eventFetish(eventSlave, "buttslut"));
			frag.append(App.Events.eventFetish(eventSlave, "submissive"));
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => canTalk(s, false),
				canHear,
				s => s.assignment !== Job.QUARTER,
				s => s.skill.entertainment >= 60 || ["a ballerina", "a camgirl", "a camwhore", "a cheerleader", "a classical dancer", "a dancer", "a house DJ", "a party girl", "an aspiring pop star", "an exotic dancer", "an idol"].includes(s.career),

				s => s.health.condition > 40,
				s => s.devotion > 50,
				s => s.trust > 50,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(`As you pass by the area of the penthouse where slaves sleep one morning, you're struck by a`);
		if (eventSlave.voice > 2) {
			r.push(`high, bubbly`);
		} else if (eventSlave.voice > 1) {
			r.push(`feminine`);
		} else {
			r.push(`deep`);
		}
		r.push(
			`humming. It's`,
			contextualIntro(V.PC, eventSlave, true)
		);
		r.addToLast(`, dancing`);
		if (eventSlave.rules.living === "luxurious") {
			r.push(`in the doorway of ${his} room,`);
		} else {
			r.push(`at the foot of ${his} bedroll,`);
		}
		r.push(`dancing like no one's watching. ${He}'s just woken up, and`);
		if (eventSlave.physicalAge > 35) {
			r.push(`is full of energy and vigor in open defiance of ${his} age`);
		} else if (eventSlave.physicalAge < 25) {
			r.push(`is full of youthful energy and vigor`);
		} else {
			r.push(`is full of health and energy`);
		}
		if (eventSlave.belly >= 10000) {
			r.addToLast(`, despite being`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`heavily pregnant`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`heavily gravid`);
			} else {
				r.push(`greatly bloated`);
			}
		}
		r.addToLast(`. ${He}'s letting it out by humming a beat and dancing seductively, all by ${himself}.`);

		r.toParagraph();

		r.push(`You recognize the tune: it's one of`);
		if (S.DJ) {
			r.push(`${S.DJ.slaveName}'s most popular tracks,`);
		} else if (V.club !== 0) {
			r.push(`the most popular tracks in ${V.clubName},`);
		} else {
			r.push(`the most popular house tracks in the Free City,`);
		}
		r.push(`and it's made for sexy dancing. Shaking ${his}`);
		if (eventSlave.hips > 2) {
			if (eventSlave.weight > 30) {
				r.push(`awe inspiring, soft`);
			} else if (eventSlave.weight >= -10) {
				r.push(`awe inspiring`);
			} else {
				r.push(`awe inspiring yet skinny`);
			}
		} else if (eventSlave.hips > 0) {
			if (eventSlave.weight > 30) {
				r.push(`broad, chubby`);
			} else if (eventSlave.weight >= -10) {
				r.push(`broad`);
			} else {
				r.push(`broad yet skinny`);
			}
		} else if (eventSlave.hips === 0) {
			if (eventSlave.weight > 30) {
				r.push(`chubby`);
			} else if (eventSlave.weight >= -10) {
				r.push(`feminine`);
			} else {
				r.push(`skinny`);
			}
		} else {
			if (eventSlave.weight > 30) {
				r.push(`narrow, chubby`);
			} else if (eventSlave.weight >= -10) {
				r.push(`narrow`);
			} else {
				r.push(`narrow and skinny`);
			}
		}
		r.push(`hips`);
		if (eventSlave.belly >= 5000) {
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`and ${belly} baby bump`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`and ${belly} round belly`);
			} else {
				r.push(`and ${eventSlave.inflationType}-filled belly`);
			}
		}
		r.push(`in time with ${his} humming, ${he} runs ${his}`);
		if (hasBothArms(eventSlave)) {
			r.push(`hands`);
		} else {
			r.push(`hand`);
		}
		r.push(`sensually over them, along ${his} flanks, and over ${his} chest,`);
		if (eventSlave.boobs > 3000) {
			r.push(`letting the vast mass of ${his} tits rest atop them`);
		} else if (eventSlave.boobs > 1000) {
			r.push(`groping ${his} own heavy breasts`);
		} else {
			r.push(`${his} fingertips circling ${his} nipples`);
		}
		r.push(`for an alluring moment. As ${his} hips maintain their sexual rhythm, ${his} hands continue, tracing up ${his} throat, over ${his} moist lips, and over ${his} head. As ${he} stretches up, ${his} torso begins to sway with the barely perceptible beat, ${his}`);
		if (eventSlave.boobsImplant/eventSlave.boobs >= .75) {
			r.push(`fake tits staying perfectly in place.`);
		} else if (eventSlave.boobs > 2000) {
			r.push(`${eventSlave.boobShape} boobs swaying along.`);
		} else if (eventSlave.boobs > 400) {
			r.push(`${eventSlave.boobShape} tits bouncing along.`);
		} else {
			r.push(`petite chest accentuating ${his} gamine charm.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Enjoy the show`, enjoy),
			new App.Events.Result(`Dance along with ${him}`, dance)
		]);

		function enjoy() {
			const r = new SpacedTextAccumulator();
			r.push(`There are low leather ottomans scattered all over the penthouse, for rest, relaxation, and sex. You seat yourself on the nearest one, enjoying the spectacle. ${He} feels your eyes on ${him}, a sensation ${he} knows well, and turns with a little smile on ${his} ${eventSlave.faceShape} face, putting an extra swing in ${his} hips`);
			if (eventSlave.belly >= 5000) {
				r.addToLast(`, causing ${his} weighty middle to swing wide`);
			}
			r.addToLast(`. ${He}'s still dancing alone, but now ${he}'s giving you a private show. You give ${him} the proper music, instructing ${V.assistant.name} to play the track ${he} was humming.`);
			r.toParagraph();
			r.push(`${He} advances on you slowly, sensually, relishing the beat and doing ${his} best to show off ${his} body.`);
			if (eventSlave.dick > 0) {
				r.push(`${His}`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`chastity cage sways`);
				} else if (canAchieveErection(eventSlave)) {
					r.push(`erection waves back and forth`);
				} else if (eventSlave.dick > 6) {
					r.push(`soft python of a cock swings lewdly`);
				} else {
					r.push(`bitchclit bounces`);
				}
				r.push(`with ${his} rhythm.`);
			}
			if (eventSlave.vagina > -1) {
				r.push(`${His}`);
				if (eventSlave.chastityVagina) {
					r.push(`chastity catches your eye`);
				} else if (eventSlave.clit > 1) {
					r.push(`big clit catches your eye`);
				} else if (eventSlave.labia > 0) {
					r.push(`generous petals catch your eye`);
				} else if (eventSlave.vaginaLube > 1) {
					r.push(`wet cunt glistens`);
				} else {
					r.push(`womanhood is ${his} center`);
				}
				r.push(`as ${he} moves.`);
			}
			r.push(`${He} gives you an excellent nude lap dance, expressing the art at the level only the finest old world strippers can manage. The interaction is all about you, your eyes on ${his} body, your desire for ${his} touch, and finally your`);
			if (V.PC.dick !== 0) {
				r.push(`cum flowing into ${his} mouth as ${he} sucks your dick`);
				if (V.PC.vagina !== -1) {
					r.push(`and the wetness against ${his} fingers as they tease your pussy`);
				}
			} else {
				r.push(`pussyjuice coating ${his} lips as ${he} eats you out`);
			}
			r.addToLast(`. ${He} <span class="trust inc">knows ${his} place</span> very well.`);
			eventSlave.trust += 4;
			seX(eventSlave, "oral", V.PC, "penetrative");
			r.toParagraph();
			return r.container();
		}

		function dance() {
			const r = new SpacedTextAccumulator();
			r.push(`${He} doesn't`);
			if (canSee(eventSlave)) {
				r.push(`see`);
			} else {
				r.push(`notice`);
			}
			r.push(`you advance on ${him}; ${he}'s facing away from you, and in any case, ${he}'s lost in ${his} own little world. At the same moment, however, ${he} begins to hear the track you're humming, in perfect synchrony with the way ${he}'s humming it, and senses a presence at ${his} side. You timed it perfectly, directing the sound system here to play the right track, match it to ${him}, and fade it in as you approached and began to dance beside ${him}.`);
			if (V.PC.title === 0) {
				r.push(`You've got a woman's body, and you match ${his} moves, though an observer might see greater power and dominance in the way you dance.`);
			} else {
				r.push(`You make your moves the masculine companion to ${hers}, moving like a paragon of frank male`);
				if (V.PC.belly >= 1500) {
					r.push(`sexuality, despite the fecund curve to your stomach.`);
				} else if (V.PC.boobs >= 300) {
					r.push(`sexuality, despite the pair of breasts bouncing on your chest.`);
				} else {
					r.push(`sexuality.`);
				}
			}
			r.toParagraph();
			r.push(`There's a momentary flaw in ${his} rhythm, a catch in ${his} breath as ${he} realizes what you're doing, but ${he} gets right back into it, displaying ${his} pleasure with nothing more than a ghost of a smile`);
			if (canSee(eventSlave) || canHear(eventSlave)) {
				r.push(`and a`);
				if (canSee(eventSlave)) {
					r.push(`widening of ${his}`);
					if (hasBothEyes(eventSlave)) {
						r.push(`eyes`);
					} else {
						r.push(`eye`);
					}
					r.push(`as ${he} looks you up and down`);
				} else {
					r.push(`slight perk of ${his} ears as ${he} tracks your motion`);
				}
			}
			r.addToLast(`. ${He} doesn't shove ${himself} against you; that would be coarse. Instead ${he} dances alluringly, just out of your grasp. Taking the dominant role, you encircle ${him} in your arms and draw ${him} in close, ${his} heat perceptible against your skin before the very first graze of ${his} ${eventSlave.skin} body against yours. ${He} continues to dance gorgeously as ${he} helps you out of your clothes.`);
			r.toParagraph();
			r.push(`When you're nude, ${he} turns ${his} back to you and starts to grind, letting you feel ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				r.push(`thick`);
			} else if (eventSlave.weight > 30) {
				r.push(`chubby`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscled`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else if (eventSlave.weight < -10) {
				r.push(`thin`);
			} else {
				r.push(`soft`);
			}
			r.push(`body all up and down your front. Feeling your`);
			if (V.PC.dick === 0) {
				r.push(`building heat, ${he} begins to incorporate gentle caresses of your womanhood,`);
			} else {
				r.push(`erection brushing against ${him}, ${he} begins to corral it between ${his} buttocks and thighs,`);
			}
			r.push(`and you return the favor by teasing ${his} nipples`);
			if (canDoVaginal(eventSlave)) {
				r.addToLast(`, pussylips, clit,`);
			}
			r.push(`and even ${his} ass. You orgasm one after the other, and as the music fades, ${he} <span class="devotion inc">throws ${his} arms around you.</span>`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", V.PC, "penetrative");
			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESSHatesOral = class RESSHatesOral extends App.Events.BaseEvent { // Written by anon, coded by Boney M
	eventPrerequisites() {
		return [
			() => V.PC.dick !== 0,
		]; // always valid if sufficient actors can be cast successfully
	}

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

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

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`has been in your service long enough to know that oral sex is a daily fact of life for most slaves, and that most slaves are not only required to put up with cum, but to love it, too — or at least be able to fake enjoyment convincingly. ${He}'s`
		);
		if (canSee(eventSlave)) {
			r.push(`seen cum spattered on other slaves' faces, pooling in their mouths, and dripping from their asses only to be licked up by other slaves.`);
		} else if (canHear(eventSlave)) {
			r.push(`heard cum spattering across other slaves' faces, the sound of it in their mouths, dripping from their asses, and more.`);
		} else {
			r.push(`felt seminal fluid on ${his} skin and on ${his} lips, always coercively or accidentally.`);
		}
		r.push(`It's clear from ${eventSlave.slaveName}'s recent reactions to these acts that ${he}'s quite disgusted by oral sex in general and cum in particular. Depending on your point of view, this could be a flaw for ${him} to overcome or a weakness you can exploit.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} earn a break for ${his} throat`, earn),
			new App.Events.Result(`Try to brute-force ${his} oral resistance with a public blowbang`, brute),
			new App.Events.Result(`Teach ${him} to see cum as a reward`, teach),
			(eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.belly < 1500 && eventSlave.weight < 130) /* won't work if too pregnant */
				? new App.Events.Result(`Make ${him} eat ${his} own cum`, own)
				: new App.Events.Result(),
		]);

		function earn() {
			r = [];
			r.push(`You tell ${him} ${he}'s a sex slave, and that ${he} needs to learn how to suck dick.`);
			if (!canTalk(eventSlave) && hasAnyArms(eventSlave)) {
				r.push(`${He} frantically begs with gestures, pleading`);
				if (hasBothLegs(eventSlave)) {
					r.push(`on ${his} knees.`);
				} else {
					r.push(`desperately.`);
				}
			} else if (!canTalk(eventSlave)) {
				r.push(`${He} frantically mouths pleas that you leave ${his} throat cock-free.`);
			} else {
				r.push(`${He} begs, "Please no, ${Master}, please don't rape my mouth, ${Master}!"`);
			}
			r.push(`You make a show of considering, and then tell ${him} that if ${he}'s extra obedient, you might let ${him} earn a break for ${his} throat — for now.`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				r.push(`You tell ${him} to lie back and spread ${his} legs, because you're going to give ${him} a good old fashioned missionary-position pounding. ${He} does so with unusual obedience,`);
				if (eventSlave.belly >= 5000) {
					r.push(`${his} legs hanging off the couch to give you a better angle with ${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`belly`);
					}
					r.push(`in the way,`);
				}
				r.push(`and as you're giving ${him} a thorough pounding, whether out of relief, gratitude, or a desire to put on a good performance, ${he} certainly seems to be enjoying it more than usual.`);
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				r.push(`You tell ${him} to bend over and spread ${his} ass for you, because if ${he} doesn't want you going in one end you're going to go in the other. ${He} does so with unusual obedience, and as you`);
				if (eventSlave.anus === 1) {
					r.push(`gently but firmly pound ${his} still-tight ass`);
				} else if (eventSlave.anus === 2) {
					r.push(`pound away at ${his} well-used backdoor`);
				} else {
					r.push(`mercilessly jackhammer ${his} gaping hole`);
				}
				r.push(`${he} actively tries to match the rhythm of your thrusts.`);
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				r.push(`You tell ${him} that if ${he}'s going to hesitate to use ${his} mouth when`);
				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
					r.push(`${he} has no other hole to amuse you`);
				} else if (!canDoAnal(eventSlave) && eventSlave.vagina === 0) {
					r.push(`${his} only available hole is still virgin`);
				} else if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
					r.push(`all ${his} other holes are still virgin`);
				} else if (eventSlave.anus === 0) {
					r.push(`${his} girly little butthole is still virgin`);
				}
				r.push(`${he}'s going to have to find an amazingly thorough way to please a dick if ${he}'s going to earn ${his} throat a reprieve. ${He} looks`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant < -15) {
					r.push(`uncharacteristically`);
				}
				r.push(`thoughtful for a moment before bending over before you, spitting in ${his} hand`);
				if (eventSlave.vagina === 0) {
					r.push(`and thoroughly coating ${his} inner thighs with ${his} saliva.`);
				} else {
					r.push(`and thoroughly coating the`);
					if (eventSlave.butt <= 2) {
						r.push(`crack of ${his} slender`);
					} else if (eventSlave.butt <= 4) {
						r.push(`crack of ${his} curvy`);
					} else if (eventSlave.butt <= 8) {
						r.push(`crack of ${his} huge`);
					} else if (eventSlave.butt <= 12) {
						r.push(`crevice of ${his} expansive`);
					} else if (eventSlave.butt <= 20) {
						r.push(`ravine of ${his} endless`);
					}
					r.push(`ass.`);
				}
				r.push(`The invitation is obvious, but just to be sure ${he} pleads with you to satisfy yourself alongside ${his}`);
				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
					r.push(`chastity. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as pilfering an off-limits hole,`);
					if (eventSlave.vagina > -1) {
						r.push(`before long ${his}`);
						if (eventSlave.vagina === 0) {
							r.push(`virgin`);
						}
						r.push(`cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts.`);
					} else {
						r.push(`${eventSlave.slaveName}'s trembling whenever your thrusts slam against ${his} anal chastity is thoroughly entertaining.`);
					}
					r.push(`Before long, you plaster ${his} belt with your cum.`);
				} else if (!canDoAnal(eventSlave) && eventSlave.vagina === 0) {
					r.push(`virgin hole. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, before long ${his} virgin cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts. Before long, you plaster ${his} still-virgin hole with your cum.`);
				} else if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
					r.push(`virgin holes. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole,`);
					if (eventSlave.vagina === 0) {
						r.push(`before long ${his} virgin cunt starts to supply extra lubrication and ${he} starts to gasp and moan along with your thrusts.`);
					} else {
						r.push(`${eventSlave.slaveName}'s trembling whenever your thrusts come perilously close to penetrating ${his} virgin ass is thoroughly entertaining.`);
					}
					r.push(`Before long, you plaster ${his} still-virgin hole with your cum.`);
				} else if (eventSlave.anus === 0) {
					r.push(`virgin hole. You answer ${his} pleading with your dick, and though it's not quite as pleasurable as a newly-deflowered hole, ${eventSlave.slaveName}'s trembling whenever your thrusts come perilously close to penetrating ${his} virgin ass is thoroughly entertaining. Before long, you plaster ${his} still-virgin hole with your cum.`);
				}
			}
			r.push(`When you're done, you bend down and whisper in ${his} ear that if ${he} shows any sign of rebelliousness, you'll give every dick in ${V.arcologies[0].name} free access to ${his} throat. ${He} has become more obedient, in the hope this will persuade you to not follow through on your threat.`);
			eventSlave.devotion += 4;
			return r;
		}

		function brute() {
			r = [];
			r.push(`Simple problems require simple solutions — ${he}'ll get fucked in the mouth until ${he} either gets over ${his} hang-ups about oral or learns to hide them. You drag the protesting ${eventSlave.slaveName} out in public, chain ${him} low so that ${his} mouth is available, and tell ${him} that ${he}'ll suck dicks until ${he} gets through five in a row without grimacing, gagging, or resisting. You have a comfortable chair brought out to you and settle in to watch the show.`);
			r.push(`${eventSlave.slaveName} tries, ${he} really does. But when word gets out as to the conditions of ${his} enslavement, ${his} users take a perverse enjoyment in being rougher than usual to evoke the exact reactions ${he}'s trying to avoid. By the third failed streak, you've started to grow bored of the spectacle, but luckily you find entertainment in conversation with those who have already been entertained by poor ${eventSlave.slaveName}. Before long more chairs have been brought up and an impromptu salon has been set up alongside the blowbang line. By the sixth failed streak, an enterprising citizen has set up a small bar and is serving drinks. By the ninth, you've delegated watching ${eventSlave.slaveName} to your assistant. You personally break the eleventh streak after ${he} reached four, to general acclaim from your newfound friends and a toast to your virility.`);
			r.push(`When the fourteenth streak is finally successful, there are serious talks about making these blowbang salons a regular occurrence and some backslapping directed towards you for your innovation in genteel hedonism. While you seriously doubt ${eventSlave.slaveName} enjoys oral sex any more than ${he} did at the start of the day, ${he}'s certainly learned to keep ${his} feelings on the matter to ${himself}. ${He} did, however, have quite a rough time`);
			if (eventSlave.skill.oral <= 30) {
				r.push(`of it, though ${he} did learn a thing or two about sucking dick.`);
				slaveSkillIncrease('oral', eventSlave, 10);
			} else {
				r.push(`of it.`);
			}
			r.push(`And last of all, you and ${eventSlave.slaveName} did make <span class="reputation inc">quite a good impression</span> today, though for widely differing reasons.`);
			eventSlave.sexualFlaw = "none";
			seX(eventSlave, "oral", "public", "penetrative", random(65, 80));
			repX(500, "event", eventSlave);
			healthDamage(eventSlave, 10);
			return r;
		}

		function teach() {
			r = [];
			r.push(`You bring ${eventSlave.slaveName} into your office and stand ${him} in front of your leather couch. ${He}`);
			if (canSee(eventSlave)) {
				r.push(`eyes you`);
			} else if (canHear(eventSlave)) {
				r.push(`listens`);
			} else {
				r.push(`waits silently and`);
			}
			if (eventSlave.devotion < -20) {
				r.push(`suspiciously`);
			} else {
				r.push(`worriedly`);
			}
			r.push(`as you ready a bullet vibrator.`);
			if (eventSlave.dick > 0) {
				r.push(`You secure the bullet to ${eventSlave.slaveName}'s frenulum.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`You secure the bullet to ${his} perineum.`);
			} else {
				r.push(`You secure the bullet to ${eventSlave.slaveName}'s clit.`);
			}
			r.push(`You explain that the arcology continually monitors your vital signs, and will use them to estimate your arousal; the system controls the bullet vibrator, which will emit stimulating vibrations scaled to your pleasure. The more pleasure you feel, the more pleasant the vibrations will be, though they will not bring ${him} to orgasm until you climax. To demonstrate, you give the head of your cock a quick squeeze. ${eventSlave.slaveName} squeals in surprise at the sudden stimulation as the bullets spring to life. You tell ${him} to get to work. Though timid at first, as ${he} proceeds to blow you, ${he} becomes more and more enthusiastic as ${his} own pleasure builds. It isn't long until ${he}'s deepthroating you enthusiastically and begging you to cum in ${his} mouth. You make ${him} hold out a bit longer, and then you complete the training session,`);
			if (PC.balls >= 30) {
				r.push(`pumping cum into ${his} stomach until it visibly begins to swell.`);
			} else if (PC.balls >= 14) {
				r.push(`pumping cum into ${his} stomach until it threatens to come back up.`);
			} else if (PC.balls >= 9) {
				r.push(`cumming into ${his} mouth until it spurts from ${his} nose.`);
			} else {
				r.push(`filling ${his} mouth with your cum.`);
			}
			r.push(`${He} climaxes in turn, and virtually melts into a quivering mess on your floor.`);
			if (eventSlave.dick > 0) {
				r.push(`${eventSlave.slaveName}'s cock oozes cum from ${his} intense orgasm, and you command ${him} to clean it off the floor before ${he} gets back to ${his} duties.`);
			}
			if (random(1, 4) === 4) {
				r.push(`<span class="fatish gain">You've successfully linked cum and pleasure in ${his} mind,</span> guaranteeing ${him} a confusing few days as ${he} tries to reconcile this with ${his} hatred of oral sex.`);
				eventSlave.fetish = "cumslut";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
			} else {
				r.push(`This has <span class="flaw break">broken ${him} of ${his} bad habits.</span>`);
				eventSlave.sexualFlaw = "none";
			}
			r.push(`This demonstration of your control over ${him} has <span class="devotion inc">worn down ${his} resistance to your commands.</span>`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			return r;
		}

		function own() {
			r = [];
			r.push(`Your cum training tactics have two components: Cum should be linked with pleasure, and cum should not be disgusting to ${eventSlave.slaveName}, because even ${eventSlave.slaveName} produces it. To drive home these lessons, you lead ${eventSlave.slaveName} to your office's leather couch, arranging ${his}`);
			if (eventSlave.height < 150) {
				r.push(`petite`);
			} else if (eventSlave.height < 160) {
				r.push(`short`);
			} else if (eventSlave.height >= 170) {
				r.push(`tall`);
			} else if (eventSlave.height >= 185) {
				r.push(`very tall`);
			}
			r.push(`form upside down with ${his} head on the cushion, ${his} back on the backrest, and ${his}`);
			if (hasBothLegs(eventSlave)) {
				r.push(`legs`);
			} else {
				r.push(`ass`);
			}
			r.push(`in the air. In this position, ${his}`);
			if (eventSlave.dick > 10) {
				r.push(`obscene`);
			} else if (eventSlave.dick > 9) {
				r.push(`inhuman`);
			} else if (eventSlave.dick > 8) {
				r.push(`monstrous`);
			} else if (eventSlave.dick > 7) {
				r.push(`imposing`);
			} else if (eventSlave.dick > 6) {
				r.push(`massive`);
			} else if (eventSlave.dick > 5) {
				r.push(`gigantic`);
			} else if (eventSlave.dick > 4) {
				r.push(`huge`);
			} else if (eventSlave.dick > 3) {
				r.push(`large`);
			} else if (eventSlave.dick > 2) {
				r.push(`average`);
			} else if (eventSlave.dick > 1) {
				r.push(`small`);
			} else if (eventSlave.dick > 0) {
				r.push(`tiny`);
			}
			r.push(`cock`);
			if (eventSlave.belly >= 100 || eventSlave.weight > 30) {
				r.push(`rests over ${his}`);
				if (eventSlave.pregKnown === 1) {
					r.push(`early pregnancy`);
				} else {
					r.push(`belly`);
				}
				r.push(`and`);
			}
			r.push(`hangs directly over ${his} anxious face.`);
			if ((eventSlave.aphrodisiacs > 0) || eventSlave.inflationType === "aphrodisiac") {
				r.push(`The aphrodisiacs in ${his} system already have ${him} so aroused ${he}'s already dripping precum; as you approach ${his} vulnerable form on the couch, a drop lands on ${his} chin.`);
			} else if (eventSlave.prostate > 1) {
				r.push(`${His} overactive prostate has ${him} steadily dripping precum; as you approach ${his} vulnerable form on the couch, a drop lands on ${his} chin.`);
			} else {
				r.push(`You sit next to ${his} vulnerable form on the couch as ${he} looks at you in anticipation.`);
			}
			r.push(`You`);
			if (canDoAnal(eventSlave)) {
				if (eventSlave.anus > 2) {
					r.push(`insert a wide vibrating plug into ${his} gaping anus,`);
				} else if (eventSlave.anus > 1) {
					r.push(`insert a big vibrating plug into ${his} ass,`);
				} else if (eventSlave.anus > 0) {
					r.push(`insert a vibrating plug into ${his} tight ass,`);
				} else {
					r.push(`place a bullet vibrator over the pucker of ${his} virgin anus,`);
				}
			} else {
				r.push(`strap a strong vibrator to ${his} anal chastity,`);
			}
			r.push(`secure a bullet vibrator ${his} quivering perineum, and another to the base of ${his} dick, and set them all to gradually increase the strength of their vibrations. In no time at all ${he} releases a`);
			if (eventSlave.chastityPenis === 1) {
				r.push(`squirt of ejaculate from ${his} cock cage,`);
			} else if (eventSlave.balls > 0) {
				r.push(`torrent of thick, white semen,`);
			} else if (eventSlave.prostate > 2) {
				r.push(`torrent of nearly clear, watery ejaculate,`);
			} else if (eventSlave.prostate === 0) {
				r.push(`pathetic dribble of semen,`);
			} else {
				r.push(`pathetic dribble of watery ejaculate,`);
			}
			r.push(`all of which lands right on ${his} outstretched tongue and pools in ${his} throat. You nudge ${his} chin to make ${him} close ${his} mouth and swallow. After a week of such treatment, ${he} acquires a taste for semen.`);
			eventSlave.fetish = "cumslut";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 10;
			eventSlave.devotion += 4;
			return r;
		}
	}
};


code:
App.Events.RESSHeavyPiercing = class RESSHeavyPiercing 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.piercing.vagina.weight > 1,
				s => s.piercing.nipple.weight > 1,
				s => s.piercing.genitals.weight > 1,
				s => s.devotion > 20 || s.trust < -20,
				s => s.devotion <= 50,
				s => canDoAnal(s) || canDoVaginal(s)
			]
		];
	}

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

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

		let r = [];
		r.push(
			`The intimate areas of`,
			contextualIntro(V.PC, eventSlave, true),
			`are heavily pierced. This is great; it draws attention to ${his} holes and makes ${him} look like the sex slave ${he} is. However, it does necessitate some extra maintenance. It's the end of the day, and ${eventSlave.slaveName} is in a bathroom`
		);
		if (canSee(eventSlave)) {
			r.push(`carefully checking each of ${his} piercings.`);
		} else {
			r.push(`meticulously cleaning each of ${his} piercings.`);
		}
		r.push(`Many of them come in contact with fluids on a regular basis, so ${he} cleans them conscientiously.`);
		App.Events.addParagraph(node, r);
		App.Events.addParagraph(node, [`As you watch ${him}, it occurs to you that since ${eventSlave.slaveName} isn't fully devoted to you yet, there's all manner of inventive ways you could have a little fun and increase ${his} submission to you at the same time.`]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Weight ${his} piercings and fuck ${him} so they swing`, weigh, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null),
			new App.Events.Result(`Secure ${him} by ${his} piercings for public use`, secure, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null),
		]);

		function weigh() {
			r = [];
			r.push(`You order ${him} to make sure all of ${his} piercings have rings in them, and then come join you when ${he}'s done. ${He} enters your office with a mixture of fear and curiosity on ${his} face. You put ${him} down on`);
			if (hasAllLimbs(eventSlave)) {
				r.push(`all fours`);
			} else {
				r.push(`the ground`);
			}
			if (hasBothLegs(eventSlave)) {
				r.push(`with ${his} legs spread,`);
			}
			if (eventSlave.belly >= 50000) {
				r.push(r.pop() + `, belly brushing the floor,`);
			}
			if (canSee(eventSlave)) {
				r.push(`blindfold ${him},`);
			}
			r.push(`and then start clipping little metal weights on short chains to each of ${his} piercings. Before long, ${his} nipples are painfully stretched under the tugging,`);
			if (eventSlave.dick > 0) {
				r.push(`and the weights up and down ${his} cock are causing ${his} considerable discomfort.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`and though ${he} lacks any external genitalia to weight, you make sure ${his} ass feels the burn.`);
			} else {
				r.push(`${his} pussylips are being pulled downward, and even ${his} clit is agonizingly tortured.`);
			}
			r.push(`You fuck ${him} thoroughly, pounding ${him} so the weights swing. ${He} sobs and begs. <span class="devotion inc">${He} has become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function secure() {
			r = [];
			r.push(`You order ${him} to make sure all of ${his} piercings have rings in them, and then come to you when ${he}'s done. ${He} enters your office with a mixture of fear and curiosity on ${his} face. You lead ${him} outside and secure ${him} in a side hall so that ${his} ass is presented to anyone who takes interest. ${He}'s forced to maintain this exact posture by a light chain between`);
			if (eventSlave.belly > 10000) {
				r.push(`${his} popped navel and a ring on the ground.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${his} dickhead and a ring on the ground.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`${his} nipples and a ring on the ground.`);
			} else {
				r.push(`${his} pussy and a ring on the ground.`);
			}
			r.push(`You fuck ${his} ass to check the bondage; it's good. The chain is out of the way, and ${he} jerks and struggles amusingly to keep it from tugging ${him} painfully. You pull out to leave ${his} fucked butt with cum dribbling out of it, and leave ${him} to the tender mercies of the growing crowd. The sadists among the public are duly grateful.`);
			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
					r.push(`They take pleasure in claiming <span class="virginity loss">both ${his} virginity and anal cherry.</span>`);
				} else if (eventSlave.vagina === 0) {
					r.push(`They take pleasure in claiming <span class="virginity loss">${his} virginity.</span>`);
				} else if (eventSlave.anus === 0) {
					r.push(`They take pleasure in claiming <span class="virginity loss">${his} anal cherry.</span>`);
				}
				eventSlave.vagina++;
				eventSlave.anus++;
				seX(eventSlave, "anal", "public", "penetrative", 5);
				seX(eventSlave, "vaginal", "public", "penetrative", 5);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 10, 2, -2));
				}
			} else if (canDoAnal(eventSlave)) {
				if (eventSlave.anus === 0) {
					r.push(`They take pleasure in claiming <span class="virginity loss">${his} anal cherry.</span>`);
				}
				eventSlave.anus++;
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 25, 1, -2));
				}
			} else {
				if (eventSlave.vagina === 0) {
					r.push(`They take pleasure in claiming <span class="virginity loss">${his} virginity.</span>`);
				}
				eventSlave.vagina++;
				seX(eventSlave, "vaginal", "public", "penetrative", 5);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 25, 0, -2));
				}
			}
			repX(2500, "event", eventSlave);
			return r;
		}
	}
};


code:
App.Events.RESSHeels = class RESSHeels 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 => (canDoAnal(s) || canDoVaginal(s)),
				s => s.heels === 1, // tendons are shortened
				s => shoeHeelCategory(s) > 0 // changed during conversion; previously accepted only "heels" and "extreme heels"
			]
		];
	}

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

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

		let r = [];
		r.push(
			`Since`,
			App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "'s"),
			`tendons were shortened, forcing ${him} to wear heels in order to walk, ${he}'s permanently subject to your whims in shoe selection. ${He} walks carefully into your office, the sway of ${his} hips greatly`
		);
		if (eventSlave.bellyPreg >= 10000) {
			r.push(`exaggerated, even more so with ${his} advanced pregnancy.`);
		} else if (eventSlave.bellyImplant >= 10000) {
			r.push(`exaggerated, even more so with the weight of ${his} ${belly} middle.`);
		} else if (eventSlave.bellyFluid > 5000) {
			r.push(`exaggerated, even more so under the weight of ${his} ${eventSlave.inflationType}-swollen middle.`);
		} else {
			r.push(`exaggerated.`);
		}
		if (eventSlave.dick !== 0) {
			r.push(`The modification certainly forces ${him} to walk more like someone without a cock.`);
		}
		if (eventSlave.belly >= 300000) {
			r.push(`${He} struggles to lower ${his} tired, heavy body onto the couch next to your desk, shakes off ${his} heels since ${he} has long since become incapable of reaching ${his} feet,`);
		} else if (eventSlave.belly >= 100000) {
			r.push(`${He} lowers ${his} tired, heavy body onto the couch next to your desk, shakes off ${his} heels as bending over has become troublesome lately,`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`${He} rests ${his} tired,`);
			if (eventSlave.bellyPreg >= 8000) {
				r.push(`gravid`);
			} else {
				r.push(`rounded`);
			}
			r.push(`body on the couch next to your desk, shakes off ${his} heels,`);
		} else if (eventSlave.belly >= 5000) {
			r.push(`${He} seats ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`gravid`);
			} else {
				r.push(`rounded`);
			}
			r.push(`body on the couch next to your desk, takes off ${his} heels,`);
		} else {
			r.push(`${He} sits on the couch next to your desk, takes off ${his} heels,`);
		}
		r.push(`and opens the shoebox you've placed next to ${him}, to find:`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Nothing, ${he}'ll crawl for the rest of the week`, crawl, virginityWarning()),
			new App.Events.Result(`Pretty heels, we're going out`, out),
			canDoAnal(eventSlave)
				? 	new App.Events.Result(`Heels for an anal slut`, slut, virginityWarning(true))
				: new App.Events.Result(),

		]);

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

		function crawl() {
			r = [];
			r.push(`${He} is surprised`);
			if (canSee(eventSlave)) {
				r.push(`to see the box is empty.`);
			} else {
				r.push(`when ${he} reaches into the box and finds nothing.`);
			}
			r.push(`By the time ${he} realizes what this means, you've already confiscated ${his} old heels and seated yourself at your desk. Ordered to suck, ${he} comes gingerly over`);
			if (hasAllLimbs(eventSlave)) {
				r.push(`on all fours,`);
			} else {
				r.push(`while crawling on the ground,`);
			}
			if (eventSlave.belly >= 100000) {
				r.push(`${his} belly dragging along the floor,`);
			} else if (eventSlave.belly >= 10000) {
				r.push(`${his} swollen belly getting in ${his} way,`);
			}
			r.push(`and gets you off with ${his} whore's mouth. The rest of the week is a trying experience for ${him}. The most comfortable posture for ${him} to walk along in`);
			if (hasAllLimbs(eventSlave)) {
				r.push(`on all fours`);
			}
			r.push(`displays ${his}`);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(`holes nicely and you frequently avail yourself to which ever is more tempting at the time.`);
				r.push(VCheck.Both(eventSlave, 5, 5));
			} else if (canDoVaginal(eventSlave)) {
				r.push(`pussy nicely, so ${he} gets it in ${his} feminine fold a lot.`);
				r.push(VCheck.Vaginal(eventSlave, 10));
			} else {
				r.push(`anus nicely, so ${he} gets it up ${his}`);
				if (V.seeRace === 1) {
					r.push(`${eventSlave.race}`);
				}
				r.push(`ass a lot.`);
				r.push(VCheck.Anal(eventSlave, 10));
			}
			if (eventSlave.dick !== 0) {
				r.push(`The effort it takes to move usually keeps ${his} dick soft as ${he} does, so it flops around beneath ${him} all week.`);
			}
			r.push(`<span class="devotion inc">${He} has become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			eventSlave.shoes = "none";
			return r;
		}

		function out() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave, "no clothing");
			r = [];
			r.push(`You have an appointment, and ${eventSlave.slaveName} gets to be your arm candy. ${He}'s almost beside ${himself} with pride when you leave the penthouse and head out into the warm sun. You have to walk slowly so ${he} can keep ${his} feet and still keep up, since you've taken the unusual step of rewarding ${him} by letting ${him} walk under your arm. To avoid giving the impression that the ${girl} on your arm isn't a slave, ${he}'s naked except for ${his} lovely heels. As ${he} minces along ${his} breasts`);
			if (eventSlave.bellyFluid >= 5000) {
				r.push(`jiggle delightfully alongside ${his} ${eventSlave.inflationType}-filled belly`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`jiggle delightfully atop ${his} gravid belly`);
			} else {
				r.push(`sway freely`);
			}
			r.push(`and draw the respectful admiration of onlookers.`);
			if (eventSlave.dick !== 0) {
				r.push(`Most of the female onlookers and some of the men also spare an eye for ${his} swinging dick.`);
			}
			r.push(`<span class="trust inc">${His} trust in you has increased.</span>`);
			eventSlave.trust += 4;
			return r;
		}

		function slut(){
			r = [];
			r.push(`${eventSlave.slaveName} is a little perplexed to find that the heels look quite normal, though they're very tall. When ${he} tries them on, however, standing requires ${him} to splay ${his} hips slightly so that ${his}`);
			if (V.seeRace === 1) {
				r.push(eventSlave.race);
			}
			r.push(`butt is a little spread even when ${he} stands upright. What's more, the heels are tall to raise ${his} butt to the exact level`);
			if (V.PC.dick === 0) {
				r.push(`a strap-on is at when you wear one and`);
			} else {
				r.push(`your cock is at`);
			}
			r.push(`when you stand behind ${him}. When you start demonstrating the advantages of this to ${him}, the heels detect that the wearer is being fucked, begin to play a light show, and start playing a heavy beat in time with your thrusts. ${He} would laugh if ${he} weren't concentrating on the buttsex. ${His} submission to you has increased.`);
			eventSlave.devotion += 4;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}
	}
};


code:
App.Events.RESSHormoneDysfunction = class RESSHormoneDysfunction 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.hormoneBalance >= 50,
				s => s.vagina === -1,
				s => s.balls >= 0,
				s => s.devotion > 20 || s.trust < -20,
				s => s.devotion <= 50,
				s => s.fetish !== "buttslut",
				s => s.rules.speech === "permissive"
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`comes to see you. You're busy with other things, so ${he} waits patiently even though ${he}'s clearly very unhappy. Told to explain ${himself}, ${he} gestures at ${his} totally flaccid`
		);
		if (!canTalk(eventSlave)) {
			r.push(`penis.`);
		} else {
			if (eventSlave.lips > 70) {
				r.push(`penis and ${say}s through ${his} huge lips,`);
			} else if (eventSlave.piercing.lips.weight + eventSlave.piercing.tongue.weight > 2) {
				r.push(`penis and ${say}s through ${his} piercings,`);
			} else {
				r.push(`penis and ${say}s,`);
			}
			r.push(Spoken(eventSlave, `"${Master}, I can't get it up."`));
		}
		r.push(`Ever since the rules have permitted it, ${contextualIntro(V.PC, eventSlave)} has been a constant masturbator. If ${he} can help it, ${he} never sucks or gives up ${his} ass without a hand between ${his} legs, pumping away.`);
		App.Events.addParagraph(node, r);

		r = [];
		if (!canTalk(eventSlave)) {
			r.push(`${He} mimics masturbation and then traces a finger down ${his} cheek, as though it were a tear.`);
		} else {
			r.push(Spoken(eventSlave, `"I can't come like this, ${Master}."`));
		}
		r.push(`It makes sense; ${he}'s probably never masturbated without a hard dick. ${He}'s clearly in desperate need of release, and more than a little sad the hormones ${he}'s taking have given ${him} erectile dysfunction.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} some vasodilators so ${he} can get relief`, vasodilators),
			new App.Events.Result(`Sissy slave ${girl}s don't need to climax to serve`, serve),
			(eventSlave.prostate !== 0 && canDoAnal(eventSlave))
				? new App.Events.Result(`Prostate stimulation ought to do the trick`, prostate, eventSlave.anus === 0 && canDoAnal(eventSlave) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
		]);

		function vasodilators() {
			eventSlave.devotion -= 5;
			return `You give ${him} a shot and send ${him} on ${his} way. Within a few minutes it gives ${him} a raging hard-on that lasts for hours. ${He} spends every spare moment masturbating furiously. Of course, this is a temporary solution, and will just make the eventual return of ${his} problem more disappointing. ${He} is bitterly frustrated.`;
		}

		function serve() {
			r = [];
			r.push(`You explain patiently that ${he} needs to stop focusing on getting off. ${He}'s a sex slave, and what matters is that ${he} pleasures others. If ${he} doesn't climax ${himself}, that's unfortunate but not really significant. ${He} looks terribly forlorn, so to drive home the point you push ${him} down to the floor, give ${him} a rough facefuck, and send ${him} away with tousled hair,`);
			if (V.PC.dick === 0) {
				r.push(`a tired tongue,`);
			} else {
				r.push(`a mouthful of ejaculate,`);
			}
			r.push(`and the same limp dick as before. <span class="devotion dec">It's frustrating for ${him}.</span>`);
			eventSlave.devotion -= 2;
			if (eventSlave.clitSetting !== eventSlave.fetish) {
				r.push(`But, ${he} slowly <span class="fetish gain">accepts ${his} new role as a submissive little sex toy.</span>`);
				eventSlave.fetishStrength = 65;
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				eventSlave.fetish = "submissive";
			}
			seX(eventSlave, "oral", V.PC, "penetrative");
			return r;
		}

		function prostate() {
			r = [];
			r.push(`You explain that ${he} will have to find a new way to climax to be a happy little shemale slut. As you do, you push ${him} against a wall and force ${him} up on tiptoe so that ${his} butt is conveniently positioned, and then ram`);
			if (V.PC.dick === 0) {
				r.push(`a vibrating strap-on`);
			} else {
				r.push(`yourself`);
			}
			r.push(`up ${his} ass. ${He} squeals and dances against the wall on tiptoe, impaled on your`);
			if (V.PC.dick === 0) {
				r.push(`fake cock.`);
			} else {
				r.push(`member.`);
			}
			r.push(`${He} doesn't climax to anal then, or the next time you assfuck ${him}, or the time after that; but some time later a long buttsex session ends when ${he} gives a little shake and a whimper and dribbles a pathetic squirt of cum from ${his} still-limp dick. By the end of the week ${he}'s smiling trustingly and offering you ${his} butt every chance ${he} gets.`);
			r.push(VCheck.Anal(eventSlave, 10));
			eventSlave.trust += 4;
			if (eventSlave.clitSetting !== eventSlave.fetish) {
				r.push(`<span class="fetish gain">${He}'s become a confirmed anal addict.</span>`);
				eventSlave.fetishStrength = 65;
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				eventSlave.fetish = "buttslut";
			}
			return r;
		}
	}
};