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

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

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`Your slaves are required to take very good care of themselves, and your best ones spend several hours a day maintaining every ${inch} of their bodies. You notice`,
			contextualIntro(V.PC, eventSlave, true),
			`standing naked in front of a mirror outside the bathroom, carefully applying moisturizing lotion to every ${inch} of ${his} ${eventSlave.skin} skin. ${He}'s clearly feeling well, and ${his}`
		);
		if (eventSlave.face > 95) {
			r.push(`gorgeous`);
		} else if (eventSlave.face <= 40) {
			r.push(`attractive`);
		} else if (eventSlave.face <= 10) {
			r.push(`pretty`);
		} else if (eventSlave.face < -10) {
			r.push(`plain`);
		} else {
			r.push(`homely`);
		}
		r.push(`face bears a smile of simple enjoyment as ${he} basks in the warmth of the slave quarters, calibrated to make nudity comfortable. ${He} straightens ${his}`);
		if (eventSlave.height >= 185) {
			r.push(`wonderfully long`);
		} else if (eventSlave.height >= 170) {
			r.push(`long`);
		} else if (eventSlave.height >= 160) {
			r.push(`nice`);
		} else if (eventSlave.height >= 150) {
			r.push(`short`);
		} else {
			r.push(`short little`);
		}
		r.push(`legs and bends at the waist,`);
		if (eventSlave.belly >= 600000) {
			r.push(`${his} ${belly} belly coming to rest on the floor as ${he} spreads ${his} legs around it,`);
		} else if (eventSlave.belly >= 400000) {
			r.push(`${his} ${belly} belly forcing ${him} to really spread ${his} legs,`);
		} else if (eventSlave.belly >= 100000) {
			r.push(`${his} ${belly} belly forcing ${his} legs wide as ${he} goes,`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`hugely gravid`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`${belly} protruding`);
			} else {
				r.push(`heavy,`);
				r.push(`${eventSlave.inflationType}-filled`);
			}
			r.push(`belly parting ${his} legs as ${he} goes,`);
		} else if (eventSlave.belly >= 5000) {
			r.push(`${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`gravid`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`protruding`);
			} else {
				r.push(`sloshing`);
			}
			r.push(`belly parting ${his} legs as ${he} goes,`);
		}
		r.push(`moaning at the pleasurable feeling of a good stretch. ${He} sets the lotion bottle on the ground next to ${him}, dispenses a little, and carefully rubs it into the tops of ${his} feet. When ${he} reaches ${his} ankles, still bent almost double, ${he}`);
		if (canSee(eventSlave)) {
			r.push(`catches sight of you watching ${him} from between ${his} legs.`);
		} else if (canHear(eventSlave)) {
			r.push(`picks up the sound of your breathing.`);
		} else {
			r.push(`realizes that you're there watching ${him}.`);
		}
		r.push(`${He} smiles at you and keeps working.`);
		r.toParagraph();
		r.push(`${He} shifts ${his}`);
		if (eventSlave.hips > 2) {
			r.push(`broodmother`);
		} else if (eventSlave.hips > 1) {
			r.push(`broad`);
		} else if (eventSlave.hips >= 0) {
			r.push(`curvy`);
		} else {
			r.push(`trim`);
		}
		r.push(`hips innocently and moves up to ${his} lower legs. But then, as ${he} slowly massages the lotion into ${his}`);
		if (eventSlave.muscles > 30) {
			r.push(`muscled`);
		} else if (eventSlave.weight > 10) {
			r.push(`plush`);
		} else {
			r.push(`cute`);
		}
		r.push(`calves, ${he} arches ${his} back and cocks ${his} hips a little. This causes`);
		if (eventSlave.chastityPenis === 1) {
			r.push(`the bottom of ${his} chastity cage to become visible, a reminder that`);
			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
				r.push(`only ${his} holes are to be used.`);
			} else if (canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
				r.push(`${he}'s a butthole slave.`);
			} else if (canDoVaginal(eventSlave)) {
				r.push(`the focus is ${his} pussy, not dick.`);
			} else {
				r.push(`with ${his} ass in chastity, ${he}'s forbidden from release.`);
			}
		} else if (eventSlave.belly >= 100000) {
			r.push(`the underside of ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnancy`);
			} else {
				r.push(`belly`);
			}
			r.push(`and`);
			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
				r.push(`${his} flushed, glistening pussy and`);
				if (eventSlave.anus === 0) {
					r.push(`virgin`);
				} else {
					r.push(`hungry`);
				}
				r.push(`anus to become visible.`);
			} else if (canDoVaginal(eventSlave)) {
				r.push(`${his} flushed pussy to become visible, glistening with moisture.`);
			} else {
				r.push(`${his}`);
				if (eventSlave.anus === 0) {
					r.push(`virgin`);
				} else {
					r.push(`hungry`);
				}
				r.push(`anus to become visible.`);
			}
		} else if (eventSlave.belly >= 5000) {
			r.push(`the underside of ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnancy`);
			} else {
				r.push(`belly`);
			}
			r.push(`and`);
			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
				r.push(`${his} flushed, glistening pussy and`);
				if (eventSlave.anus === 0) {
					r.push(`virgin`);
				} else {
					r.push(`hungry`);
				}
				r.push(`anus to become visible, before ${he} hugs ${his} thighs together, sighing as ${he} flexes them a little to put gentle pressure on ${his} womanhood.`);
			} else if (canDoVaginal(eventSlave)) {
				r.push(`${his} flushed pussy to appear for a moment, glistening with moisture, before ${he} hugs ${his} thighs together, sighing as ${he} flexes them a little to put gentle pressure on ${his} womanhood.`);
			} else {
				r.push(`${his}`);
				if (eventSlave.anus === 0) {
					r.push(`virgin`);
				} else {
					r.push(`hungry`);
				}
				r.push(`anus to become visible.`);
			}
		} else if (!canAchieveErection(eventSlave) && eventSlave.dick > 10) {
			r.push(`${his} giant, soft dick to swing back between ${his} legs; ${he} hugs ${his} thighs together again and traps it back behind ${him}, enjoying the sensation along its length.`);
		} else if (!canAchieveErection(eventSlave) && eventSlave.dick > 0) {
			r.push(`${his} thighs to come tightly together, hiding ${his} soft dick.`);
		} else if (eventSlave.dick > 0) {
			r.push(`${his} stiff dick to swing back between ${his} legs; ${he} hugs ${his} thighs together again and traps it back behind ${him}, showing off how hard ${he} is.`);
		} else if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
			r.push(`${his} flushed, glistening pussy and`);
			if (eventSlave.anus === 0) {
				r.push(`virgin`);
			} else {
				r.push(`hungry`);
			}
			r.push(`anus to become visible, before ${he} hugs ${his} thighs together, sighing as ${he} flexes them a little to put gentle pressure on ${his} womanhood.`);
		} else if (canDoVaginal(eventSlave)) {
			r.push(`${his} flushed pussy to appear for a moment, glistening with moisture, before ${he} hugs ${his} thighs together, sighing as ${he} flexes them a little to put gentle pressure on ${his} womanhood.`);
		} else {
			r.push(`it to become apparent that ${his} hungry asspussy serves as ${his} only genitalia.`);
		}
		r.push(`With ${his} back arched and ${his} thighs together ${his}`);
		if (eventSlave.butt > 5) {
			r.push(`massive buttocks part a little, showing a hint of`);
		} else if (eventSlave.butt > 2) {
			r.push(`big buttocks part, revealing`);
		} else {
			r.push(`cute buttocks are spread wide apart, displaying`);
		}
		r.push(`${his}`);
		if (eventSlave.anus > 2) {
			r.push(`lewd anal slit.`);
		} else if (eventSlave.anus === 2) {
			r.push(`big butthole.`);
		} else {
			r.push(`tight anus.`);
		}
		if (canSee(eventSlave)) {
			if (eventSlave.belly >= 50000) {
				r.push(`${His} ${belly} stomach is far too large to see around, but given ${his} held pose, ${he}'s waiting to see what you do.`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`${He} peeks around the edge of ${his} belly, checking your crotch to see if you are watching.`);
			} else {
				r.push(`${He} peeks between ${his} legs again, checking to see if you're watching.`);
			}
		} else if (canHear(eventSlave)) {
			r.push(`${His} ears perk up, listening to see if you are still there.`);
		} else {
			r.push(`${He} stays as still as ${he} can, clearly waiting for you to make a move.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Apply lotion liberally`, liberally),
			canDoAnal(eventSlave)
				? new App.Events.Result(`Fist ${his} ass`, ass)
				: new App.Events.Result(),
			(eventSlave.vagina > 0 && canDoVaginal(eventSlave))
				? new App.Events.Result(`Fist ${his} pussy`, pussy)
				: new App.Events.Result(),
		]);

		function liberally() {
			const r = new SpacedTextAccumulator();
			r.push(`You reach down to take ${his} hands, and pull ${him} up to stand in front of you before crushing ${him} in a frankly sexual embrace. Taking charge of the lotion, you apply it to your hands and start with ${his} face. ${He} submits to your close attention, even closing ${his} eyes so you can get ${his} eyelids, only a slight quickening of breath betraying ${his} intensity of feeling at having you do this. You take your time, which turns into exquisite sexual torture when you finally reach ${his}`);
			if (eventSlave.boobs > 2000) {
				r.push(`incredible breasts, which stand out so far in front of ${him} that you have to reach around their mass rather inelegantly.`);
			} else if (eventSlave.boobs > 800) {
				r.push(`heavy breasts.`);
			} else {
				r.push(`lovely chest.`);
			}
			r.push(`When your warm, moist hands`);
			if (eventSlave.nipples !== "fuckable") {
				r.push(`rub`);
			} else {
				r.push(`slip into`);
			}
			r.push(`${his}`);
			if (eventSlave.lactation > 0) {
				r.push(`milky`);
			}
			r.push(`nipples, ${he} cannot suppress a moan. You take pity, take ${his} hands, guide them to the lotion bottle, and coat them generously. Then, you place ${his} hands in yours and move them to between ${his} legs, manipulating them like a music teacher guiding a pupil's hands on an instrument, guiding ${him} in gentle masturbation. You go back to applying lotion to the rest of ${his} body, enjoying the slave's intense pleasure. When you've covered every ${inch} of ${him}, you hug ${him} close, returning your hands to ${his} nipples`);
			if (V.PC.dick !== 0) {
				r.push(`and pushing your rock-hard prick in between ${his} well-lubricated thighs`);
				if (V.PC.vagina !== -1) {
					r.addToLast(`,`);
				}
			}
			if (V.PC.vagina !== -1) {
				r.push(`after guiding one of ${hers} around behind ${him} to see to your pussy`);
			}
			r.addToLast(`. ${He} quickens ${his} pace`);
			if (canSee(eventSlave)) {
				r.push(`and raises ${his} gaze to the mirror, seeing ${his} magnificently nude, ${eventSlave.skin} skin flushed with arousal`);
			} else {
				r.addToLast(`, feeling ${his} magnificently nude, ${eventSlave.skin} skin flush with arousal`);
			}
			r.push(`as ${his}`);
			if (eventSlave.chastityPenis === 1) {
				if (canDoAnal(eventSlave)) {
					r.push(`eager fingering of ${his} anus turn frantic.`);
				} else {
					r.push(`frantic taint rubbing starts to pay off.`);
				}
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`frantic rubbing starts to produce lewd noises.`);
			} else if (eventSlave.dick > 0) {
				r.push(`jacking off starts to produce lewd noises.`);
			} else if (canDoVaginal(eventSlave) || canDoAnal(eventSlave)) {
				r.push(`index and middle fingers slip inside ${himself}.`);
			} else {
				r.push(`frantic taint rubbing starts to pay off.`);
			}
			r.push(`${He} gasps your name with ${his} orgasm, and then turns and <span class="trust inc">thanks you</span> prettily.`);
			eventSlave.trust += 5;
			r.toParagraph();
			return r.container();
		}

		function ass() {
			const r = new SpacedTextAccumulator();
			r.push(`You tell ${him} to`);
			if (hasBothLegs(eventSlave)) {
				r.push(`grab ${his} ankles.`);
			} else {
				r.push(`bend over.`);
			}
			r.push(`${He} giggles and`);
			if (eventSlave.belly >= 5000) {
				r.push(`carefully`);
			}
			r.push(`complies`);
			if (eventSlave.belly >= 120000) {
				r.push(`to the best of ${his} ability`);
			}
			r.addToLast(`, relaxing ${his}`);
			if (eventSlave.anus > 2) {
				r.push(`asspussy`);
			} else if (eventSlave.anus === 2) {
				r.push(`asshole`);
			} else {
				r.push(`little ass`);
			}
			r.push(`in the expectation of`);
			if (V.PC.dick !== 0) {
				r.push(`your cock,`);
			} else {
				r.push(`a strap-on,`);
			}
			r.push(`but starts with surprise when ${he} feels two warm, lubricated fingers slide into ${his} rectum.`);
			if (eventSlave.anus > 2) {
				r.push(`${He} moans when you add a third, and grunts when you insert a fourth. When ${he} feels you form your hand into a point, thumb included, ${he} understands what's coming and relaxes completely. The wide part of your hand, at the knuckles, squeezes into ${him} without much trouble, and ${he} lets out a huge sigh. When you start to fuck ${him}, though, ${he} collapses to ${his} knees,`);
				if (eventSlave.fetish === "buttslut") {
					if (!canTalk(eventSlave)) {
						r.push(`whining and begging nonverbally`);
					} else {
						r.push(
							`panting,`,
							Spoken(eventSlave, `"Please, fist my hole without mercy, ${Master}!"`)
						);
					}
				} else {
					r.push(`whining and begging nonverbally.`);
				}
				r.push(`You kick the lotion towards ${his} hand; ${he} gets the message and starts to frantically`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`rub ${his} taint.`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rub ${himself}.`);
				} else if (eventSlave.dick > 0) {
					r.push(`jerk off.`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`jill off.`);
				} else {
					r.push(`rub ${his} taint.`);
				}
				r.push(`${He} manages to climax promptly, ${his} overstimulated sphincter helping, no doubt. ${He} slumps to the ground when you withdraw your hand, gasping, but you haul ${him} around so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.addToLast(`. ${He} complies submissively, drooling and groaning, all pretense of feminine grace gone. It doesn't take long, since that was quite a lot of fun, but by the time you finish ${he}'s already masturbating again.`);
			} else if (eventSlave.anus === 2) {
				r.push(`${He} grunts when you add a third, and begins to beg when you insert a fourth. When ${he} feels you form your hand into a point, thumb included, ${he} understands what's coming and does ${his} best to relax. The wide part of your hand, at the knuckles, squeezes into ${him} after some effort on your part and squealing on ${his} part. When you withdraw it and press it back in, slowly starting to fist fuck ${his} ass, though, ${he} collapses to ${his} knees,`);
				if (eventSlave.fetish === "buttslut") {
					if (!canTalk(eventSlave)) {
						r.push(`crying`);
					} else {
						r.push(
							`sobbing,`,
							Spoken(eventSlave, `"Please, fist my hole without mercy, ${Master}!"`)
						);
					}
				} else {
					r.push(`crying.`);
				}
				r.push(`You kick the lotion towards ${his} hand; ${he} gets the message and starts to frantically`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`rub ${his} taint.`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rub ${himself}.`);
				} else if (eventSlave.dick > 0) {
					r.push(`jerk off.`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`jill off.`);
				} else {
					r.push(`rub ${his} taint.`);
				}
				r.push(`${He} manages to climax eventually. ${He} slumps to the ground when you withdraw your hand, gasping, but you haul ${his} around so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.addToLast(`. ${He} complies submissively, drooling and weeping, all pretense of feminine grace gone. It doesn't take long, since that was quite a lot of fun, but by the time you finish ${he}'s tentatively masturbating again.`);
			} else {
				r.push(`${He} squeals when you add a third, and begins to shamelessly beg for mercy when you insert a fourth. When ${he} feels you form your hand into a point, thumb included, ${he} understands what's coming and collapses to ${his} knees,`);
				if (eventSlave.fetish === "buttslut") {
					if (!canTalk(eventSlave)) {
						r.push(`begging you to be gentle`);
					} else {
						r.push(
							`sobbing,`,
							Spoken(eventSlave, `"Please, don't ruin my favorite hole, ${Master}!"`)
						);
					}
				} else {
					r.push(`begging you to be gentle.`);
				}
				r.push(`You kick the lotion towards ${his} hand; ${he} gets the message and starts to frantically`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`rub ${his} taint.`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rub ${himself}.`);
				} else if (eventSlave.dick > 0) {
					r.push(`jerk off.`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`jill off.`);
				} else {
					r.push(`rub ${his} taint.`);
				}
				r.push(`As ${he} works ${his} sphincter relaxes bit by bit, and you advance your fist up ${his} butt. ${He} screams in surprise and relief when your knuckles finally make it in, and achieves a crying orgasm shortly thereafter. ${He} slumps to the ground when you withdraw your hand, moaning incoherently, but you haul ${him} around so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.addToLast(`. ${He} complies submissively, crying quietly in confusion and disarray, all pretense of feminine grace gone. It doesn't take long, since that was quite a lot of fun, and by the time you finish ${he} hasn't yet worked up the courage to touch ${his} newly widened backdoor.`);
				eventSlave.anus += 1;
			}
			eventSlave.devotion += 5;
			r.toParagraph();
			return r.container();
		}

		function pussy() {
			const r = new SpacedTextAccumulator();
			r.push(`You slide up behind ${him} and run a possessive hand down`);
			if (eventSlave.belly >= 1500) {
				r.push(`${his} swollen midriff down`);
			}
			r.push(`to finger ${his} pussylips. ${He} compliantly cocks ${his} hips backward for you, and is surprised to find a couple of warm, lubricated fingers rather than`);
			if (V.PC.dick !== 0) {
				r.push(`your cock`);
			} else {
				r.push(`a strap-on`);
			}
			r.push(`sliding into ${his} ready cunt.`);
			if (eventSlave.vagina > 2) {
				r.push(`${He} moans when you add a third, and grunts when you insert a fourth. When ${he} feels you form your hand into a point, thumb included, ${he} understands what's coming and relaxes completely. The wide part of your hand, at the knuckles, squeezes into ${him} without much trouble, and ${he} lets out a huge sigh. When you start to fuck ${his} huge cunt with your hand, though, ${he} collapses`);
				if (eventSlave.belly >= 300000) {
					r.push(`onto ${his} ${belly} belly,`);
				} else {
					r.push(`to ${his} knees,`);
				}
				r.push(`whining and begging nonverbally. You kick the lotion towards ${his} hand; ${he} gets the message and starts to frantically`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`rub ${his} taint.`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rub ${himself}.`);
				} else if (eventSlave.dick > 0) {
					r.push(`jerk off.`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`rub ${his} clit.`);
				} else {
					r.push(`rub ${his} taint.`);
				}
				r.push(`${He} manages to climax promptly, ${his} big vagina squeezing your hand strongly. ${He} slumps to the ground when you withdraw your hand, gasping, the collapse giving you a good view into ${his} open, pink-walled channel. You haul ${his} around so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.addToLast(`. ${He} complies submissively, drooling and groaning, all pretense of feminine grace gone. It doesn't take long, since that was quite a lot of fun, but by the time you finish ${he}'s replaced your hand with ${his} own.`);
				eventSlave.devotion += 5;
			} else if (eventSlave.vagina === 2) {
				r.push(`${He} grunts when you add a third, and begins to beg when you insert a fourth. When ${he} feels you form your hand into a point, thumb included, ${he} understands what's coming and hurriedly gets down`);
				if (eventSlave.belly >= 300000) {
					r.push(`onto ${his} ${belly} belly`);
				} else {
					r.push(`on ${his} knees`);
				}
				r.push(`to present a more comfortable angle. The wide part of your hand, at the knuckles, squeezes into ${him} after some effort on your part and squealing on ${his} part. You kick the lotion towards ${his} hand; ${he} gets the message and starts to frantically`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`rub ${his} taint`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rub ${himself}`);
				} else if (eventSlave.dick > 0) {
					r.push(`jerk off`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`rub ${his} clit`);
				} else {
					r.push(`rub ${his} taint`);
				}
				r.push(`as you slowly fist fuck ${him}. ${He} manages to climax eventually. ${He} slumps to the ground when you withdraw your hand, gasping, the collapse giving you a good view into ${his} now-gaping, pink-walled channel. You haul ${him} around so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.addToLast(`. ${He} complies submissively, drooling and gasping, all pretense of feminine grace gone. It doesn't take long, since that was quite a lot of fun, but by the time you finish ${he}'s masturbating again.`);
				eventSlave.devotion += 5;
			} else {
				r.push(`${He} squeals when you add a third, and begins to shamelessly beg for mercy when you insert a fourth. When ${he} feels you form your hand into a point, thumb included, ${he} understands what's coming and collapses`);
				if (eventSlave.belly >= 300000) {
					r.push(`onto ${his} ${belly} belly,`);
				} else {
					r.push(`to ${his} knees,`);
				}
				r.push(`begging you to be gentle. You kick the lotion towards ${his} hand; ${he} gets the message and starts to frantically`);
				if (eventSlave.chastityPenis === 1) {
					r.push(`rub ${his} taint,`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rub ${himself},`);
				} else if (eventSlave.dick > 0) {
					r.push(`jerk off,`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`rub ${his} clit,`);
				} else {
					r.push(`rub ${his} taint,`);
				}
				r.push(`hoping to relax a little. As ${he} works ${his} pussy relaxes bit by bit, and you advance your fist into ${his} womanhood. ${He} screams in surprise and relief when your knuckles finally make it in, and achieves a crying orgasm shortly thereafter. ${He} slumps to the ground when you withdraw your hand, moaning incoherently, the collapse giving you a good view into ${his} now-gaping, pink-walled channel. You haul ${his} around so ${he} can`);
				if (V.PC.dick !== 0) {
					r.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`eat you out`);
				}
				r.addToLast(`. ${He} complies submissively, crying quietly with overstimulation, all pretense of feminine grace gone. It doesn't take long, since that was quite a lot of fun, but by the time you finish ${he}'s gingerly massaging ${his} newly loosened cunt.`);
				eventSlave.devotion += 5;
				eventSlave.vagina += 1;
			}
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.devotion > 60,
				s => s.trust > 20,
				s => s.physicalAge > 37,
				s => s.anus > 0,
				s => s.vagina > 0,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		App.Events.addParagraph(node, [
			`At the end of a long week,`,
			contextualIntro(V.PC, eventSlave, true),
			`moves past your office toward bed. This is completely normal part of the arcology routine, but you notice as ${he} passes that ${he}'s wearing a preoccupied, almost sad expression. You call ${him} over, and ${he} makes a visible effort to brighten up as ${he} comes before you and asks your pleasure. You ask ${him} what's the matter, and ${his} face falls.`
		]);
		r.push(Spoken(eventSlave, `"${Master}, I'm so sorry you noticed,"`));
		if (eventSlave.lips > 70) {
			r.push(`${he} lisps through ${his} dick-sucking lips.`);
		} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
			r.push(`${he} lisps through ${his} ridiculous piercings.`);
		} else {
			r.push(`${he} ${say}s penitently.`);
		}
		r.push(Spoken(eventSlave, `"I'm feeling a little stiff and tired, ${Master}. I wish I was a little younger so I could serve you better, that's all."`));

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Cheer ${him} up`, cheer)
				: new App.Events.Result(),
			new App.Events.Result(`Perform a health exam personally`, exam),
			(S.HeadGirl && V.HeadGirlID !== eventSlave.ID)
				? new App.Events.Result(`Give ${him} an afternoon off for some quality time with your Head Girl`, quality, 	`This option will cost ${cashFormat(500)}`)
				: new App.Events.Result()
		]);

		function cheer() {
			let didVaginal = false;
			let didAnal = false;
			r = [];
			r.push(`You close in on ${him}, and ${he} starts to present ${himself} with the force of long habit. However, you take ${him} by the hand and draw ${him} in close, running your fingertips along ${his} cheekbone, looking into ${his} ${App.Desc.eyesColor(eventSlave)}.`);
			if (canSee(eventSlave)) {
				r.push(`${He} only holds your gaze for a brief moment before blushing and looking down again,`);
			} else {
				r.push(`Once ${he} feels your hand stop, ${he} quickly glances down while`);
			}
			r.push(`muttering another apology. You raise ${his} chin again with a gentle hand and give ${him} a deep kiss. After a moment ${he} hugs you with almost painful`);
			if (eventSlave.belly >= 100000) {
				r.push(`fierceness, a feat given the size of ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				}
				r.push(`belly, where`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`fierceness, pushing ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				}
				r.push(`belly into yours, where`);
			} else {
				r.push(`fierceness, and`);
			}
			r.push(`you can feel a heat radiating from ${him}. ${He} makes to get down on ${his} knees to serve you again, but instead, you`);
			if (eventSlave.belly >= 300000) {
				r.push(`help ${him} up and guide`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`gently scoop ${him} up and carry`);
			} else {
				r.push(`scoop ${him} up and carry`);
			}
			r.push(`${him} to bed, laying the bemused ${girl} down before cuddling up behind ${him}. The two of you make languid love, with you`);
			if (canHear(eventSlave)) {
				r.push(`murmuring reassuringly into ${his} ear,`);
			}
			r.push(`nibbling ${his} neck, cupping ${his} breasts,`);
			if (eventSlave.belly >= 1500) {
				r.push(`rubbing ${his} distended midriff,`);
			}
			r.push(`and massaging ${his} shoulders by turns. After a lovely climax together in ${his}`);
			if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
				r.push(`pussy ${he} coquettishly shifts ${himself} to line your recovering cock up with ${his} ass,`);
				didVaginal = true;
				didAnal = true;
			} else if (canDoVaginal(eventSlave)) {
				r.push(`pussy ${he} coquettishly shifts ${himself} to face you,`);
				didVaginal = true;
			} else {
				r.push(`ass ${he} coquettishly shifts ${himself} to face you,`);
				didAnal = true;
			}
			if (canSee(eventSlave)) {
				r.push(`looking with <span class="devotion inc">adoration</span> and new <span class="trust inc">confidence</span> into your eyes.`);
			} else {
				r.push(`gazing with <span class="devotion inc">adoration</span> and new <span class="trust inc">confidence</span> at your face.`);
			}
			eventSlave.devotion += 4;
			eventSlave.trust += 4;
			if (didVaginal && didAnal) {
				r.push(VCheck.Both(eventSlave, 1));
			} else if (didVaginal) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else if (didAnal) {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function exam() {
			r = [];
			r.push(`${He} gets a weekly health exam from the automated systems, which also do their best to monitor ${his} well-being, but ${he} does not protest as you take ${him} to the surgery and give ${him} a`);
			if (V.PC.skill.medicine >= 100) {
				r.push(`professional examination. It feels good to put the old skills to use on an attractive patient.`);
			} else {
				r.push(`thorough examination.`);
			}
			r.push(
				`There's nothing the matter other than that ${he} hasn't been 18 for a long time. ${He} looks a little sad at some of the results, but whenever ${he} does, you place a hand on ${his} cheek and give ${him} a kiss. ${He} gets the idea.`,
				Spoken(eventSlave, `"I understand, ${Master}. I can still serve you,"`),
				`${he} ${say}s.`
			);
			r.push(`You adjust ${his} diet and exercise a little, which should <span class="health inc">slightly improve</span> ${his} health`);
			if (V.PC.skill.medicine >= 100) {
				r.push(r.pop() + `, and prescribe some new supplements that might help ${him} <span class="health inc">feel ${his} best</span> all the time`);
				improveCondition(eventSlave, 10);
			}
			r.push(r.pop() + `. As ${he} gets up from the chair and makes to resume ${his} duties, you give ${him} a light swat across the buttocks. ${He} squeaks and turns to giggle at you, giving you a broad wink and shaking ${his} tits a little for you.`);
			eventSlave.trust += 4;
			improveCondition(eventSlave, 10);
			return r;
		}

		function quality() {
			const {
				He2, his2, himself2
			} = getPronouns(S.HeadGirl).appendSuffix('2');
			cashX(-500, "event", eventSlave);
			improveCondition(eventSlave, 10);
			S.HeadGirl.devotion += 4;
			eventSlave.devotion += 4;
			return `${S.HeadGirl.slaveName} understands the situation immediately. ${He2} gets ${himself2} and ${eventSlave.slaveName} dressed for a nice, non-sexual 'date' in ${V.clubName}, and leads ${him} out by the hand with a wink over ${his2} shoulder to you. Your Head Girl understands just what kind of break from sexual servitude ${eventSlave.slaveName} really needs. They enjoy a nice meal, take a stroll and talk as friends, and get some inconsequential but relaxing beauty treatments together. They both enjoy the relaxation, and ${eventSlave.slaveName} feels much better after the rest, too.`;
		}
	}
};

repo_name: Banyanael/fc

license: mit


code:
App.Events.RESSDickWringing = class RESSDickWringing 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.dick > 8,
				s => s.balls > 0,
				s => s.energy > 60,
				s => s.devotion > 50,
				s => s.trust > 50,
				s => canDoAnal(s) || canDoVaginal(s),
				s => s.belly < 100000,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`You run into`,
			contextualIntro(PC, eventSlave, true),
			`in the hallway outside your office. The devoted ${SlaveTitle(eventSlave)} smiles at you as ${he} approaches. You barely notice how awkward ${his} gait is, since ${he} usually walks a little strangely. ${His} third leg tends to have that effect. But on consideration, ${he} does seem especially uncomfortable right now. The poor ${girl}'s`
		);
		if (eventSlave.scrotum === 0) {
			r.push(`internal balls`);
		} else if (eventSlave.balls < 3) {
			r.push(`girly balls`);
		} else if (eventSlave.scrotum < 4) {
			r.push(`balls, held tightly against ${his} body by ${his} taut scrotum,`);
		} else {
			r.push(`swinging balls`);
		}
		r.push(`must be in dire need of emptying.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`${He} trusts you, so ${he} approaches you as sensually as ${he} can manage and asks for your help.`);
		if (!canTalk(eventSlave)) {
			r.push(`${He} uses quick but submissive gestures to beg you to help ${him} cum, pleading the special difficulties caused by ${his} outlandish member, which ${he} can manage most comfortably if ${he} has both hands free for it.`);
		} else {
			r.push(
				Spoken(eventSlave, `"${Master}, would you please, please help me cum?"`),
				`${he} begs submissively.`,
				Spoken(eventSlave, `"It's nice if I can use both hands on it to, um, manage things."`)
			);
		}
		r.push(`${He}'s referring to the volume issue with ${his} unnaturally massive dick. The thing is so huge and so soft that`);
		if (eventSlave.balls < 3) {
			r.push(`one of ${his} (by comparison) pathetically weak ejaculations`);
		} else if (eventSlave.balls < 6) {
			r.push(`one of ${his} comparatively normal ejaculations`);
		} else {
			r.push(`a single one of even ${his} copious ejaculations`);
		}
		r.push(`often fails to make it all the way to the tip of ${his} cock, making it only partway down ${his} urethra without help.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Address ${his} problem together`, together, virginityWarning()),
			new App.Events.Result(`Use ${his} trouble to dominate ${him}`, dominate, virginityWarning()),
		]);

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

		function together() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You step in and give ${him} a quick kiss on the lips, telling ${him} you'd be happy to. ${He} was confident you would, but the tenderness makes ${his} breath catch a little. You take ${him} by ${his}`);
			if (eventSlave.weight > 130) {
				r.push(`fat`);
			} else if (eventSlave.weight > 95) {
				r.push(`chubby`);
			} else if (eventSlave.muscles > 30) {
				r.push(`strong`);
			} else if (eventSlave.shoulders < 0) {
				r.push(`pretty little`);
			} else if (eventSlave.shoulders > 1) {
				r.push(`broad`);
			} else {
				r.push(`feminine`);
			}
			r.push(`shoulders and keep kissing ${him}, steering ${him} backwards into your office. ${He} gets the idea and cooperates as best ${he} can, giggling`);
			if (eventSlave.voice === 0) {
				r.push(`mutely`);
			} else {
				r.push(`cutely`);
			}
			r.push(`into your mouth as ${his} hot and increasingly horny body bumps against your own.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`When ${his}`);
			if (eventSlave.butt > 12) {
				r.push(`monumental ass`);
			} else if (eventSlave.butt > 7) {
				r.push(`titanic ass`);
			} else if (eventSlave.butt > 4) {
				r.push(`big butt`);
			} else {
				r.push(`cute rear`);
			}
			r.push(`touches the edge of your desk, the`);
			if (eventSlave.height > 180) {
				r.push(`tall ${SlaveTitle(eventSlave)} leans back`);
			} else if (eventSlave.height > 155) {
				r.push(`${SlaveTitle(eventSlave)} reclines`);
			} else {
				r.push(`short ${SlaveTitle(eventSlave)} hops up`);
			}
			r.push(`to lie across it, using a hand to lay ${his} inhumanly big dick`);
			if (eventSlave.belly > 10000) {
				r.push(`onto ${his} ${belly}`);
				if (eventSlave.bellyPreg > 0) {
					r.push(`pregnant`);
				}
				r.push(`belly.`);
			} else if (eventSlave.weight > 160) {
				r.push(`across ${his} gut.`);
			} else if (eventSlave.boobs > 5000) {
				r.push(`in the warm canyon formed by ${his} inhumanly big boobs.`);
			} else if (eventSlave.weight > 95) {
				r.push(`across ${his} soft belly.`);
			} else if (eventSlave.belly > 1500) {
				r.push(`over ${his} ${belly}`);
				if (eventSlave.bellyPreg > 0) {
					r.push(`pregnant`);
				}
				r.push(`belly.`);
			} else if (eventSlave.muscles > 30) {
				r.push(`across ${his} ripped abs.`);
			} else if (eventSlave.weight > 10) {
				r.push(`across ${his} plush stomach.`);
			} else {
				r.push(`up ${his} stomach.`);
			}
			r.push(`${He} spreads ${his} legs as wide as they'll go, and reaches down to spread ${his} buttocks even wider, offering you ${his}`);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(`holes.`);
			} else if (canDoVaginal(eventSlave)) {
				r.push(`pussy.`);
			} else {
				r.push(`asshole.`);
			}
			r.push(`${He}`);
			if (eventSlave.voice === 0) {
				r.push(`tries to groan`);
			} else {
				r.push(`groans`);
			}
			r.push(`with anticipation of the coming relief as you slide`);
			if (PC.dick !== 0) {
				r.push(`your cock`);
			} else {
				r.push(`a strap-on`);
			}
			r.push(`past ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussylips and inside ${his} womanhood.`);
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(`sphincter and inside ${his} asspussy.`);
				r.push(VCheck.Anal(eventSlave, 1));
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`It doesn't take long. ${His}`);
			if (eventSlave.scrotum === 0) {
				r.push(`invisible but overfull balls`);
			} else {
				r.push(`balls tighten and`);
			}
			r.push(`shoot cum into ${his} soft python of a dick, but not a drop appears at its tip. Gasping at the mixed relief and discomfort, ${he} lets ${his} butt go and wriggles around to grab ${his} dick around its base with both hands. ${He} squeezes it from base to tip to bring out its contents. ${He}'s so huge that ${he}'s able to reach down with ${his} lips and get ${his} cockhead into ${his} mouth, the meat filling it entirely. ${He} sucks industriously, swallowing ${his} own load. ${He} was just trying to relieve the pressure, but the added stimulation brings ${him} to climax again. Silenced by ${his} own dickhead, ${he} shudders deliciously and starts over, wringing more cum into ${his} own mouth. You change angles, bringing the hard head of`);
			if (PC.dick !== 0) {
				r.push(`your own penis`);
			} else {
				r.push(`your phallus`);
			}
			r.push(`against ${his} prostate and forcing an agonizing third climax.`); // FIXME: actually check that slave has a prostate
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`${He}'s so discombobulated by this that ${he} goes limp, offering no resistance as you extract yourself,`);
			if (PC.dick !== 0) {
				r.push(`straddle ${his} torso, and press your dick inside ${his} mouth to climax there, adding your own ejaculate`);
			} else {
				r.push(`slip out of the harness with the ease of long practice, and straddle ${his} face so that your climax adds a good quantity of your pussyjuice`);
			}
			r.push(`to everything ${he}'s already gotten down`);
			if (PC.vagina !== -1) {
				if (PC.dick !== 0) {
					r.push(`and leaving quite a lot of your pussyjuice on ${his} chin`);
				}
			}
			r.push(r.pop() + `. When you finally release ${him}, ${he} slithers down to the floor, utterly spent.`);
			if (!canTalk(eventSlave)) {
				r.push(`${He} raises a shaky hand to <span class="trust inc">gesture thanks.</span>`);
			} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
				r.push(`"<span class="trust inc">Thank you,</span> ${Master}," ${he} lisps weakly.`);
			} else {
				r.push(`"<span class="trust inc">Thank you,</span> ${Master}," ${he} murmurs in a tiny voice.`);
			}
			eventSlave.trust += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function dominate() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You step in and trace a`);
			if (PC.title === 1) {
				r.push(`strong`);
			} else {
				r.push(`feminine`);
			}
			r.push(`hand across ${his} lips before inserting two fingers into ${his} mouth. ${He} looks puzzled, but obediently begins to suck on your fingers. You use your other hand to explore ${his} body, titillating the heavily aroused ${SlaveTitle(eventSlave)} until ${he}'s on the verge of orgasm. Without warning, you place an elastic band around the slave's dickhead. ${He} writhes with discomfort, but knows better than to protest. It's tight, but not agonizingly so. ${He}'ll be able to cum, but not a drop will get out. Grabbing ${him} by a nipple`);
			if (eventSlave.nipples === "fuckable") {
				r.push(`cunt`);
			}
			r.push(r.pop() + `, you pull ${him} down to ${his} knees, enjoying the motion of ${his} body as ${he} wriggles with the discomfort of being tugged this way, the uncomfortable thing squeezing the tip of ${his} cock, and the suspicion that this is going to be tough.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`Once ${he}'s in position, you`);
			if (eventSlave.butt > 12) {
				r.push(`struggle to wrap your arms around ${his} bountiful buttcheeks,`);
			} else if (eventSlave.butt > 7) {
				r.push(`heft ${his} ridiculous buttcheeks possessively,`);
			} else if (eventSlave.butt > 4) {
				r.push(`give ${his} huge ass a possessive squeeze,`);
			} else {
				r.push(`run your hands across ${his} bottom,`);
			}
			r.push(`and then shove`);
			if (PC.dick !== 0) {
				r.push(`your cock`);
			} else {
				r.push(`a strap-on`);
			}
			if (canDoVaginal(eventSlave)) {
				r.push(`inside ${his} cunt.`);
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(`up ${his} butt.`);
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.push(`${His} cock is so long that it drags along the floor as you pound`);
			if (eventSlave.belly >= 300000) {
				r.push(`${him} against ${his} ${belly} dome of a stomach.`);
			} else if (eventSlave.boobs > 12000) {
				r.push(`${him}, ${his} enormous tits serving as a cushion for ${his} torso to rest against.`);
			} else if (eventSlave.boobs > 7000) {
				r.push(`${him}, accompanied by the nipples that cap ${his} absurd boobs.`);
			} else {
				r.push(`${him}.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`${He}'s so pent up that ${he} reaches ${his} first climax quickly, filling ${his} capped dick with cum. ${He}`);
			if (eventSlave.voice === 0) {
				r.push(`tries to moan`);
			} else {
				r.push(`moans`);
			}
			r.push(`at the combination of relief and pressure inside ${his} dick, and then slumps a little when ${he} feels the`);
			if (PC.dick !== 0) {
				r.push(`penis`);
			} else {
				r.push(`hard phallus`);
			}
			r.push(`inside ${him} fuck ${him} even harder, forcing ${him} towards a second orgasm. And after that one, a third. And a fourth.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`When you finally climax yourself, you stand, leaving ${him} writhing at your feet with ${his} huge soft cock positively pressurized. Considering the situation, you kneel down at ${his} side, deciding what to do. Stroking ${him} in a mockery of reassurance, you grab ${his} agonized member, producing a`);
			if (eventSlave.voice === 0) {
				r.push(`gaping, silent scream.`);
			} else {
				r.push(`little shriek.`);
			}
			if (eventSlave.toyHole === "dick" && (PC.preg === 0 || PC.vagina === 0)) {
				r.push(`You maneuver the massive thing into your own`);
				if (PC.preg === 0 && PC.vagina !== -1) {
					r.push(`pussy,`);
				} else {
					r.push(`asshole,`);
				}
				r.push(`slide a finger in alongside the monstrous thing as ${he}`);
				if (eventSlave.voice === 0) {
					r.push(`moans with expectation,`);
				} else {
					r.push(`begs abjectly to unleash ${his},`);
				}
				r.push(`and pop the elastic off. You get to watch ${his} face as ${he} floods your`);
				if (PC.preg === 0 && PC.vagina !== -1) {
					r.push(`womanhood`);
				} else {
					r.push(`bowels`);
				}
				r.push(`with cum, your stomach taking on a distinctive swell as ${his} pent-up load empties into you.`);
				if (PC.vagina !== -1) {
					seX(eventSlave, "penetrative", PC, "vaginal");
				} else {
					seX(eventSlave, "penetrative", PC, "anal");
				}
				if (canImpreg(PC, eventSlave)) {
					r.push(knockMeUp(PC, 50, 0, eventSlave.ID));
				}
			} else {
				r.push(`You maneuver the massive thing inside the slave's own well-fucked`);
				if (eventSlave.vagina > -1) {
					r.push(`pussy,`);
				} else {
					r.push(`asshole,`);
				}
				r.push(`and then slide fingers in alongside the monstrous thing as ${he}`);
				if (eventSlave.voice === 0) {
					r.push(`cries desperately.`);
				} else {
					r.push(`begs abjectly for mercy.`);
				}
				r.push(`Popping the elastic off, you get to watch ${his} face as ${he} floods ${his} own`);
				if (eventSlave.vagina > -1) {
					r.push(`womanhood`);
				} else {
					r.push(`bowels`);
				}
				r.push(`with cum.`);
				if (canDoVaginal(eventSlave)) {
					seX(eventSlave, "vaginal", PC, "penetrative");
					if (canGetPregnant(eventSlave) && canBreed(eventSlave, eventSlave) && eventSlave.vasectomy !== 1) { // can't miss the opportunity to knock ${himself} up
						knockMeUp(eventSlave, 20, 0, eventSlave.ID);
					}
				} else {
					seX(eventSlave, "anal", PC, "penetrative");
				}
			}
			r.push(`The cum pressurization brought ${him} almost to half-hardness, and as this effect diminishes, ${his} dick slides out again, releasing a lewd torrent of cum. ${He} cries with overstimulation, relief, pain, and humiliation, groveling below you in utter subjugation.`);
			eventSlave.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSDickgirlPC = class RESSDickgirlPC extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.PC.dick > 0,
			() => V.PC.boobs >= 300,
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canSee,
				s => s.devotion > -20,
				s => s.devotion <= 50,
				s => (s.attrXY <= 35 && s.attrXX > 65) || (s.attrXY > 65 && s.attrXX <= 35),
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		App.Events.addParagraph(node, [
			`Having just enjoyed one of your slaves, you take a quick post-coital rinse in one of the showers scattered around the arcology for the purpose. Thus refreshed, you step out and come face to face with`,
			App.UI.DOM.combineNodes(contextualIntro(PC, eventSlave, true), ","),
			`who is going about ${his} assigned business. ${His} ${App.Desc.eyesColor(eventSlave)} lock with yours for a surprised moment, and then flick down submissively.`
		]);

		let r = [];
		r.push(`As ${his} gaze travels down your body towards the floor,`);
		if (eventSlave.attrXY <= 35) {
			r.push(`it lingers for a moment on your`);
			if (PC.boobs >= 1400) {
				r.push(`enormous`);
				if (PC.boobsImplant > 0) {
					r.push(`chest balloons`);
				} else {
					r.push(`cow tits`);
				}
			} else if (PC.boobs >= 1200) {
				r.push(`huge,`);
				if (PC.boobsImplant > 0) {
					r.push(`clearly fake`);
				} else {
					r.push(`heavy`);
				}
				r.push(`breasts`);
			} else if (PC.boobs >= 1000) {
				r.push(`big`);
				if (PC.boobsImplant > 0) {
					r.push(r.pop() + `, perky`);
				}
				r.push(`breasts`);
			} else if (PC.boobs >= 800) {
				r.push(`generous breasts`);
			} else if (PC.boobs >= 650) {
				r.push(`handfilling breasts`);
			} else if (PC.boobs >= 500) {
				r.push(`average breasts`);
			} else if (PC.boobs >= 300) {
				r.push(`small breasts`);
			}
			r.push(`before continuing to track downward. When it reaches your cock, still half-hard from the sex and the warm shower, ${he} stiffens with discomfort.`);
		} else {
			r.push(`${he} averts ${his} eyes from your`);
			if (PC.boobs >= 1400) {
				r.push(`enormous, bare`);
				if (PC.boobsImplant > 0) {
					r.push(`chest balloons`);
				} else {
					r.push(`cow tits`);
				}
			} else if (PC.boobs >= 1200) {
				r.push(`huge, bare,`);
				if (PC.boobsImplant > 0) {
					r.push(`clearly fake`);
				} else {
					r.push(`heavy`);
				}
				r.push(`breasts`);
			} else if (PC.boobs >= 1000) {
				r.push(`big, bare`);
				if (PC.boobsImplant > 0) {
					r.push(r.pop() + `, perky`);
				}
				r.push(`breasts`);
			} else if (PC.boobs >= 800) {
				r.push(`generous, bare breasts`);
			} else if (PC.boobs >= 650) {
				r.push(`handfilling, bare breasts`);
			} else if (PC.boobs >= 500) {
				r.push(`average, bare breasts`);
			} else if (PC.boobs >= 300) {
				r.push(`small, bare breasts`);
			}
			r.push(`as best ${he} can, quickly looking farther down. ${His} gaze lingers for a moment on your cock, still half-hard from the sex and the warm shower, but ${he}'s stiff with discomfort.`);
		}
		r.push(`${He} swallows uncomfortably, frozen in place and staring at the floor. ${His} eyes flick up again, stealing a glance at`);
		if (eventSlave.attrXY <= 35) {
			r.push(`your boobs and studiously avoiding your dick.`);
		} else {
			r.push(`your dick`);
			if (PC.balls >= 8) {
				r.push(`and enormous testicles, while`);
			} else {
				r.push(`and`);
			}
			r.push(`studiously avoiding your boobs.`);
		}
		if (!canTalk(eventSlave)) {
			r.push(`${He} gestures a proper greeting, hands shaking with nervousness.`);
		} else {
			r.push(
				Spoken(eventSlave, `"Um, hi, ${Master},"`),
				`${he} ${say}s nervously.`
			);
		}
		App.Events.addParagraph(node, r);
		if (eventSlave.attrKnown !== 1) {
			App.Events.addParagraph(node, [`Just like that, the existing mystery about ${his} feelings about girls and guys is <span class="lightcoral">cleared up.</span>`]);
			eventSlave.attrKnown = 1;
		}

		App.Events.addResponses(node, [
			new App.Events.Result(`Permit ${him} to serve you in a way ${he}'ll be comfortable with`, permit),
			new App.Events.Result(`Force ${him} to get off to all of you`, force, virginityWarning()),
		]);

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

		function permit() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`The poor ${girl} is having trouble with`);
			if (eventSlave.attrXY <= 35) {
				r.push(`guys, so you decide to be kind to ${him} and play up your feminine side. You lift ${his} ${eventSlave.skin} chin with a soft touch, and kiss ${him} gently on the lips, pressing your breasts full against ${his}`);
				if (eventSlave.boobs > 5000) {
					r.push(`titanic udders, which are squashed between you.`);
				} else if (eventSlave.boobs > 1000) {
					r.push(`own lovely boobs.`);
				} else {
					r.push(`chest.`);
				}
				r.push(`You keep your hips cocked back and to the side, so that your rapidly stiffening dick stays clear of ${him}. Taking ${his} hands in your own, you guide them to your`);
				if (PC.boobs >= 1400) {
					r.push(`enormous`);
					if (PC.boobsImplant !== 0) {
						r.push(`chest balloons.`);
					} else {
						r.push(`cow tits.`);
					}
				} else if (PC.boobs >= 1200) {
					r.push(`huge,`);
					if (PC.boobsImplant !== 0) {
						r.push(`clearly fake`);
					} else {
						r.push(`heavy`);
					}
					r.push(`breasts.`);
				} else if (PC.boobs >= 1000) {
					r.push(`big`);
					if (PC.boobsImplant !== 0) {
						r.push(r.pop() + `, perky`);
					}
					r.push(`breasts.`);
				} else if (PC.boobs >= 800) {
					r.push(`generous breasts.`);
				} else if (PC.boobs >= 650) {
					r.push(`handfilling breasts`);
				} else if (PC.boobs >= 500) {
					r.push(`average breasts`);
				} else if (PC.boobs >= 300) {
					r.push(`small breasts`);
				}
				App.Events.addParagraph(frag, r);
				r = [];
				r.push(`${He} hesitates, clearly surprised that you're allowing ${him} to fondle you, but building arousal is making ${him} forget ${his} awkwardness and ${he} begins to play with your boobs in earnest. You direct ${his} fingers to your nipples, and ${he} obeys the nonverbal cue, devoting more attention to the`);
				if (PC.lactation > 0) {
					r.push(`milky,`);
				} else {
					r.push(`hard,`);
				}
				r.push(`sensitive nubs. Satisfied that ${he}'s got the idea, you run your hands lightly down ${his}`);
				if (eventSlave.weight > 190) {
					r.push(`voluminous`);
				} else if (eventSlave.belly >= 5000) {
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`gravid`);
					} else if (eventSlave.bellyImplant >= 3000) {
						r.push(`rounded`);
					} else {
						r.push(`swollen`);
					}
				} else if (eventSlave.weight > 30) {
					r.push(`soft`);
				} else if (eventSlave.muscles > 30) {
					r.push(`rock hard`);
				} else if (eventSlave.weight > 10) {
					r.push(`plush`);
				} else if (eventSlave.muscles > 5) {
					r.push(`toned`);
				} else {
					r.push(`soft`);
				}
				r.push(`body and give ${his}`);
				if (eventSlave.butt > 15) {
					r.push(`obscene`);
				} else if (eventSlave.butt > 10) {
					r.push(`absurd`);
				} else if (eventSlave.butt > 6) {
					r.push(`monstrous`);
				} else if (eventSlave.butt > 3) {
					r.push(`healthy`);
				} else {
					r.push(`cute`);
				}
				r.push(`buttocks a gentle massage.`);
				App.Events.addParagraph(frag, r);
				r = [];
				r.push(`${He} has ${his} eyes closed, and is spared any indication that ${he}'s petting and being petted by a person with a cock. ${His} arousal builds quickly, and so does yours. You resolve the situation by using a hand on each of you: you finish yourself off with practiced ease while giving ${his}`);
				if (canDoVaginal(eventSlave)) {
					r.push(`clit`);
				} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`own erection`);
				} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`fat member`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`soft member`);
				} else if (eventSlave.chastityPenis === 1) {
					r.push(`nipples`);
				} else if (eventSlave.chastityVagina) {
					r.push(`nipples`);
				} else {
					r.push(`soft perineum`);
				}
				r.push(`some manual stimulation that tips ${him} over the edge. ${He} opens ${his} eyes slowly, <span class="devotion inc">grateful</span> that you were so merciful.`);
			} else if (eventSlave.attrXX <= 35) {
				r.push(`girls, so you decide to be kind to ${him} and play up your masculine side. You grab the side of ${his} neck with a rough grip, and pull ${him} downward, forcing ${him} to ${his} knees. ${He} goes willingly, ${his} field of vision filling with your rapidly hardening member.`);
				if (eventSlave.teeth === "removable") {
					r.push(`${He} quickly pulls ${his} removable teeth out, getting ready to offer you ${his} soft facepussy.`);
				} else if (eventSlave.teeth === "pointy") {
					r.push(`${He} runs ${his} tongue over ${his} frightening teeth carefully, and then opens ${his} jaws wide, getting ready to keep ${his} fangs well clear of your shaft.`);
				} else if (eventSlave.teeth === "fangs") {
					r.push(`${He} runs ${his} tongue over ${his} fangs carefully, and then opens ${his} jaws wide, getting ready to keep ${his} teeth well clear of your shaft.`);
				} else if (eventSlave.teeth === "fang") {
					r.push(`${He} gets ready to take you from an angle to avoid ${his} fang meeting your member.`);
				} else if (eventSlave.teeth === "straightening braces" || eventSlave.teeth === "cosmetic braces") {
					r.push(`${He} runs ${his} tongue over ${his} braces, and then opens wide, mindful of keeping ${his} orthodontia clear of your shaft.`);
				} else if (eventSlave.teeth === "gapped") {
					r.push(`${He} runs ${his} tongue across the gap in ${his} front teeth and opens wide.`);
				}
				r.push(`${He} takes you into ${his} mouth without hesitation, and keeps ${his} eyes closed. ${He} visibly concentrates all ${his} attention on your dick, ignoring the breasts that are starting to bounce right over ${his} head as you begin rocking your hips with enjoyment.`);
				App.Events.addParagraph(frag, r);
				App.Events.addParagraph(frag, [`You run a possessive hand through ${his} ${eventSlave.hColor} hair, and let ${him} know what a good little cocksucker ${he} is. ${He} moans submissively in response, and the humming feels so wonderful that you order ${him} to do it again. Knowing that you're being nice to ${him} by letting ${his} ignore your more feminine characteristics for the moment, ${he} does ${his} best to please you, humming as best ${he} can and using both hands to pleasure your base and balls. You blow your load down ${his} throat, and ${he} swallows it all. ${He} opens ${his} eyes slowly, relieved that you were so merciful.`]);
			}
			eventSlave.trust += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			return frag;
		}

		function force() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`The closeminded ${girl} is having trouble with`);
			if (eventSlave.attrXY <= 35) {
				r.push(`guys, so ${he} gets to spend some quality time with your dick. You walk into ${him}, running into the surprised slave, driving ${him} backward into the far wall. You kiss ${him}, pinch ${him}, and grope ${him} roughly the whole time, pressing your breasts maliciously against ${his}`);
				if (eventSlave.boobs > 5000) {
					r.push(`titanic udders, which are squashed between you.`);
				} else if (eventSlave.boobs > 1000) {
					r.push(`own lovely boobs.`);
				} else {
					r.push(`chest.`);
				}
				r.push(`When ${his}`);
				if (eventSlave.butt > 15) {
					r.push(`obscene`);
				} else if (eventSlave.butt > 10) {
					r.push(`absurd`);
				} else if (eventSlave.butt > 6) {
					r.push(`monstrous`);
				} else if (eventSlave.butt > 3) {
					r.push(`healthy`);
				} else {
					r.push(`cute`);
				}
				r.push(`buttocks crash against the wall, you smash yourself against ${him}. ${He} shudders involuntarily as ${he} feels your stiffening dick between you`);
				if (eventSlave.belly >= 5000) {
					r.push(`and ${his} rounded stomach`);
				}
				r.push(r.pop() + `, and then again as it rapidly achieves full hardness, crushed between your warm bodies.`);
				App.Events.addParagraph(frag, r);
				r = [];
				r.push(`Making out with ${him} so insistently that ${he}'s short of breath, you begin to hump yourself against ${him}, sliding your prick against ${his}`);
				if (eventSlave.belly >= 5000) {
					r.push(belly);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnant`);
					}
				}
				r.push(`belly, thighs, and`);
				if (canDoVaginal(eventSlave)) {
					r.push(`labia.`);
				} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`own dick.`);
				} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`fat cock.`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`limp member.`);
				} else if (eventSlave.chastityPenis === 1) {
					r.push(`caged dick.`);
				} else if (eventSlave.chastityVagina) {
					r.push(`chastity belt.`);
				} else {
					r.push(`soft perineum.`);
				}
				r.push(`${He} shudders uncomfortably as ${he} realizes that ${he}'s getting aroused, ${his}`);
				if (eventSlave.vagina > -1) {
					r.push(`pussy moistening`);
				} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`dick hardening`);
				} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`dick struggling to engorge`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					r.push(`girldick starting to ooze precum`);
				} else if (eventSlave.chastityPenis === 1) {
					r.push(`chastity cage growing ever tighter`);
				} else {
					r.push(`tiny front hole starting to ooze precum`);
				}
				r.push(`from the stimulation, despite ${his} lack of appetite for cock.`);
				if (!canDoAnal(eventSlave) && !canDoVaginal(eventSlave)) {
					r.push(`${He} knows what's coming when you push ${him}`);
					if (eventSlave.belly >= 300000) {
						r.push(`over ${his} ${belly} stomach,`);
					} else {
						r.push(`to ${his} knees,`);
					}
					r.push(`and does ${his} best to relax.`);
					App.Events.addParagraph(frag, r);
					App.Events.addParagraph(frag, [`${He} screws ${his} eyes shut tight and ${his} mouth tighter as you prod at ${his} face with your member. Tiring of ${his} reluctance, you give ${him} a brusque order to open ${his} eyes and gaze upon the dick ${he} will soon be deepthroating. ${He} obeys, but unwillingly, and steadies ${himself} to take its length. You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the internal fullness and sexual confusion. ${He} stares as best ${he} can at your penis, transfixed by the sight of it thrusting into ${his} mouth and the feeling of ${his} lips around its girth.`]);
					r = [];
					r.push(`${He} slips a hand to ${his} crotch, ${his} arousal overwhelming ${his} preferences. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, holding back to ${his} point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${his} mouth, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} chokes on your cock. You pull out of ${him}, and ${he} struggles to catch ${his} breath, the action sending a blob of ${his} owner's semen running down ${his} chin.`);
					seX(eventSlave, "oral", PC, "penetrative", 7);
				} else if (eventSlave.belly >= 10000) {
					r.push(`${He} knows what's coming when you push ${him}`);
					if (eventSlave.belly >= 300000) {
						r.push(`over ${his} ${belly} stomach,`);
					} else {
						r.push(`to ${his} knees,`);
					}
					r.push(`and does ${his} best to relax.`);
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`${He} screws ${his} eyes shut tight as you maneuver yourself inside ${his}`);
					if (canDoVaginal(eventSlave)) {
						if (eventSlave.vagina > 2) {
							r.push(`cavernous cunt.`);
						} else if (eventSlave.vagina > 1) {
							r.push(`welcoming pussy.`);
						} else {
							r.push(`tight flower.`);
						}
					} else {
						if (eventSlave.anus > 2) {
							r.push(`unresisting asspussy.`);
						} else if (eventSlave.anus > 1) {
							r.push(`welcoming butthole.`);
						} else {
							r.push(`tight anus.`);
						}
					}
					r.push(`Once you're situated, you give ${him} a brusque order to open ${his} eyes and look behind ${him}. ${He} obeys, but unwillingly, bending as best ${he} can to see how physically close you are. ${He} can't see where it enters ${his}`);
					if (canDoVaginal(eventSlave)) {
						r.push(`womanhood,`);
					} else {
						r.push(`bowels,`);
					}
					r.push(`but ${he}'s very aware of it. You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the awkward position, internal fullness, and sexual confusion. Turned as much as ${he} can, ${he} stares, transfixed by the sight of you thrusting into ${his} body.`);
					if (canDoVaginal(eventSlave)) {
						r.push(VCheck.Vaginal(eventSlave, 7));
					} else {
						r.push(VCheck.Anal(eventSlave, 7));
					}
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`You snake a hand under ${him} and begin to stimulate ${him} manually. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, bringing ${him} to the point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${him}, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} wriggles involuntarily against you. You release ${him}, and ${he} barely manages to catch ${himself} from collapsing, the motion sending a blob of ${his} owner's semen running down ${his} thigh.`);
				} else {
					r.push(`${He} knows what's coming when you pin ${his} torso even harder and reach down to pull ${his} knees up to clasp you around your waist, and does ${his} best to relax.`);
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`${He} screws ${his} eyes shut tight as you maneuver yourself inside ${his}`);
					if (canDoVaginal(eventSlave)) {
						if (eventSlave.vagina > 2) {
							r.push(`cavernous cunt.`);
						} else if (eventSlave.vagina > 1) {
							r.push(`welcoming pussy.`);
						} else {
							r.push(`tight flower.`);
						}
					} else {
						if (eventSlave.anus > 2) {
							r.push(`unresisting asspussy.`);
						} else if (eventSlave.anus > 1) {
							r.push(`welcoming butthole.`);
						} else {
							r.push(`tight anus.`);
						}
					}
					r.push(`Once you're confident your member is properly seated inside ${him}, and you won't drop ${him}, you give ${him} a brusque order to open ${his} eyes and look down. ${He} obeys, but unwillingly, bending as best ${he} can to look at the base of your dick where it`);
					if (canDoVaginal(eventSlave)) {
						r.push(`enters ${his} womanhood.`);
					} else {
						r.push(`disappears beneath`);
						if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
							r.push(`${his} own erect cock.`);
						} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
							r.push(`${his} own dangling cock.`);
						} else if (eventSlave.chastityPenis === 1) {
							r.push(`${his} chastity.`);
						} else {
							r.push(`${him}. ${He} can't see where it enters ${his} bowels, but ${he}'s very aware of it.`);
						}
					}
					r.push(`You tell ${him} to do ${his} best to watch, and begin thrusting. ${He} groans from the awkward position, internal fullness, and sexual confusion. Bent almost in half, ${he} stares, transfixed by the sight of your penis delving inside ${his} body.`);
					if (canDoVaginal(eventSlave)) {
						r.push(VCheck.Vaginal(eventSlave, 7));
					} else {
						r.push(VCheck.Anal(eventSlave, 7));
					}
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`You push a hand between the two of you and begin to stimulate ${him} manually. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, bringing ${him} to the point of climax before shooting your cum deep inside ${him}. The internal sensation of heat, the tightening and twitching of your member inside ${him}, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} wriggles involuntarily within your grasp. You drop ${him}, and ${he} barely manages to catch ${himself} on shaking legs, the motion sending a blob of ${his} owner's semen running down ${his} thigh.`);
				}
				App.Events.addParagraph(frag, r);
				r = [];
				r.push(`Over the week, you force ${him} to achieve daily orgasm as your cock pounds in and out of ${him}. It's difficult, blowing your load inside a compliant slave ${girl} every day, but you make the necessary sacrifice.`);
				if (random(1, 2) === 1) {
					r.push(`After a few days, ${he}'s <span class="green">obviously reconsidering ${his} previous hesitations about dick.</span>`);
					eventSlave.attrXY += 5;
				} else {
					r.push(`${He} takes it like a good slave. ${His} dislike for dick doesn't change, but ${he} gets better at suppressing ${his} own inclinations and serving as your cum receptacle.`);
					eventSlave.devotion += 4;
				}
			} else if (eventSlave.attrXX <= 35) {
				r.push(`girls, so ${he} gets to spend some quality time with your feminine side. You kiss ${him}, teasing your tongue against ${him}, and press your breasts maliciously against ${his}`);
				if (eventSlave.boobs > 5000) {
					r.push(`titanic udders, which are squashed between you.`);
				} else if (eventSlave.boobs > 1000) {
					r.push(`own lovely boobs.`);
				} else {
					r.push(`chest.`);
				}
				r.push(`${He} shrinks away from you involuntarily, but you stroke loving hands down ${his} temples, the sides of ${his} neck, and ${his} upper arms. ${He} shudders involuntarily, and you can almost feel ${him} hate ${himself} through your lip lock. You cock your hips back and to the side, keeping your prick well clear of ${him}. As far as ${he} can feel, you're all boobs and feminine lips.`);
				App.Events.addParagraph(frag, r);
				r = [];
				if (eventSlave.toyHole === "dick" || (V.policies.sexualOpenness === 1 && canPenetrate(eventSlave))) {
					r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your`);
					if (eventSlave.belly >= 5000) {
						r.push(`butt, working your way under ${his} ${belly} belly`);
					} else {
						r.push("butt.");
					}
					r.push(`As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your`);
					if (PC.butt >= 5) {
						r.push(`enormous,`);
						if (PC.buttImplant !== 0) {
							r.push(`beachball cheeks,`);
						} else {
							r.push(`wobbling ass,`);
						}
					} else if (PC.butt >= 4) {
						r.push(`huge,`);
						if (PC.buttImplant !== 0) {
							r.push(`balloon of an`);
						} else {
							r.push(`soft`);
						}
						r.push(`ass,`);
					} else if (PC.butt >= 3) {
						r.push(`big`);
						if (PC.buttImplant !== 0) {
							r.push(`fake`);
						}
						r.push(`ass,`);
					} else {
						r.push(`ass,`);
					}
					r.push(`leading ${him} like a music teacher guiding a student's hands. When ${he}'s groping your buttocks properly, you grind against ${him} for a while, grinning to yourself as you feel an unwilling erection building between your cheeks. Pleased, you lean forward and line up your`);
					if (PC.vagina !== -1) {
						r.push(`pussy`);
					} else {
						r.push(`asshole`);
					}
					r.push(`with ${his} dick head and push back into ${him}. You repeat until ${his} hips start moving on their own. You bite on your finger at the sensation of ${his} cock inside you and, using your other hand, begin to jerk yourself off. Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick; it must feel as though ${he} is banging a beautiful woman. ${He} whimpers pathetically, seeing and feeling ${himself} build towards an inevitable orgasm. You manage ${him} skillfully, taking ${him} to the point of climax before enjoying your own orgasm. The heat of your insides, the tightening and twitching of your`);
					if (PC.vagina !== -1) {
						r.push(`vagina`);
					} else {
						r.push(`rectum`);
					}
					r.push(`around ${his} cock, and your obvious pleasure force ${him} over the edge, and ${he} comes so hard that ${he} nearly knocks your to the floor. You scoot forward, letting ${him} slip from you. ${He} gets a splendid sight of your still gaped`);
					if (PC.vagina !== -1) {
						r.push(`cunt`);
					} else {
						r.push(`anus`);
					}
					r.push(`begging for more`);
					if (eventSlave.balls > 0) {
						r.push(`as a blob of ${his} semen drips from your body`);
					}
					r.push(r.pop() + `.`);
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having to savor a compliant slave's penis every day, but you make the necessary sacrifice.`);
					if (canImpreg(PC, eventSlave)) {
						r.push(knockMeUp(PC, 40, 0, eventSlave.ID));
					}
				} else if (eventSlave.belly >= 150000) {
					r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your butt, working your way under ${his} ${belly} belly. As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your`);
					if (PC.butt >= 5) {
						r.push(`enormous,`);
						if (PC.buttImplant !== 0) {
							r.push(`beachball cheeks,`);
						} else {
							r.push(`wobbling ass,`);
						}
					} else if (PC.butt >= 4) {
						r.push(`huge,`);
						if (PC.buttImplant !== 0) {
							r.push(`balloon of an`);
						} else {
							r.push(`soft`);
						}
						r.push(`ass,`);
					} else if (PC.butt >= 3) {
						r.push(`big`);
						if (PC.buttImplant !== 0) {
							r.push(`fake`);
						}
						r.push(`ass,`);
					} else {
						r.push(`ass,`);
					}
					r.push(`leading ${him} like a music teacher guiding a student's hands. When ${he}'s groping your buttocks properly, you grind against ${him} for a while, grinning to yourself as you feel`);
					if (canDoVaginal(eventSlave)) {
						r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to play with ${his} clit, using your other hand to jerk off.`);
					} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
						r.push(`an unwilling erection building between your cheeks. Pleased, you lean back and start to play with ${his} dick, using your other hand to jerk yourself off.`);
					} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
						r.push(`the huge cock behind you start to leak onto your back. Pleased, you lean back and start to play with ${his} dick, using your other hand to jerk yourself off.`);
					} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
						r.push(`the pretty girldick behind you start to leak. Pleased, you lean back and start to play with ${his} soft bitchclit, using your other hand to jerk yourself off.`);
					} else if (eventSlave.chastityPenis === 1) {
						r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to tease ${his} chastity cage, using your other hand to jerk off.`);
					} else if (eventSlave.chastityVagina) {
						r.push(`an unwilling heat building low behind you. Pleased, you lean back and start to tease ${his} chastity, using your other hand to jerk off.`);
					} else if (eventSlave.race === "catgirl") {
						r.push(`a demure heat building behind you. Pleased, you lean back and start to play with the soft silky fur between ${his} legs.`);
					} else {
						r.push(`a demure heat building behind you. Pleased, you lean back and start to play with the soft smooth skin between ${his} legs.`);
					}
					r.push(`Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick. It must feel as though ${he} has a beautiful woman under ${his} middle, and is playing with ${his} ass while ${he} gets ${him} off manually. You complete the feeling by bucking against ${him} with extra enthusiasm when you climax.`);
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having to grind against a compliant slave every day, but you make the necessary sacrifice.`);
				} else {
					r.push(`You walk forward, pressing ${him} against the far wall, and then turn yourself around, pinning ${him} against the wall with your butt`);
					if (eventSlave.belly >= 10000) {
						r.push(`as well as you can with ${his} ${belly}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`pregnancy`);
						} else {
							r.push(`belly`);
						}
						r.push(`pushing into you`);
					}
					r.push(r.pop() + `. As ${he} hesitates, wondering what to do about this, you grab ${his} hands and place them on your tits, leading ${him} like a music teacher guiding a student's hands. When ${he}'s stroking your nipples properly, you grind against ${him} for a while, grinning to yourself as you feel`);
					if (canDoVaginal(eventSlave)) {
						r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to play with ${his} clit, using your other hand to jerk off.`);
					} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
						r.push(`an unwilling erection building behind you. Pleased, you snake a hand around behind yourself and start to play with ${his} dick, using your other hand to jerk yourself off.`);
					} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
						r.push(`the huge cock behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with ${his} dick, using your other hand to jerk yourself off.`);
					} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
						r.push(`the pretty girldick behind you start to leak. Pleased, you snake a hand around behind yourself and start to play with ${his} soft bitchclit, using your other hand to jerk yourself off.`);
					} else if (eventSlave.chastityPenis === 1) {
						r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease ${his} chastity cage, using your other hand to jerk off.`);
					} else if (eventSlave.chastityVagina) {
						r.push(`an unwilling heat building low behind you. Pleased, you snake a hand around behind yourself and start to tease ${his} chastity, using your other hand to jerk off.`);
					} else if (eventSlave.race === "catgirl") {
						r.push(`a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft silky fur between ${his} legs.`);
					} else {
						r.push(`a demure heat building behind you. Pleased, you snake a hand around behind yourself and start to play with the soft smooth skin between ${his} legs.`);
					}
					r.push(`Except for your vigorous stroking with one hand, there's little to indicate to ${him} that you have a dick. It must feel as though ${he} has a beautiful woman in ${his} ${arms}, and is playing with ${his} boobs while ${he} gets ${him} off manually. You complete the feeling by craning around to rain nibbles and kisses on ${his} ${eventSlave.faceShape} face.`);
					App.Events.addParagraph(frag, r);
					r = [];
					r.push(`Over the week, you require ${him} to repeat this sexually confusing performance daily. It's difficult, having one of your slaves detailed to stimulate your nipples every day, but you make the necessary sacrifice.`);
				}
				if (random(1, 2) === 1) {
					r.push(`After a few days, ${he}'s <span class="green">obviously reconsidering ${his} previous hesitations about tits and ass.</span>`);
					eventSlave.attrXX += 5;
				} else {
					r.push(`${He} serves your feminine body like a good slave. ${His} dislike for sex with girls doesn't change, but ${he} gets better at suppressing ${his} own inclinations and serving as your plaything.`);
					eventSlave.devotion += 4;
				}
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSDiet = class RESSDiet 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 <= 50,
				s => s.trust >= -50,
				s => s.behavioralFlaw === "gluttonous",
				s => s.diet === "restricted",
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`is on a diet, and ${he} needs it. That doesn't make it any easier for ${him}. Your slaves are not permitted time to waste over meals. They enter the simple kitchen, drink their allotted portion of slave food out of a cup, and get on with their duties.`
		);

		if (eventSlave.preg > eventSlave.pregData.normalBirth/1.33) {
			r.push(`Despite eating for`);
			if (eventSlave.pregType <= 1) {
				r.push(`two,`);
			} else if (eventSlave.pregType >= 10) {
				r.push(`far too many,`);
			} else {
				r.push(num(eventSlave.pregType + 1),);
			}
			r.push(`${his} diet is still in full effect.`);
		}
		r.push(`${capFirstChar(V.assistant.name)} catches ${eventSlave.slaveName}, whose cup is always filled less than halfway, skulking around in the hope that one of the others will take ${his} eyes off ${his} cup, or even leave leftovers.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Catch ${him} at it and punish ${him}`, punish),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Make ${him} eat in your office and keep ${him} busy while ${he} does`, busy, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			new App.Events.Result(`Fill ${him} up with water as punishment`, water),
			new App.Events.Result(`Make ${him} eat until ${he} regrets it`, regret),
			((cumSlaves().length >= 5) && ((eventSlave.fetish !== "cumslut") || (eventSlave.fetishKnown === 0)))
				? new App.Events.Result(`Restrict ${him} to nothing but fresh cum from the Dairy`, restrict)
				: new App.Events.Result(),
		]);

		function punish() {
			r = [];
			r.push(`It's childishly easy to catch ${him} at it. You simply call a slave eating ${his} breakfast away over the arcology's audio system, and then enter the kitchen by a different door. ${eventSlave.slaveName} has the departed slave's cup in ${his} hand and halfway to ${his} mouth when ${he}'s caught in the act. You relieve ${him} of ${his} prize, and finding that ${he} has not started ${his} own proper portion, pour it out onto the floor. You tell ${him} to lap it up without using ${his} hands, and begin counting down from ten. ${He} obeys,`);
			if (eventSlave.belly >= 300000) {
				r.push(`only to find ${his} ${belly} stomach keeps ${him} from reaching the puddle. When you reach zero you shove ${him} over ${his} middle, face first into the pool of slave food, and administer a stinging slap across ${his} thieving`);
				if (V.seeRace === 1) {
					r.push(eventSlave.race);
				}
				r.push(`ass.`);
			} else {
				r.push(`but slowly and hesitantly. When you reach zero you order ${him} to get`);
				if (hasAllLimbs(eventSlave)) {
					r.push(`to all fours`);
				} else {
					r.push(`on the ground`);
				}
				r.push(`and administer a stinging slap across ${his} thieving`);
				if (V.seeRace === 1) {
					r.push(eventSlave.race);
				}
				r.push(`ass.`);
			}
			r.push(`${He} alternates ten seconds of desperate lapping with being beaten across the buttocks until ${he}'s done, by which time ${he} is desperate to obey and avoid further punishment.`);
			eventSlave.trust -= 5;
			return r;
		}

		function busy() {
			r = [];
			r.push(`${He} knows what it means when ${he}'s informed that ${him} meals will now be available in your office only. You not only supervise ${him} intake strictly, but set up a bowl for ${him} on a little stand so the chubby bitch can lap up ${his} food`);
			if (hasBothArms(eventSlave)) {
				r.push(`hands-free`);
			}
			r.push(`on`);
			if (eventSlave.belly >= 300000) {
				r.push(`${his} ${belly} belly,`);
			} else if (hasAllLimbs(eventSlave)) {
				r.push(`all fours,`);
			} else {
				r.push(`the ground,`);
			}
			r.push(`leaving ${him} open for use from behind.`);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(VCheck.Both(eventSlave, 3, 3));
			} else if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 6));
			} else if (canDoAnal(eventSlave)) {
				r.push(VCheck.Anal(eventSlave, 6));
			}
			r.push(`You're careful to avoid associating pleasure with misbehavior by taking ${his} cruelly every time ${he} eats, pinching ${his} nipples, and slapping ${his}`);
			if (V.seeRace === 1) {
				r.push(eventSlave.race);
			}
			r.push(`ass as you ride ${him}. This is so effective that <span class="trust dec">${he} learns to obey</span> and <span class="orange">loses weight</span> both.`);
			eventSlave.trust -= 5;
			eventSlave.weight -= 10;
			eventSlave.diet = "healthy";
			return r;
		}

		function water() {
			r = [];
			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You indicate a table full of cups, and tell ${him} that ${he} can drink as much as ${he} wants from them if ${he}'ll tell you the truth. ${He} confesses, and is horrified to find they're full of water, not food. You add casually that ${he} can choose not to 'eat' the contents... but that ${he}'ll get no real food until ${he} finishes every one. Torn between hunger and reluctance, ${he} spends the next hour struggling with so much water that you have to check ${him} for water intoxication. ${He} finishes with`);
			if (eventSlave.belly >= 1500) {
				r.push(`an even more bulbous`);
			} else {
				r.push(`a bulging`);
			}
			r.push(`stomach and a <span class="trust dec">sincere desire to avoid further punishment.</span>`);
			eventSlave.trust -= 5;
			return r;
		}

		function regret() {
			r = [];
			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You indicate a table full of cups, and tell ${him} that ${he} is going to eat the contents of every last one; every day, until ${he} regrets being a glutton. ${He} gulps at the sight, but eagerly digs in. As ${his} stomach steadily distends and the cups rapidly empty, you realize you may have made a mistake. ${He} finishes with`);
			if (eventSlave.belly >= 1500) {
				r.push(`an even more bulbous`);
			} else {
				r.push(`a hugely bulging`);
			}
			r.push(`stomach and a <span class="devotion dec">smirk at your so-called punishment.</span>`);
			eventSlave.devotion -= 5;
			eventSlave.inflationType = "food";
			eventSlave.inflationMethod = 1;
			if (eventSlave.bellyPreg > 0 || eventSlave.bellyImplant > 0) {
				eventSlave.inflation = 1;
			} else {
				eventSlave.inflation = 3;
			}
			SetBellySize(eventSlave);
			return r;
		}

		function restrict() {
			r = [];
			r.push(`You meet ${him} in time for ${his} next meal and tell ${him} that you're aware of ${his} stealing. You tell ${him} that you understand ${his} need to eat, and that for the rest of the week you'll mercifully be allowing ${him} to try a new diet on which ${he} can eat as much as ${he} wants. ${He}'s overjoyed`);
			if (canHear(eventSlave)) {
				r.push(`to hear it,`);
			} else if (canSee(eventSlave)) {
				r.push(`when ${he} reads it on a nearby screen display,`);
			} else {
				r.push(`when ${he} figures it out,`);
			}
			r.push(`though this pleasure is replaced with extreme disgust when ${he} learns that ${his} only culinary options are limited to cum. It's just nutritionally augmented enough to prevent starvation. Disgust is defeated by hunger pangs, and ${he} spends most of the week going around with a preoccupied look on ${his} face and`);
			if (eventSlave.belly >= 1500) {
				r.push(`an even more`);
			} else {
				r.push(`a slightly`);
			}
			r.push(`distended belly. By the end, ${he}'s starting to <span class="fetish gain">salivate</span> at the mere`);
			if (canSmell(eventSlave)) {
				r.push(`scent`);
			} else {
				r.push(`thought`);
			}
			r.push(`of ejaculate.`);
			eventSlave.devotion += 4;
			eventSlave.fetish = "cumslut";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			eventSlave.inflation = 1;
			eventSlave.inflationType = "cum";
			eventSlave.inflationMethod = 1;
			SetBellySize(eventSlave);
			return r;
		}
	}
};


