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,
				canHear,
				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`);
			if (canTaste(eventSlave)) {
				r.push(`tasty`);
			} else {
				r.push(`fancy`);
			}
			r.push(`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: Fekenol/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.RESSGorging = class RESSGorging extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canMove,
				canTalk,
				canHear,
				canTaste,
				s => s.trust >= -95,
				s => s.devotion < 70,
				s => s.behavioralFlaw === "gluttonous",
				s => s.belly <= 1000
			]
		];
	}

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

		eventSlave.inflation = 1;
		eventSlave.inflationMethod = 1;
		eventSlave.inflationType = "food";
		SetBellySize(eventSlave);

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`As night falls on ${home.name}, you find yourself unable to fall asleep and instead decide to stroll around the Penthouse to collect your thoughts. The arcology is always buzzing with life, especially at night, but as you close in on the kitchens, an unusual gulping sound punctuated with occasional moans drowns it out. Unsurprisingly, you see the gluttonous`,
			contextualIntro(V.PC, eventSlave, true), `guzzling down as much of the liquid slave food as ${he} possibly can. You ask ${V.assistant.name} just how ${he} has managed to get the dispenser to keep pumping out food despite the limits on serving sizes that the system is supposed to track.`
		);

		if (V.assistant.personality === 1) {
			r.push(`"There's been issues with that feeder for the past week, I just haven't been able to get the proper technicians here to look at it.", ${heA} explains. "It still works, so disabling it entirely seemed unnecessary.`);
		} else {
			r.push(`"That feeder has been malfunctioning for the last two days, and the proper technician has not yet arrived to service it.", ${heA} states. "As it still serves its purpose at meal time, disabling it was deemed inefficient.`);
		}
		r.push(`As ${V.assistant.name} continues about ${hisA} oversight, you direct your attention back towards the source of the loud noises filling the cafeteria and echoing out into the halls.`);

		App.Events.addParagraph(node, r);
		r = [];

		r.push(``);
		if (V.cockFeeder === 1) {
			r.push(`${eventSlave.slaveName} is kneeling on the floor, passionately working the phallic dispenser. ${His} ${eventSlave.lips > 50 ? "plush" : ""} lips are wrapped around the rod, producing loud slurping sounds as ${he} aggressively sucks it while rubbing ${his} growing belly.`);
		} else {
			r.push(`${eventSlave.slaveName} is kneeling on a chair, ${his} ${eventSlave.lips > 50 ? "plush" : ""} lips wrapped tightly around the nozzle of the food dispenser. ${He} sucks at it aggressively while rubbing ${his} growing belly.`);
		}

		r.push(`A loud moan escapes ${him}, and you take that as your cue to approach ${him}. ${He} is so engrossed in stuffing ${himself} that ${he} doesn't ${canSee(eventSlave) ? `notice your presence` : `hear you approaching`} until you are forced to catch yourself after slipping on the puddle of overflowed food and sweat forming around ${him}, whereupon ${he} suddenly turns to face you, cheeks bulging with food${eventSlave.trust < 20 ? ` and fear flashing across ${his} face.` : `.`}`);

		if (eventSlave.devotion < -20 && eventSlave.trust > 20){
			if (eventSlave.trust > 95) {
				r.push(`${He} pauses to throw you a grin, doubting your willingness to stop ${him}, and returns to sucking down as much of the slave food as ${his} stomach can hold.`);
			} else if (eventSlave.trust > 50) {
				r.push(`${His} eyes meet yours, but ${he} doesn't cease ${his} feasting; ${he}'s comfortable, still has room for more, and quite certain you won't stop ${him}.`);
			} else {
				r.push(`${His} eyes meet yours, but ${he} doesn't cease ${his} feasting; ${he} is determined to test your limits by gorging ${himself} as much as possible before ${he} is inevitably removed from the feeder.`);
			}
		} else if (eventSlave.trust < -50) {
			r.push(`${He} attempts to get up quickly, terror clouding ${his} face. However, ${his} cumbersome belly hinders ${his} movements and in ${his} haste, ${he} slips in the puddle of slave food. ${He} quickly prostrates ${himself} in front of you, begging for your forgiveness.`);
		} else if (eventSlave.devotion > 50){
			r.push(Spoken(eventSlave, `${Master}! I was just so ${slave.energy > 80 ? "horny" : "hungry"}, I don't know what came over me. I just needed to feel my belly growing..."`), ` ${he} ${eventSlave.trust > 50 ? "" : "nervously"} explains while continuing to tease ${his} bloated form. ${He} must have been in the cafeteria for a while already, as ${his} swollen belly sloshes slightly as ${he} speaks.`);
		} else if (eventSlave.devotion > 20){
			r.push(Spoken(eventSlave, `${Master}! I don't know what came over me!`), ` ${he} ${eventSlave.trust > 50 ? "" : "nervously"} exclaims while continuing to massage ${his} bloated form, waiting to see how you will react. ${He} must have been in the cafeteria for a while already, as ${his} swollen belly sloshes slightly as ${he} speaks.`);
		} else {
			r.push(`${He} attempts to get up quickly, fear clouding ${his} face, but stumbles under ${his} weight. With ${his} cumbersome belly hindering ${his} movement, ${he} is forced to awkwardly prop ${himself} against the feeder to keep ${himself} upright.`);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Force-feed ${him} to orgasm`, orgasm),
			((canDoAnal(eventSlave) || canDoVaginal(eventSlave)) && eventSlave.devotion < -20 && eventSlave.trust > 20)
				? new App.Events.Result(`Spitroast ${him} with the machine`, fuck, fuckNote())
				: new App.Events.Result(),
			new App.Events.Result(`Punish ${him} for ${his} gluttony`, punish),
			new App.Events.Result(`Ignore ${him} and go back to sleep`, ignore)
		]);

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

		function orgasm() {
			r = [];
			r.push(`You grab a length of bondage rope from the supply closet; if ${he} wants to see ${his} belly grow, then ${he} needs to do it properly.`);
			if (eventSlave.devotion < -20 && eventSlave.trust > 20) {
				r.push(`${eventSlave.slaveName}, sensing no danger, goes back to eating, only stopping to glare at you as you immobilize ${him}, but calms down again as the liquid food starts flowing `);
			} else {
				r.push(`${eventSlave.slaveName} looks at you, eyes wide open, as you immobilize ${him} and resume the flow of liquid food back`);
			}
			r.push(`into ${his} gut. You caress the distending bulge as ${he} moans into the feeder ${V.cockFeeder === 1 ? `planted deep inside ${his} throat.` : `pinned firmly to ${his} face.`}`);
			if (eventSlave.boobs > 15000) {
				r.push(`${His} tits jiggle in ${his} lap`);
			} else if (eventSlave.boobs >= 3000) {
				r.push(`${His} tits wobble up and down`);
			} else if (eventSlave.boobs >= 300) {
				r.push(`${His} breasts bob up and down`);
			} else {
				r.push(`${His} chest heaves`);
			}

			r.push(`as ${he} struggles to breath through ${his} nose as the food continues to pour down ${his} throat. The slight swell to ${his} belly that greeted you when you walked into the cafeteria balloons forwards, churning and gurgling as serving after serving of food is pumped into the stretched organ. As the feeding system alerts you that nearly two gallons of food has been forced into ${eventSlave.slaveName}, ${his} ${canSee(eventSlave) ? "eyes roll back" : "head whips back"} towards the ceiling`);
			if (eventSlave.vagina >= 0) {
				r.push(`and vaginal fluids`);
				if (eventSlave.dick > 0) {
					r.push(`and cum`);
				}
				r.push(`spill into the mixture beneath ${him}.`);
			} else if (eventSlave.dick > 0) {
				r.push(`and ${his} cum mixes with the spilt food on the ground.`);
			} else {
				r.push(`as ${he} shudders in climax.`);
			}

			if (eventSlave.devotion < -20 && eventSlave.trust > 20){
				r.push(`${He} gestures for you to keep going; ${his} belly may be drum-taut, but ${he} is still hungry for more.`);
			} else if (eventSlave.trust < -50) {
				r.push(`${He} starts to thrash against the restraints binding ${him} to the chair as ${his} stomach reaches capacity; the surface of ${his} food-stuffed belly having grown painfully taut.`);
			} else if (eventSlave.devotion > 50){
				if (eventSlave.trust > 50) {
					r.push(`${He} moans out for even more food to fill ${himself} with and playfully bounces in ${his} chair, eliciting angry noises from ${his} strained stomach. ${He} trusts in ${his} ${Master} enough to let you do as you please, even as ${his} belly ripens and becomes taut with food.`);
				} else {
					r.push(`${He} starts to moan as ${his} stomach reaches capacity; the surface of ${his} food-stuffed belly having grown pleasurably taut.`);
				}
			} else if (eventSlave.devotion > 20){
				r.push(`${He} sits patiently as ${his} stomach reaches capacity; the surface of ${his} food-stuffed belly growing taut.`);
			} else if (eventSlave.trust < 20 && eventSlave.devotion > -20){
				r.push(`${He} whimpers as ${his} stomach reaches capacity; the surface of ${his} food-stuffed belly growing painfully taut.`);
			} else {
				r.push(`${He} groans in discomfort as ${his} stomach reaches capacity; the surface of ${his} food-stuffed belly growing painfully taut.`);
			}

			r.push(`Your acceptance of ${his} gluttony reflects in ${his} <span class = "trust inc">willingness to trust you.</span>`);
			if ((eventSlave.devotion >= -20 && eventSlave.trust <= 20) || (eventSlave.trust >= -50)) {
				r.push(`Being forced to experience such a mindblowing orgasm by your ministrations <span class = "devotion inc">draws ${him} closer to you,</span> even if ${he}'ll be a little sore in the morning.`);
				eventSlave.devotion += 2;
			}
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`${He} ${canSee(eventSlave) ? "glances down at" : "runs a hand over"} his glutted belly, imagining how people will admire the constantly expanding figure you're giving ${him}.`);
				eventSlave.devotion += 2;
			} else if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
				r.push(`However, ${he} quickly realizes what ${he} has done to ${his} body, and the bliss on ${his} face is quickly replaced by disdain as ${he} rationalizes that it's your fault that society will now judge ${him} over ${his} bloated figure.`);
				eventSlave.devotion -= 5;
			}
			eventSlave.trust += 5;

			eventSlave.inflation = 3;
			SetBellySize(eventSlave);
			App.Events.refreshEventArt(eventSlave);
			return r;
		}

		function fuck() {
			r = [];
			r.push(`If ${eventSlave.slaveName} wishes to ignore you and focus on the shaft filling ${his} throat, then you'll just take ${his} wiggling rump up on the offer and fill ${his} rear end too. ${His} squeels of protest quickly dissolve into moans of pleasure as`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0) {
					r.push(`${his} <span class = "virginity loss">virgin pussy becomes accustomed to ${his} ${getWrittenTitle(eventSlave)}'s rod,</span> all while being kept`);
					eventSlave.vagina++;
				} else {
					r.push(`you pound ${him} with enough force to keep ${him}`);
				}
			} else {
				if (eventSlave.anus === 0) {
					r.push(`${his} <span class = "virginity loss">virgin asshole becomes accustomed to ${his} ${getWrittenTitle(eventSlave)}'s rod,</span> all while being kept`);
					eventSlave.anus++;
				} else {
					r.push(`you pound ${his} ass with enough force to keep ${him}`);
				}
			}
			r.push(`pinned against the feeder. You reach down and steady the distending bulge in an effort to keep ${him} from toppling under the increasing wobbling of ${his} body under your thrusts. The slight swell to ${his} belly that greeted you when you walked into the cafeteria balloons forwards, churning and gurgling as serving after serving of food is pumped into the stretched organ. As the feeding system alerts you that nearly two gallons of food has been forced into ${eventSlave.slaveName}, you feel`);
			if (canDoVaginal(eventSlave)) {
				r.push(`${him} clench down`);
			} else {
				r.push(`${his} anus clench`);
			}
			r.push(`in orgasm before passing out onto ${his} drum-taut stomach in the mixture of food and sexual fluids amassed beneath you.`);

			r.push(`${eventSlave.slaveName} awakes and struggles to push ${himself} upright, weighed down by so much food, only to knock a mop to the floor. ${He} groans at the mess ${he} has to clean up, but ${his} defiance has been tempered slightly by you showing ${him} ${his} proper place in the penthouse hierarchy.`);

			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`${He} ${canSee(eventSlave) ? "glances down at" : "runs a hand over"} his glutted belly, understanding that you only let ${him} keep eating because this is how you want ${him} to look.`);
				eventSlave.devotion += 2;
			} else if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
				r.push(`However, ${he} quickly realizes what ${he} has done to ${his} body, and whatever submission to you ${he} developed is quickly replaced by newfound hate as ${he} rationalizes that it's your fault that society will now judge ${him} over ${his} bloated figure.`);
				eventSlave.devotion -= 7;
			}

			eventSlave.devotion += 5;
			if (canDoVaginal(eventSlave)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			eventSlave.inflation = 3;
			SetBellySize(eventSlave);
			App.Events.refreshEventArt(eventSlave);
			return r;
		}

		function punish() {
			r = [];
			r.push(`You can't have your slaves being disobedient, gluttonous`);
			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`hogs, even if your society has adopted a decadent lifestyle that encourages it.`);
			} else if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
				r.push(`hogs, especially when your slaves are ruining their bodies in the process.`);
			} else {
				r.push(`hogs and this is the perfect time to fix it.`);
			}
			r.push(`You force ${him} to orally service you until lockjaw sets in and tears are streaming down ${his} face from the <span class = "health dec">exhaustion and discomfort.</span>`);
			if (V.PC.dick > 0 || V.PC.vagina >= 0) {
				r.push(`Each time you cum into ${his} mouth, you force ${him} to spit it out;`);
				if (V.PC.vagina >= 0) {
					seX(eventSlave, "oral", V.PC, "vaginal", 5);
				} else {
					seX(eventSlave, "oral", V.PC, "penetrative", 5);
				}
				seX(eventSlave, "oral", V.PC, "penetrative", 5);
			} else {
				r.push(`You fuck ${his} mouth hard, going as far as forcing ${him} to deepthroat your large strap-on with no breaks;`);
				seX(eventSlave, "oral", V.PC, "penetrative", 10);
			}
			r.push(`${he} will be <span class = "devotion dec">deriving no pleasure from this experience.</span>`);
			if (eventSlave.diet === "fattening" || eventSlave.weight > 30) {
				r.push(`As further punishment, you instruct ${V.assistant.name} to <span class = "noteworthy">immediately place ${him} on a diet</span> to put an end to ${his} habit.`);
				eventSlave.diet = "restricted";
			}
			r.push(`During mealtimes, you notice ${eventSlave.slaveName} making sure to closely follow the rules, so it would seem your <span class = "trust dec">lesson has stuck</span> with ${him}.`);
			eventSlave.trust -= 5;
			eventSlave.devotion -= 2;
			healthDamage(eventSlave, 3);
			deflate(eventSlave);
			return r;
		}

		function ignore() {
			r = [];
			r.push(`You have seen enough and don't have the time, nor the energy to deal with this, so you return to bed. You manage to wake up early the next day and make some extra profits with your heightened productivity, but your good spirits are soured that evening when you see ${eventSlave.slaveName} ${canWalk(eventSlave) ? `waddle past your office door with ${his} taut, food-bloated belly leading the way` : `scrape past your office door with ${his} taut, food-bloated belly dragging along beneath ${him}`}.`);

			if (V.arcologies[0].FSHedonisticDecadence !== "unset") {
				r.push(`A smile lights up ${his} face as ${he} delights in the knowledge that ${he} has been given free reign to gorge ${himself}, and that ${his} gluttony will only make ${him} more popular in your indulgent society. ${eventSlave.slaveName} delights in how ${his} hugely distended gut is admired as ${he} goes about ${his} duties. ${He} had quite the good day today and is headed off to the kitchen to make tomorrow a good one as well.`);
				if (eventSlave.devotion > 50 && canSee(eventSlave) && canWalk(eventSlave)) {
					r.push(`As ${eventSlave.slaveName} walks past the open door, ${he} catches you admiring ${his} turgid form. Striking a pose, ${he} ${hasBothArms(eventSlave) ? `locks ${his} hands under his belly and shakes it,` : `bounces on ${his} heels,`} winking at you as a cacophony of sloshing radiates out from ${his} food-filled gut.`);
				}
				eventSlave.devotion += 2;
				eventSlave.trust += 7;
			} else if (V.arcologies[0].FSSlimnessEnthusiast !== "unset") {
				r.push(`A worried look crosses ${his} features as ${he} senses the disdain and disgust levied towards ${his} direction, both from yourself and the slaves currently servicing you. ${He} scampers away quickly, eager to escape your presence; ${he}'s had plenty of torment thrown ${his} way today already, and so ${he} will spend the night eating away ${his} sorrows.`);
				eventSlave.devotion -= 5;
				eventSlave.trust -= 5;
			} else {
				if (eventSlave.devotion < -20) {
					r.push(`A sly grin lights up ${his} face as ${he} delights in the knowledge that ${he} has gotten away with gorging ${himself}, and that ${his} gluttony will go unpunished for now. ${He} hums to ${himself} as ${he} heads to the kitchen to top ${himself} off.`);
				} else {
					r.push(`A smile adorns ${his} face as ${he} makes ${his} way to the kitchen to <span class = "trust inc">enjoy another night</span> of stuffing ${himself} silly.`);
				}
				eventSlave.trust += 15;
			}

			eventSlave.inflation = 3;
			SetBellySize(eventSlave);
			App.Events.refreshEventArt(eventSlave);
			return r;
		}
	}
};


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="fetish 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;
		}
	}
};