code:
App.Events.RESSEliteBreederPlease = class RESSEliteBreederPlease extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].FSRestart !== "unset",
			() => !!V.propOutcome,
		];
	}

	actorPrerequisites() {
		return [
			[
				s => s.breedingMark === 0,
				s => s.devotion > 50,
				s => s.trust > 20,
				s => isFertile(s),
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		const r = new SpacedTextAccumulator(node);

		r.push(
			`You're startled out of a reverie one day by a sudden, timid knock on the frame of your office door. You look up to see`,
			contextualIntro(V.PC, eventSlave, true),
			`standing there, shyly waiting for your permission to enter. You give it silently with a beckoning motion of the hand. After a couple false starts, ${he} finally ${say}s, "${Spoken(eventSlave, `${Master}, can you make me one of your breeders? I would love to use my body to carry your babies.`)}"`);

		r.toParagraph();

		App.Events.addResponses(node, [
			new App.Events.Result(`Agree`, agree, `This option costs ${cashFormat(5000)} and will sterilize ${him} if ${he} is not deemed worthy of breeding`),
			new App.Events.Result(`Refuse`, refuse),
		]);

		return r.container();

		function agree() {
			const div = document.createElement("div");
			const r = new SpacedTextAccumulator(div);

			r.push(`Having a slave so eager to become a breeder always makes you smile inwardly, but you don't allow your expression to change. Instead, you silently stand up from your chair and make a show of contemplating ${his} request. ${eventSlave.slaveName} waits with bated breath, letting out an audible sigh of relief and gratitude when you accept ${his} offer. Without any further ado, you make a quick phone call, and a few short minutes later a small group of Elites enters, ready to grade your slave.`);

			r.toParagraph();

			div.append(App.Interact.eliteBreedingExam(eventSlave));

			return r.container();
		}

		function refuse() {
			const r = [];

			r.push(`You admire ${his} enthusiasm, and you tell ${him} as much, at which ${he} beams. ${His} face falls when you go on to tell ${him} that, at least for now, ${he} isn't going to be one of your breeders. Though ${he} tries (and fails) to hide the disappointment on ${his} face, ${he} nods and gives a little bow before turning and going back to what ${he} was doing earlier.`);

			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.aphrodisiacs > 1 || s.inflationType === "aphrodisiac",
				s => s.rules.speech === "restrictive",
				s => s.rules.release.master === 1,
				s => App.Utils.releaseRestricted(s)
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`As you are retiring for the night,`,
			contextualIntro(PC, eventSlave, true)
		);
		if (!canWalk(eventSlave)) {
			r.push(`crawls`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`totters`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`waddles`);
		} else {
			r.push(`walks`);
		}
		r.push(`into your bedroom. Since ${he} is not allowed to ask questions, ${he} says nothing, but ${his} reason for being here is obvious enough. ${He}'s on a medically reckless dosage of aphrodisiacs, and ${he}'s panting as ${he}`);
		if (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
			r.push(`kneels`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`teeters`);
		} else {
			r.push(`stands`);
		}
		r.push(`there. ${His} nipples are`);
		if (eventSlave.nipples !== "fuckable") {
			r.push(`hard,`);
		} else {
			r.push(`swollen shut,`);
		}
		r.push(`and there's visible moisture on ${his}`);
		if (V.seeRace === 1) {
			r.push(`${eventSlave.race}`);
		}
		if (eventSlave.vagina !== -1) {
			r.push(`pussylips.`);
		} else if (eventSlave.dick !== 0) {
			r.push(`dickhead.`);
		} else {
			r.push(`tiny little front hole.`);
		}
		r.push(`It's also against the rules for ${him} to masturbate, so ${he} clearly decided to come to you rather than break the rules. There's no way ${he}'ll be able to sleep like this.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Take pity and give ${him} relief`, relief),
			new App.Events.Result(`See how rough you can be and still get ${him} to cum`, rough),
			new App.Events.Result(`Send ${him} away`, away)
		]);

		function relief() {
			eventSlave.devotion += 4;
			return `You sit on the edge of the bed and draw ${him} down to sit on your lap. This way, you can enjoy gently fucking ${him} while you draw orgasm after orgasm out of ${him} with your hands. ${He}'ll only be relieved for a few hours, but ${he}'s tearfully grateful all the same.`;
		}

		function rough() {
			const r = new SpacedTextAccumulator();
			r.push(`The aphrodisiac dosage ${he}'s on will let ${him} orgasm to almost anything. You spend a few minutes playing with ${his} nipples, skillfully edging ${him} away from climax, and ${he}'s almost vibrating with discomfort. ${He}'s so desperate that ${he} sobs with relief when you order ${him} to`);
			if (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
				r.push(`kneel`);
			} else if (shoeHeelCategory(eventSlave) > 1) {
				r.push(`totter up`);
			} else {
				r.push(`stand`);
			}
			if (eventSlave.belly >= 5000) {
				r.push(`${belly} belly`);
			}
			r.push(`against a wall and spread ${his} buttocks. A little saliva and`);
			if (V.PC.vagina !== -1) {
				r.push(`a bit of your own pussyjuice, transferred by a couple of fingers, and`);
			}
			if (V.PC.dick === 0) {
				r.push(`your vibrating strap-on`);
			} else {
				r.push(`your dick`);
			}
			r.push(`is up ${his} willing ass. The position is uncomfortable for ${him}, and you are not gentle, but ${he} comes anyway. By the end of the night ${his} butthole is so sore that ${he}`);
			if (eventSlave.belly >= 5000) {
				r.push(`lies on ${his} side`);
			} else {
				r.push(`lies on ${his} stomach`);
			}
			r.push(`every chance ${he} gets. ${His} submissiveness <span class="devotion inc">has increased.</span>`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function away() {
			eventSlave.devotion -= 5;
			return `${He} leaves with ill-concealed disappointment, and is faced with the choice between covert, rule-breaking masturbation or a sleepless night. ${His} regard for you has decreased.`;
		}
	}
};