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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => s.trust <= 20,
				s => s.trust >= -75,
				s => s.devotion <= 30,
				s => s.devotion >= -20,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`appears at the door of your office, looking frightened. ${He} takes one hesitant step in and stops, wavering, ${his} hand balled into fists and ${his} lower lip caught behind ${his} teeth. The ${SlaveTitle(eventSlave)} is getting used to ${his} place as chattel, but ${he} isn't sure of ${himself} yet. After a few moments, it becomes obvious that ${he}'s lost whatever mental momentum propelled ${him} to come in here, and can't muster the courage to back out, either. You rescue ${him} by politely but firmly ordering ${him} to tell you why ${he}'s here. After two false starts, ${he}`
		);
		if (!canTalk(eventSlave)) {
			r.push(`uses shaky hands to ask you to fuck ${him}.`);
		} else {
			r.push(
				Spoken(eventSlave, `"P-please fuck me, ${Master},"`),
				`${he} chokes out.`
			);
		}
		r.push(`To go by ${his} behavior, the likelihood that ${he}'s actually eager to`);
		if (PC.dick === 0) {
			r.push(`eat pussy,`);
		} else {
			r.push(`take a dick,`);
		}
		r.push(`never mind yours, is vanishingly small.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Fuck ${him}`, fuck, virginityWarning()),
			new App.Events.Result(`Rape ${him}`, rape, virginityWarning()),
			new App.Events.Result(`Get the truth out of ${him}`, truth),
		]);

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

		function fuck() {
			r = [];
			r.push(`${He} asked for it, and ${he}'ll get it. You get to your`);
			if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
				r.push(`feet, unhook ${his} chastity,`);
			} else {
				r.push(`feet`);
			}
			r.push(`and snap your fingers, pointing`);
			if (PC.dick === 0) {
				r.push(`at the floor in front of you`);
				if (!canSee(eventSlave)) {
					r.push(`along with a commanding "floor"`);
				}
				r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by grabbing ${him} on either side of ${his} neck and`);
				if (eventSlave.belly >= 300000) {
					r.push(`pulling onto ${his} ${belly} stomach`);
				} else {
					r.push(`shoving ${him} down to kneel at your feet`);
				}
				r.push(`with ${his} face`);
				if (PC.belly >= 5000) {
					r.push(`crammed under your pregnant belly, level with your cunt.`);
				} else {
					r.push(`level with your cunt.`);
				}
				r.push(`One of your hands shifts behind ${his} head and tilts it back as you step forward, grinding against ${his} mouth. ${He} struggles involuntarily, but then perceptibly recollects ${himself}, relaxes, and starts to eat you out. Whatever internal turmoil ${he}'s working through, you don't care, and neither does your pussy. When you climax and release ${him}, ${he} stumbles off, looking oddly proud of ${himself}. It seems ${he} got something out of that: a confidence boost, at least.`);
			} else {
				r.push(`at the couch next to the desk`);
				if (!canSee(eventSlave)) {
					r.push(`along with a commanding "couch"`);
				}
				r.push(r.pop() + `. ${He} hurries over and`);
				if (eventSlave.belly >= 5000) {
					r.push(`gently eases ${his}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnant`);
					} else {
						r.push(`swollen`);
					}
					r.push(`body to the ground,`);
				} else {
					r.push(`kneels,`);
				}
				r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by shoving ${him} down so ${his} collarbone is resting on the back of the couch and ${his} ass is at just the right height.`);
				if (PC.vagina !== -1) {
					r.push(`You ensure that you're fully hard and get ${him} in the right frame of mind by grinding the pussy beneath your dick against ${him}.`);
				}
				r.push(`You fuck`);
				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
					r.push(`${his} pussy and then ${his} ass in quick succession, plundering ${his} holes without much regard for ${his} pleasure.`);
					r.push(VCheck.Both(eventSlave, 1));
					r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up ${his} butt.`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`${his} pussy hard, without much regard for ${his} pleasure.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
					r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside ${him}.`);
				} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
					r.push(`${his} ass hard, without cruelty but without much concern for ${his} pleasure, either.`);
					r.push(VCheck.Anal(eventSlave, 1));
					r.push(`${He} takes it obediently, and does ${his} best to act like ${he}'s enjoying being sodomized.`);
				}
				r.push(`${He} stumbles off to wash, looking oddly proud of ${himself}. It seems ${he} got something out of that: <span class="trust inc">a confidence boost,</span> at least.`);
			}
			eventSlave.trust += 4;
			return r;
		}

		function rape() {
			r = [];
			r.push(`${He}'ll get more than ${he} asked for. You get to your`);
			if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
				r.push(`feet, unhook ${his} chastity,`);
			} else {
				r.push(`feet`);
			}
			r.push(`and snap your fingers, pointing`);
			if (PC.dick === 0) {
				r.push(`at the floor in front of you`);
				if (!canSee(eventSlave)) {
					r.push(`along with a commanding "floor"`);
				}
				r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by slapping ${him}, and when ${he} instinctively cringes away from the blow, poking the back of one of ${his} knees with your foot.`);
				if (eventSlave.belly >= 5000) {
					r.push(`${His}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`gravid`);
					} else {
						r.push(`bloated`);
					}
					r.push(`form`);
				} else {
					r.push(`${He}`);
				}
				r.push(`collapses like a doll with its strings cut, already crying. You seize ${his} head in both hands and ride ${his} sobbing mouth. If ${he} thought that rape required a dick, ${he} was wrong. If ${he} thought that you needed a strap-on to rape ${him}, ${he} was wrong. Your fingers form claws, holding ${his} head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against ${his} crying face.`);
			} else {
				r.push(`at the couch next to the desk`);
				if (!canSee(eventSlave)) {
					r.push(`along with a commanding "couch"`);
				}
				r.push(r.pop() + `. ${He} hurries over and`);
				if (eventSlave.belly >= 5000) {
					r.push(`gently eases ${his}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnant`);
					} else {
						r.push(`swollen`);
					}
					r.push(`body to the ground,`);
				} else {
					r.push(`kneels,`);
				}
				r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by`);
				if (eventSlave.belly >= 600000) {
					r.push(`slamming your hands against the bloated mass grossly distending ${his} sides,`);
				} else {
					r.push(`jabbing a thumb into one of ${his} kidneys,`);
				}
				r.push(`forcing ${his} back to arch in involuntary response, and then grinding ${his} face into the couch cushions.`);
				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
					r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to ${his} anus.`);
					r.push(VCheck.Both(eventSlave, 1));
					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
				} else if (canDoVaginal(eventSlave)) {
					r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this as you waste no time with foreplay.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you rape ${him} into inelegant, tearful begging for you to take your dick out of ${his} cunt because it hurts`);
					if (canGetPregnant(eventSlave)) {
						r.push(r.pop() + `, followed by desperate pleas to not cum inside ${him} since it's a danger day`);
					}
					r.push(r.pop() + `.`);
				} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
					r.push(`You spit on ${his} asshole and then give ${him} some anal foreplay, if slapping your dick against ${his} anus twice before shoving it inside ${him} counts as anal foreplay.`);
					r.push(VCheck.Anal(eventSlave, 1));
					r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
				}
				r.push(`It isn't the first time you've heard that, or the hundredth.`);
			}
			r.push(`When you're done, you discard ${him} like the human sex toy ${he} is, and go back to your work. ${He} stumbles off, looking fearful but strangely complacent, as though ${he}'s accepted this to an extent.`);
			eventSlave.trust -= 4;
			eventSlave.devotion += 4;
			return r;
		}

		function truth() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You ask ${him} why ${he}'s really here, with devastating directness and in a tone that will brook no disobedience. ${He} quails, ${his} shoulders slumping as ${he}`);
			if (eventSlave.belly >= 1500) {
				if (eventSlave.pregKnown === 1) {
					r.push(`hugs ${his} pregnancy`);
				} else {
					r.push(`attempts to hug ${himself} with ${his} ${belly} belly in the way`);
				}
			} else {
				r.push(`hugs ${himself}`);
			}
			r.push(`and ${his} knees turning inward as ${he} cringes, the perfect picture of the standard human fear response. It seems ${he} thought you wouldn't notice ${his} insincerity. ${He} swallows nervously and makes no response, but then you`);
			if (canSee(eventSlave)) {
				r.push(`allow impatience to cloud your brow`);
			} else {
				r.push(`cough with impatience`);
			}
			r.push(`and ${he} hurriedly explains ${himself}.`);
			if (!canTalk(eventSlave)) {
				r.push(`${He} uses sign language to communicate that ${he} asked the other slaves what ${he} could do to improve ${his} life, and that they told ${him} to do ${his} best to win your favor. ${He} asked them how to do that, and they told ${him} to ask you to fuck ${him}.`);
			} else {
				r.push(
					Spoken(eventSlave, `"${Master}, I, um, asked the other girls what I could do to, you know, do better here,"`),
					`${he} ${say}s.`,
					Spoken(eventSlave, `"They said to g-get you to like me. A-and when I asked them how to do that, th-they said t-to ask you to fuck me."`)
				);
			}
			r.push(`Then ${he} bites ${his} lip and`);
			if (canSee(eventSlave)) {
				r.push(`watches you`);
			} else if (canHear(eventSlave)) {
				r.push(`listens`);
			} else {
				r.push(`waits`);
			}
			r.push(`anxiously.`);

			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, [
				new App.Events.Result(`They're not wrong`, wrong, virginityWarning()),
				new App.Events.Result(`Now rape ${him}`, rape2, virginityWarning()),
				new App.Events.Result(`It's not that simple`, simple)
			]);
			return frag;

			function wrong() {
				r = [];

				r.push(`You get to your feet, letting ${him} know that the other slaves weren't wrong. ${His} relief is`);
				if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
					r.push(`palpable as you undo ${his} chastity.`);
				} else {
					r.push(`palpable.`);
				}
				r.push(`You snap your fingers, pointing`);
				if (PC.dick === 0) {
					r.push(`at the floor in front of you`);
					if (!canSee(eventSlave)) {
						r.push(`along with a commanding "floor"`);
					}
					r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by grabbing ${him} on either side of ${his} neck and`);
					if (eventSlave.belly >= 300000) {
						r.push(`pulling onto ${his} ${belly} stomach`);
					} else {
						r.push(`shoving ${him} down to kneel at your feet`);
					}
					r.push(`with ${his} face`);
					if (PC.belly >= 5000) {
						r.push(`crammed under your pregnant belly, level with your cunt.`);
					} else {
						r.push(`level with your cunt.`);
					}
					r.push(`One of your hands shifts behind ${his} head and tilts it back as you step forward, grinding against ${his} mouth. ${He} struggles involuntarily, but then perceptibly recollects ${himself}, relaxes, and starts to eat you out. Whatever internal turmoil ${he}'s working through, you don't care, and neither does your pussy. When you climax and release ${him}, ${he} stumbles off,`);
				} else {
					r.push(`at the couch next to the desk`);
					if (!canSee(eventSlave)) {
						r.push(`along with a commanding "couch"`);
					}
					r.push(r.pop() + `. ${He} hurries over and`);
					if (eventSlave.belly >= 5000) {
						r.push(`gently eases ${his}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`pregnant`);
						} else {
							r.push(`swollen`);
						}
						r.push(`body to the ground,`);
					} else {
						r.push(`kneels,`);
					}
					r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by shoving ${him} down so ${his} collarbone is resting on the back of the couch and ${his} ass is at just the right height. You fuck`);
					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
						r.push(`${his} pussy and then ${his} ass in quick succession, plundering ${his} holes without much regard for ${his} pleasure.`);
						r.push(VCheck.Both(eventSlave, 1));
						r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up ${his} butt.`);
					} else if (canDoVaginal(eventSlave)) {
						r.push(`${his} pussy hard, without much regard for ${his} pleasure.`);
						r.push(VCheck.Vaginal(eventSlave, 1));
						r.push(`${He} gasps and bucks at all the right parts, and even manages to moan almost authentically when you blow your load up deep inside ${him}.`);
					} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
						r.push(`${his} ass hard, without cruelty but without much concern for ${his} pleasure, either.`);
						r.push(VCheck.Anal(eventSlave, 1));
						r.push(`${He} takes it obediently, and does ${his} best to act like ${he}'s enjoying being sodomized.`);
					}
					r.push(`${He} stumbles off to wash,`);
				}
				r.push(`looking <span class="trust inc">much more confident.</span>`);
				eventSlave.trust += 4;
				return r;
			}

			function rape2() {
				r = [];
				r.push(`You get to your feet, letting ${him} know that the other slaves weren't wrong. ${His} relief is palpable, but ${he}'s getting ahead of`);
				if (eventSlave.chastityVagina || !canDoAnal(eventSlave)) {
					r.push(`${himself} as you undo ${his} chastity.`);
				} else {
					r.push(`${himself}.`);
				}
				r.push(`You snap your fingers, pointing`);
				if (PC.dick === 0) {
					r.push(`at the floor in front of you`);
					if (!canSee(eventSlave)) {
						r.push(`along with a commanding "floor"`);
					}
					r.push(r.pop() + `. ${He} hurries over, but hesitates for an instant, unsure of what to do next. You help ${him} understand by slapping ${him}, and when ${he} instinctively cringes away from the blow, poking the back of one of ${his} knees with your foot.`);
					if (eventSlave.belly >= 5000) {
						r.push(`${His}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`gravid`);
						} else {
							r.push(`bloated`);
						}
						r.push(`form`);
					} else {
						r.push(`${He}`);
					}
					r.push(`collapses like a doll with its strings cut, already crying. You seize ${his} head in both hands and ride ${his} sobbing mouth. If ${he} thought that rape required a dick, ${he} was wrong. If ${he} thought that you needed a strap-on to rape ${him}, ${he} was wrong. Your fingers form claws, holding ${his} head in a terrifying grip as you enjoy the not unfamiliar sensation of a slave weeping into your cunt as you grind it against ${his} crying face.`);
				} else {
					r.push(`at the couch next to the desk`);
					if (!canSee(eventSlave)) {
						r.push(`along with a commanding "couch"`);
					}
					r.push(r.pop() + `. ${He} hurries over and`);
					if (eventSlave.belly >= 5000) {
						r.push(`gently eases ${his}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`pregnant`);
						} else {
							r.push(`swollen`);
						}
						r.push(`body to the ground,`);
					} else {
						r.push(`kneels,`);
					}
					r.push(`${his} rear pointing at you, but hesitates for an instant, unsure of what to do next. You help ${him} understand by`);
					if (eventSlave.belly >= 600000) {
						r.push(`slamming your hands against the bloated mass grossly distending ${his} sides,`);
					} else {
						r.push(`jabbing a thumb into one of ${his} kidneys,`);
					}
					r.push(`forcing ${his} back to arch in involuntary response, and then grinding ${his} face into the couch cushions.`);
					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
						r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this, first when you fuck it without mercy, and then when you switch your barely-lubricated dick to ${his} anus.`);
						r.push(VCheck.Both(eventSlave, 1));
						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
					} else if (canDoVaginal(eventSlave)) {
						r.push(`${His} cunt isn't all that wet, and ${he} has cause to regret this as you waste no time with foreplay.`);
						r.push(VCheck.Vaginal(eventSlave, 1));
						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you rape ${him} into inelegant, tearful begging for you to take your dick out of ${his} cunt because it hurts`);
						if (canGetPregnant(eventSlave)) {
							r.push(r.pop() + `, followed by desperate pleas to not cum inside ${him} since it's a danger day`);
						}
						r.push(r.pop() + `.`);
					} else { // FIXME: invalid for when wearing combined chastity belt. Chastity is mentioned to be removed further up.
						r.push(`You spit on ${his} asshole and then give ${him} some anal foreplay, if slapping your dick against ${his} anus twice before shoving it inside ${him} counts as anal foreplay.`);
						r.push(VCheck.Anal(eventSlave, 1));
						r.push(`${He} tries to be brave and relax, but those are contradictory goals and ${he} manages neither as you assrape ${him} into inelegant, tearful begging for you to take your dick out of ${his} butt, because it hurts.`);
					}
					r.push(`It isn't the first time you've heard that, or the hundredth.`);
				}
				r.push(`When you're done, you discard ${him} like the human sex toy ${he} is, and go back to your work. ${He} stumbles off, looking fearful but submissive, knowing that ${he} now has a better idea of what you want, even if what you want isn't very nice.`);
				eventSlave.trust -= 4;
				eventSlave.devotion += 4;
				return r;
			}
			function simple() {
				r = [];
				r.push(`You tell ${him} kindly that it isn't that simple, but that if ${he} obeys orders and does ${his} best, you will like ${him} just fine, and ${he} will do well as your slave. Relief floods through ${him}.`);
				if (!canTalk(eventSlave)) {
					r.push(`${He} gestures ${his} thanks, and an apology for being silly.`);
				} else {
					r.push(
						Spoken(eventSlave, `"Thank you, ${Master} and I'm sorry for being silly,"`),
						`${he} apologizes.`
					);
				}
				r.push(`You dismiss ${him}, and ${he} goes, a strangely respectful look on ${his} face. ${He}'s no more confident of ${his} ability to find safety and stability here with you than ${he} was before, but ${he} seems to like that it apparently isn't as simple as`);
				if (PC.dick !== 0) {
					r.push(`taking your cock up ${his} butt`);
					if (PC.vagina !== -1) {
						r.push(`or`);
					}
				}
				if (PC.vagina !== -1) {
					r.push(`eating you out`);
				}
				r.push(r.pop() + `.`);
				eventSlave.devotion += 4;
				return r;
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canHold,
				canDoAnal,
				s => s.fetish === "buttslut" || (s.energy > 95 && s.fetish !== Fetish.NONE),
				s => s.anus > 2,
				s => s.belly < 300000,
				s => s.rules.release.masturbation === 1,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const pinches = eventSlave.nipples !== "fuckable" ? "pinches" : "fingers";

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`Since ${he} has a little free time this evening,`,
			contextualIntro(V.PC, eventSlave, true),
			`finds a quiet corner and engages in ${his} anal proclivities. Since ${his} asshole is so stretched out, ${he} sticks the base of a huge dildo to the ground and`);
		if (eventSlave.belly >= 100000) {
			r.push(`struggles to lower ${his} heavy, very gravid body down onto it,`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`cautiously lowers ${his}`);
			if (eventSlave.bellyFluid >= 10000) {
				r.push(`${eventSlave.inflationType}-stuffed`);
			} else {
				r.push(`very gravid`);
			}
			r.push(`body on it,`);
		} else if (eventSlave.belly >= 5000) {
			r.push(`delicately lowers ${his}`);
			if (eventSlave.bellyFluid >= 5000) {
				r.push(`bloated`);
			} else {
				r.push(`gravid`);
			}
			r.push(`body on it,`);
		} else {
			r.push(`squats on it,`);
		}
		r.push(`moaning happily as the massive thing inches into ${him}. ${He} starts to slide up and down it`);
		if (hasBothArms(eventSlave)) {
			r.push(`hands-free,`);
		} else {
			r.push(`automatically,`);
		}
		r.push(`so ${he}`);
		if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 5) {
				r.push(`jacks off ${his} huge cock with`);
				if (hasBothArms(eventSlave)) {
					r.push(`both hands.`);
				} else {
					r.push(`${his} hand.`);
				}
			} else if (eventSlave.dick > 2) {
				r.push(`jacks off with`);
				if (!hasBothArms(eventSlave)) {
					r.push(`${his} hand.`);
				} else {
					r.push(`one hand and ${pinches} a nipple with the other.`);
				}
			} else {
				r.push(`rubs ${his} little penis with`);
				if (!hasBothArms(eventSlave)) {
					r.push(`${his} hand.`);
				} else {
					r.push(`one hand and ${pinches} a nipple with the other.`);
				}
			}
		} else if (eventSlave.dick > 5) {
			r.push(`massages ${his} huge, limp cock with`);
			if (hasBothArms(eventSlave)) {
				r.push(`both hands.`);
			} else {
				r.push(`${his} hand.`);
			}
		} else if (eventSlave.dick > 2) {
			r.push(`attempts to jack off ${his} limp dick with`);
			if (!hasBothArms(eventSlave)) {
				r.push(`${his} hand.`);
			} else {
				r.push(`one hand while ${eventSlave.nipples !== "fuckable" ? "pinching" : "fingering"} a nipple with the other.`);
			}
		} else if (eventSlave.dick > 0) {
			r.push(`rubs ${his} little penis with`);
			if (!hasBothArms(eventSlave)) {
				r.push(`${his} hand.`);
			} else {
				r.push(`one hand and ${pinches} a nipple with the other.`);
			}
		} else if (eventSlave.vagina === -1) {
			r.push(`rubs the sensitive area around ${his} asspussy with`);
			if (!hasBothArms(eventSlave)) {
				r.push(`${his} hand.`);
			} else {
				r.push(`one hand and ${pinches} a nipple with the other.`);
			}
		} else {
			r.push(`rubs ${his} clit with`);
			if (!hasBothArms(eventSlave)) {
				r.push(`${his} hand.`);
			} else {
				r.push(`one hand and ${pinches} a nipple with the other.`);
			}
		}
		r.push(`As ${he} enjoys ${himself}, ${his} loose sphincter relaxes further until it's barely gripping the dildo.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Add something to fill ${him} completely`, completely),
			new App.Events.Result(`Let ${him} use a machine`, machine),
			(V.HeadGirlID !== 0 && V.HeadGirlID !== eventSlave.ID)
				? new App.Events.Result(`Call your Head Girl in for double anal`, double)
				: new App.Events.Result(),
		]);

		function completely() {
			r = [];
			r.push(`${He}'s so occupied that ${he} doesn't`);
			if (canHear(eventSlave)) {
				r.push(`hear you`);
			} else {
				r.push(`sense your presence`);
			}
			r.push(`until you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`tip ${him} over face forward. With ${him} on ${his} knees, ${his} dildo-stuffed ass is in the air; ${he}'s still masturbating between ${his} legs. After a moment's consideration, you slide two exploratory fingers in alongside the dildo. ${He} gasps and masturbates harder. Thus encouraged, you shove`);
			if (V.PC.dick === 0) {
				r.push(`the strap-on`);
			} else {
				r.push(`your member`);
			}
			r.push(`in alongside the dildo.`);
			if (eventSlave.voice !== 0) {
				r.push(`${He} screams at the surprise double anal, sobbing and begging,`);
			} else {
				r.push(`${He} screams noiselessly at the surprise double anal, waving ${his} hands in distress,`);
			}
			r.push(`but ${he} doesn't try to stop you and doggedly keeps rubbing. By the time you're finished ${his} asshole is a gaping hole much bigger than the average pussy. ${He} has become more submissive to you.`);
			eventSlave.devotion += 4;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function machine() {
			r = [];
			r.push(`There's no reason for ${him} to do that in a quiet corner. You interrupt ${him} and bring ${him} into your office, setting ${him} up on a machine so ${he} can have that dildo rammed up ${his} ass for as long as ${he} likes. Your office is filled with the rhythmic sounds of a sloppy anus being pounded for a good long while.`);
			if (V.assistant.personality > 0) {
				r.push(`The`);
				switch (V.assistant.appearance) {
					case "monstergirl":
						r.push(`monstrous voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my cocks, slave."`);
						break;
					case "shemale":
						r.push(`sultry voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my dick, bitch."`);
						break;
					case "amazon":
						r.push(`aggressive voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "be a warrior."`);
						break;
					case "businesswoman":
						r.push(`dominant voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "stop struggling and be a good ${girl}."`);
						break;
					case "goddess":
					case "hypergoddess":
						r.push(`calming voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax and accept what you deserve, ${girl}."`);
						break;
					case "loli":
						r.push(`young, naïve voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll get better."`);
						break;
					case "preggololi":
						r.push(`young voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, you know it'll be fun!"`);
						break;
					case "angel":
						r.push(`harmonious voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll be over soon."`);
						break;
					case "cherub":
						r.push(`cheerful voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "relax, it'll feel better if you do!"`);
						break;
					case "incubus":
						r.push(`forceful voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "take my dick, cocksleeve, take it till you split!"`);
						break;
					case "succubus":
						r.push(`sultry voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "enjoy the pounding while it lasts."`);
						break;
					case "imp":
						r.push(`mischievous voice of your assistant's avatar can also be heard, mocking ${eventSlave.slaveName}, "your butthole is going to be so loose after this! You'll be nothing more than a used up whore!"`);
						break;
					case "witch":
						r.push(`uncertain voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "just relax and get it over with."`);
						break;
					case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
						r.push(`unclear voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "scream louder and let it fill your body completely."`);
						break;
					case "schoolgirl":
						r.push(`girly voice of your assistant's avatar can also be heard, encouraging ${eventSlave.slaveName} to "be quiet, or Teacher will hear us."`);
						break;
					default:
						r.push(`poor slave is taken to the very limit by your assistant.`);
				}
				seX(eventSlave, "anal", "assistant", "penetrative");
			} else {
				actX(eventSlave, "anal");
			}
			r.push(`By the time ${he}'s climaxed out, ${he}'s so tired and apathetic that ${he} can't bring ${himself} to get off it or ask for help, so ${he} just relaxes and enjoys the internal massage`);
			if (eventSlave.dick !== 0) {
				r.push(`while ${his} flaccid dick twitches weakly`);
			}
			r.push(r.pop() + `. <span class="trust inc">${He} has become more trusting of you,</span> since you knew just what ${he} needed.`);
			eventSlave.trust += 4;
			return r;
		}

		function double() {
			App.Events.refreshEventArt([eventSlave, S.HeadGirl]);
			const {
				he2, his2, himself2, He2
			} = getPronouns(S.HeadGirl).appendSuffix("2");
			r = [];
			r.push(`When ${S.HeadGirl.slaveName} comes into your office in response to your summons, ${he2} finds ${eventSlave.slaveName} sitting in your lap with your`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`dick`);
			}
			r.push(`up ${his} gaping`);
			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
				r.push(`butt, your bare pussy very visible at the base of your working cock`);
			} else {
				r.push(`butt.`);
			}
			r.push(`${S.HeadGirl.slaveName}'s expression softens when ${he2} realizes ${he2}'s here for pleasure, not business. ${eventSlave.slaveName} gasps a little when ${he}`);
			if (canHear(eventSlave)) {
				r.push(`hears you tell ${S.HeadGirl.slaveName} to join you up ${his} asshole,`);
			} else {
				r.push(`feels you pull apart ${his} asscheeks to make some room for ${S.HeadGirl.slaveName},`);
			}
			r.push(`but ${he} doesn't protest.`);
			if (eventSlave.chastityPenis === 1) {
				r.push(`Since your poor Head Girl can't use ${his2} caged cock, ${he2} takes a dildo and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
			} else if (canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 7) {
				r.push(`Even though your Head Girl is rock-hard and ready to fuck, ${his2} cock is far too large to fit into even the most stretched slave's holes. Sighing, ${he2} takes a dildo and shoves it up ${eventSlave.slaveName}'s already-filled butt instead.`);
			} else if (canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 6) {
				r.push(`Your lusty Head Girl is already hard and forces ${his2} oversized cock up ${eventSlave.slaveName}'s already-filled butt while`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`tweaking`);
				} else {
					r.push(`fingering`);
				}
				r.push(`the moaning slave's nipples.`);
			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.hormoneBalance >= 100) {
				r.push(`Since your poor Head Girl can't get hard due to ${his2} hormone therapy, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.balls > 0 && S.HeadGirl.ballType === "sterile") {
				r.push(`Since your poor Head Girl can't get hard due to ${his2} chemical castration, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado`);
			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.balls === 0) {
				r.push(`Since your poor Head Girl can't get hard due to ${his2} orchiectomy, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
			} else if (!canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 6) {
				r.push(`Since your poor Head Girl is far too big to get hard, much to ${eventSlave.slaveName}'s disappointment, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
			} else if (!canAchieveErection(S.HeadGirl) && S.HeadGirl.dick > 0) {
				r.push(`Since your poor Head Girl can't get it up for one reason or another, ${he2} dons a strap-on over ${his2} flaccid penis and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
			} else if (S.HeadGirl.dick > 0) {
				r.push(`Your lusty Head Girl is already hard and shoves ${himself2} up ${eventSlave.slaveName}'s already-filled butt while`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`tweaking`);
				} else {
					r.push(`fingering`);
				}
				r.push(`the writhing slave's nipples.`);
			} else {
				r.push(`${He2} dons a strap-on and shoves it up ${eventSlave.slaveName}'s already-filled butt without further ado.`);
			}
			r.push(`The two of you jackhammer in and out of ${eventSlave.slaveName}'s ass without mercy; the poor anal whore does ${his} best to relax, but two phalli at once is a lot, even for ${him}. ${He}'s only allowed an anal respite when ${his} sphincter is really fucked out and there's little butthole fun to be had from ${him} any longer. ${He} has become more submissive to you, and ${S.HeadGirl.slaveName} enjoyed taking a break to fuck ${him} with you.`);
			eventSlave.devotion += 4;
			S.HeadGirl.devotion += 4;
			seX(eventSlave, "anal", V.PC, "penetrative");
			seX(eventSlave, "anal", S.HeadGirl, "penetrative");
			if (canImpreg(eventSlave, V.PC)) {
				knockMeUp(eventSlave, 5, 0, -1);
			}
			if (canImpreg(eventSlave, S.HeadGirl)) {
				knockMeUp(eventSlave, 5, 0, V.HeadGirlID);
			}
			return r;
		}
	}
};

repo_name: Ducati/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => s.assignment === Job.PUBLIC,
				s => s.skill.entertainment >= 100,
				s => s.trust > 50,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`It's Friday evening, the most socially important part of the week in ${V.arcologies[0].name}.`,
			contextualIntro(PC, eventSlave, true, false, true),
			`happens to be free this evening, and your schedule is open, too. Lately, ${he}'s been putting on a tour de force of seduction, erotic dance, and lewd entertainment whenever ${he} gets the chance to catch someone's eye`
		);
		if (eventSlave.belly >= 5000) {
			r.push(r.pop() + `, even with ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`advanced pregnancy`);
			} else if (eventSlave.bellyImplant >= 3000) {
				r.push(`${belly} rounded belly`);
			} else {
				r.push(`sloshing ${eventSlave.inflationType}-filled stomach`);
			}
		}
		r.push(r.pop() + `. There are a number of events tonight you could attend with ${him} on your arm.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Go clubbing`, clubbing),
			(eventSlave.belly < 15000)
				? new App.Events.Result(`Attend a milonga`, milonga)
				: new App.Events.Result(),
			new App.Events.Result(`Never mind Friday night; the moon's out and it's romantic on the balcony`, romantic, (eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave) ? PCPenetrationWarning() : 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 clubbing() {
			r = [];
			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door wearing glitzy heels, an extremely short skirt`);
			if (eventSlave.belly >= 5000) {
				r.push(`barely noticeable under ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly`);
			}
			r.push(r.pop() + `, and a string bikini top so brief that ${his} areolae are clearly visible. As you descend through ${V.arcologies[0].name} the beats get faster and the drops get heavier. By the time you reach the club where the Free Cities' hottest DJ has a show tonight, ${eventSlave.slaveName} is a whirlwind of sexual energy in motion, moving`);
			if (canHear(eventSlave)) {
				r.push(`with every beat`);
			} else {
				r.push(`wildly`);
			}
			r.push(`and catching every eye`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth/1.33) {
				r.push(r.pop() + `, despite how far along ${he} is`);
			} else if (eventSlave.belly >= 5000 || eventSlave.weight > 130) {
				r.push(r.pop() + `, despite how big ${he} is`);
			}
			r.push(r.pop() + `. ${His} skills could have half the club lining up to fuck ${him} for money, but tonight ${he}'s all yours. The entire floor is envious of you as the night wears on and ${his} dancing turns into sexually servicing you`);
			if (canHear(eventSlave)) {
				r.push(`in time with the music`);
			}
			r.push(r.pop() + `.`);
			if (eventSlave.chastityPenis === 1) {
				r.push(`The smell of ${his} pre-cum is noticeable even over the stink of sweat.`);
			} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
				r.push(`${His} tiny skirt does nothing to hide ${his} erection.`);
			} else if (eventSlave.clit > 0) {
				r.push(`${His} tiny skirt displays ${his} big, engorged clit.`);
			} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(`${His} arched back and cocked hips make it very clear that ${he} wants ${his} asspussy fucked.`);
			} else {
				r.push(`The smell of ${his} arousal is noticeable even over the stink of sweat.`);
			}
			if (eventSlave.boobs > 1000) {
				r.push(`${His} breasts get groped and mauled all night.`);
			} else if (eventSlave.butt > 5) {
				r.push(`${He} grinds ${his} ass against your crotch all night.`);
			} else {
				r.push(`Cum joins the sweat running off ${him}.`);
			}
			r.push(`The crowd is duly impressed; <span class="green">your reputation has increased.</span>`);
			repX(500, "event", eventSlave);
			return r;
		}

		function milonga() {
			r = [];
			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door wearing classy heels and a gorgeous long dress cunningly designed to adhere to ${him} while ${he} dances despite the fact that it displays all of one leg, ${his} entire back,`);
			if (eventSlave.belly >= 5000) {
				r.push(`${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly,`);
			}
			r.push(`cleavage, and the sides of both breasts. ${He} has ${his} hair up in a perfect bun accented with a spray of the latest jewelry, and is wearing severe makeup that makes ${him} look aristocratic and elegant by turns. The host of the milonga, an old-world tango enthusiast, knows well the social graces and invites you, as the most prominent attendee, to perform the traditional demonstration tango that begins the dance. It goes wonderfully, and the entire party sighs in appreciation as you perform the classic tango. You lower ${eventSlave.slaveName}`);
			if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
				r.push(`'s heavy body`);
			}
			r.push(`gracefully and pull ${him} back up into a close embrace, and breath catches in more than one throat. As tradition dictates ${he} dances with many partners throughout the night. One concession to Free Cities sensibilities is that the male and female roles in the tango may be filled by anyone, and ${eventSlave.slaveName} switches flawlessly between playing the female role to the elderly host one dance and the male role to his teenage granddaughter the next. The poor girl spends the rest of the evening staring at ${eventSlave.slaveName} with her tongue tied. Whoever ${eventSlave.slaveName} dances with, ${he} always subtly shows by glance and gesture that it's you ${he} truly wants. Everyone is quite envious of you; your reputation has increased.`);
			repX(500, "event", eventSlave);
			return r;
		}

		function romantic() {
			r = [];
			r.push(`You inform ${eventSlave.slaveName} of your plans and tell ${him} to get dressed appropriately. ${He} meets you at the door absolutely naked`);
			if (eventSlave.bellyPreg >= 1500) {
				r.push(r.pop() + `, ${his} motherly body on full display`);
			}
			r.push(r.pop() + `. ${He} has half a question on ${his} face, wondering whether this is going too far, but it vanishes when you`);
			if (canSee(eventSlave)) {
				r.push(`smile reassuringly at`);
			} else {
				r.push(`compliment`);
			}
			r.push(`${him}. You take ${him} by the hand and lead ${him} out onto the private balcony outside your office. It's a cloudless night, and the moon is full. You order the arcology to play a classic dance medley, and ${eventSlave.slaveName} becomes all innocence and grace, the perfect dance partner`);
			if (eventSlave.bellyPreg >= 10000) {
				r.push(r.pop() + `, despite ${his} heavy pregnancy`);
			} else if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
				r.push(r.pop() + `, despite ${his} weight`);
			}
			r.push(r.pop() + `. The only real consequence of ${his} nudity is`);
			if (eventSlave.boobs >= 300) {
				r.push(`the extra sway of ${his} breasts,`);
			}
			if (canPenetrate(eventSlave)) {
				r.push(`${his} visible erection, and`);
			} else if (eventSlave.clit > 0) {
				r.push(`${his} visibly engorged clit and`);
			} else if (eventSlave.boobs >= 300) {
				r.push(`and`);
			}
			if (eventSlave.nipples !== "fuckable") {
				r.push(`the hardness of ${his} nipples`);
			} else {
				r.push(`how swollen ${his} nipples are`);
			}
			r.push(`in the cool night when the dance brings you close. ${He} enjoys ${himself} immensely and in no time at all, ${he}'s meekly asking you to take ${him} inside and dance with ${him} on the bed. Naturally, you oblige.`);
			eventSlave.devotion += 3;
			eventSlave.trust += 3;
			if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
				if (PC.vagina >= 0) {
					seX(eventSlave, "penetrative", PC, "vaginal");
					if (canImpreg(PC, eventSlave)) {
						r.push(knockMeUp(PC, 20, 0, eventSlave.ID));
					}
					if (PC.vagina === 0) {
						r.push(r.pop().replace(/.$/, ` <span class="virginity loss">giving ${him} your cherry.</span>`));
						PC.vagina++;
					}
				} else {
					seX(eventSlave, "penetrative", PC, "anal");
					if (canImpreg(PC, eventSlave)) {
						r.push(knockMeUp(PC, 20, 1, eventSlave.ID));
					}
					if (PC.anus === 0) {
						r.push(r.pop().replace(/.$/, ` <span class="virginity loss">giving ${him} your anal cherry.</span>`));
						PC.anus++;
					}
				}
			} else if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave)) {
				r.push(VCheck.Anal(eventSlave, 1));
			} else if (eventSlave.boobs >= 1000) {
				seX(eventSlave, "mammary", PC, "penetrative");
			} else {
				seX(eventSlave, "oral", PC, "penetrative");
			}
			r.push(`${His} <span class="devotion inc">devotion to you</span> and <span class="mediumaquamarine">trust in you</span> have increased.`);
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canTalk,
				s => (canDoAnal(s) || canDoVaginal(s)),
				s => s.anus > 0,
				s => s.vagina !== 0,
				s => s.rules.speech !== "restrictive",
				s => (s.counter.oral + s.counter.vaginal + s.counter.anal).isBetween(900, 1100)
			]
		];
	}

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

		App.Events.drawEventArt(node, slave);

		App.Events.addParagraph(node, [
			`Late one night,`,
			contextualIntro(V.PC, slave, true),
			`comes to see you. Strangely, several of your other slaves are stealing glances at ${him} as ${he} does. ${He} seems oddly proud of ${himself}. Asked why, ${he} ${say}s,`,
			Spoken(slave, `"It's my millenary, ${Master}. The arcology has logged me getting fucked ${num(999)} times."`),
			`The other slaves obviously view it as significant, too.`
		]);
		App.Events.addParagraph(node, [`As the Free Cities grow and evolve, slave culture does too. It seems this is a new tradition among obedient sex slaves. ${He} obviously expects you to do the honors, and it seems the rest of your slaves are looking forward to it.`]);

		let choices = [new App.Events.Result(`Give ${him} ${his} thousandth fuck`, fuck)];
		if (V.slaves.length > 2) {
			choices.push(new App.Events.Result(`Include everyone in ${his} millenary`, everyone));
		}
		if (canDoAnal(slave) && slave.counter.anal !== 0) {
			choices.push(new App.Events.Result(`Drive up ${his} anal count`, drive));
		}
		choices.push(new App.Events.Result(`Send ${him} off`, send));

		App.Events.addResponses(node, choices);

		function fuck(){
			let r = [];
			r.push(`You decide that a slave's thousandth fuck ought to be representative of sexual slavery. So, you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on,`);
			}
			r.push(`push ${him} over`);
			if (slave.belly >= 300000) {
				r.push(`${belly}`);
				if (slave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
			} else {
				r.push(`the arm of the couch next to your desk`);
				if (slave.belly >= 5000) {
					r.push(`so that ${his}`);
					if (slave.bellyPreg >= 3000) {
						r.push(`pregnancy`);
					} else {
						r.push(`${belly} belly`);
					}
					r.push(`hangs off its edge`);
				}
			}
			r.push(`and take ${his}`);
			if (V.seeRace === 1) {
				r.push(slave.race);
			}
			if (!canDoVaginal(slave)) {
				r.push(`ass`);
			} else {
				r.push(`pussy`);
			}
			r.push(`hard and fast, doggy style. ${He}'s clearly got a lot of experience, so ${he} takes the pounding well. Before long ${he}'s happily moaning and begging, pushing ${himself} back into`);
			if (V.PC.vagina !== -1) {
				r.push(`you and using a hand thrust back between ${his} own legs to stimulate your pussy.`);
			} else {
				r.push(`you.`);
			}
			r.push(`You thrust deep inside ${him}. ${He} thanks you and wishes you a happy millenary. <span class="trust inc">${He} has become much more trusting</span> of ${his} place with you.`);
			slave.trust += 10;
			if (canDoVaginal(slave)) {
				r.push(VCheck.Vaginal(slave, 1));
			} else {
				r.push(VCheck.Anal(slave, 1));
			}
			return r;
		}

		function everyone() {
			let r = [];
			r.push(`You decide to celebrate this happy event with everyone. You beckon to the watching`);
			if (V.PC.dick === 0) {
				r.push(`slaves, while you don a strap-on,`);
			} else {
				r.push(`slaves`);
			}
			r.push(`and they come eagerly or sullenly according to their natures. They troop in. After some thought, you position a slave on the couch next to your desk, ${slave.slaveName}`);
			if (hasAllLimbs(slave)) {
				r.push(`on all fours`);
			} else if (hasAnyLegs(slave)) {
				r.push(`knelt over`);
			} else {
				r.push(`propped up`);
			}
			r.push(`in front of ${his} giving cunnilingus, a third slave`);
			if (slave.belly >= 5000) {
				r.push(`squeezed`);
			}
			r.push(`under ${slave.slaveName} to orally service ${him} in turn, and yourself behind ${slave.slaveName} to`);
			if (canDoVaginal(slave)) {
				r.push(`take ${his}`);
				if (V.seeRace === 1) {
					r.push(`${slave.race}`);
				}
				r.push(`pussy.`);
			} else if (canDoAnal(slave)) {
				r.push(`take ${his}`);
				if (V.seeRace === 1) {
					r.push(`${slave.race}`);
				}
				r.push(`ass.`);
			} else {
				r.push(`enjoy ${his}`);
				if (V.seeRace === 1) {
					r.push(`${slave.race}`);
				}
				r.push(`asscheeks.`);
			}
			r.push(`Each slave besides ${slave.slaveName} gets a suck from ${slave.slaveName} on the couch and then slides under ${him} to reciprocate. ${He} works ${his} way through all your slaves one by one, with feminine lips and tongues delighting ${his}`);
			if (slave.dick !== 0 && !(slave.chastityPenis)) {
				r.push(`dickhead`);
			} else if (!canDoVaginal(slave)) {
				r.push(`soft perineum`);
			} else {
				r.push(`clit`);
			}
			r.push(`and your`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`cock`);
			}
			r.push(`gently pumping ${his} butt the whole time. When ${he}'s done, ${he} thanks you exhaustedly and begs you to do this for ${his} next millenary. ${His} love for you has greatly increased.`);
			slave.devotion += 10;
			seX(slave, "oral", "slaves", "penetrative", (V.slaves.length * 2));
			V.slaves.forEach(function(s) { if (s.ID !== slave.ID) { s.counter.oral++; } });
			if (canDoVaginal(slave)) {
				r.push(VCheck.Vaginal(slave, 1));
			} else {
				r.push(VCheck.Anal(slave, 1));
			}
			return r;
		}

		function drive() {
			let r = [];
			const {girlU, himU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
			r.push(`You make a ceremony of querying ${V.assistant.name}, aloud for everyone to hear, into ${slave.slaveName}'s sexual history. ${He} soon realizes`);
			if (canHear(slave)) {
				r.push(`this is a sort of recitation of ${his} service`);
			} else {
				r.push(`what ${V.assistant.name} is detailing`);
			}
			r.push(`for the benefit of the other slaves, and ${he} stands a little straighter. ${His}`);
			if (canSee(slave)) {
				r.push(`${App.Desc.eyesColor(slave)} glitter`);
			} else {
				r.push(`face beams`);
			}
			r.push(`with pride as ${V.assistant.name} finishes, "...and ${his} anus has been penetrated ${slave.counter.anal} times." You announce that ${slave.counter.anal} isn't nearly enough, detail a slave to fetch you a comfortable chair, seat yourself, and draw the compliant ${slave.slaveName}'s head down towards your`);
			if (V.PC.dick === 0) {
				r.push(`pussy.`);
			} else {
				r.push(`cock.`);
			}
			r.push(`${He} gets eagerly to work, surrounded by a circle of slaves staring at the show. You select a favored ${girlU} and tell ${himU} to get to work driving that anal count up. ${slave.slaveName} keeps`);
			if (V.PC.dick === 0) {
				r.push(`eating you out`);
			} else {
				r.push(`sucking your dick`);
			}
			r.push(`as the chosen ${girlU} pulls ${slave.slaveName}'s hips up a little and`);
			if (slave.butt > 18) {
				r.push(`struggles into ${his} immense butt.`);
			} else if (slave.butt > 10) {
				r.push(`pushes between ${his} massive cheeks.`);
			} else if (slave.butt > 5) {
				r.push(`spreads ${his} big buttocks.`);
			} else if (slave.weight > 95) {
				r.push(`spreads ${his} fat rear.`);
			} else if (slave.muscles > 30) {
				r.push(`pushes between ${his} muscular buttocks.`);
			} else {
				r.push(`massages ${his} butt a little.`);
			}
			r.push(`${slave.slaveName} snakes a ${slave.skin} hand down between ${his} legs to`);
			if (slave.chastityPenis === 1) {
				r.push(`tease ${his} chastity bound dick`);
			} else if (canAchieveErection(slave)) {
				r.push(`jack off`);
			} else {
				r.push(`play with ${himself} as much as ${he} can manage`);
			}
			r.push(`as ${his} asshole takes its first fuck of the night. You let ${him} change positions between each slave, and by the end ${he}'s draped limply across the arm of your chair so ${he} can tiredly`);
			if (V.PC.vagina !== -1) {
				r.push(`nibble your pussylips`);
			} else {
				r.push(`suck on your balls one at a time`);
			}
			r.push(`as the last few slaves, taking advantage of ${his} enormously gaped butt, slide lubricated hands in and out of ${his} rectum while giggling at the perversion and playing with each other. As the final slave withdraws their hand, ${slave.slaveName} crawls into your lap and burrows ${his} face`);
			if (V.PC.boobs >= 1400) {
				r.push(`between your enormous`);
				if (V.PC.boobsImplant !== 0) {
					r.push(`fake`);
				}
				r.push(`breasts`);
			} else if (V.PC.boobs >= 1200) {
				r.push(`between your huge`);
				if (V.PC.boobsImplant !== 0) {
					r.push(`fake`);
				}
				r.push(`breasts`);
			} else if (V.PC.boobs >= 1000) {
				r.push(`between your big`);
				if (V.PC.boobsImplant !== 0) {
					r.push(`firm`);
				}
				r.push(`breasts`);
			} else if (V.PC.boobs >= 300) {
				r.push(`between your breasts`);
			} else if (V.PC.title === 0) {
				r.push(`into your flat chest`);
			} else {
				r.push(`into your muscular chest`);
			}
			r.push(`with an exhausted but <span class="devotion inc">relaxed</span> sigh.`);
			slave.devotion += 4;
			slave.trust += 4;
			seX(slave, "oral", V.PC, "penetrative");
			seX(slave, "anal", "slaves", "penetrative", V.slaves.length+1);
			V.slaves.forEach(function(s) { if (s.ID !== slave.ID) { s.counter.penetrative++; } });
			return r;
		}

		function send() {
			let r = [];
			r.push(`${He} leaves sadly, and you can see a few of the other slaves comforting ${him} as they prepare for bed.`);
			if (canPenetrate(slave)) {
				r.push(`To cheer ${him} up, a couple of your slaves let ${him} fuck them before bed.`);
			} else {
				r.push(`To cheer ${him} up, a couple of your slaves get ${him} off before bed.`);
			}
			r.push(`This disappointment <span class="devotion dec">reduces ${his} devotion.</span>`);
			slave.devotion -= 5;
			if (canPenetrate(slave)) {
				seX(slave, "penetrative", "slaves", "anal");
			} else {
				seX(slave, "oral", "slaves", "penetrative", 2);
			}
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.trust > 50,
				s => s.devotion > 20,
				s => s.dick !== 0 || s.vagina !== -1,
				s => s.nipples !== "fuckable",
				s => s.rules.speech === "permissive",
				s => s.piercing.corset.weight === 0,
				s => s.piercing.tongue.weight === 0,
				s => s.piercing.anus.weight === 0,
				s => s.piercing.nipple.weight === 0,
				s => s.piercing.dick.weight === 0,
				s => s.piercing.vagina.weight === 0,
				s => s.lipsTat === 0 || s.lipsTat === "none",
				s => s.vaginaTat === 0 || s.vaginaTat === "none",
			]
		];
	}

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

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

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`is such a good ${SlaveTitle(eventSlave)} that ${he} enjoys being inspected, even if the inspection doesn't immediately transition into sex. At the moment, ${he}'s luxuriating under your gaze, eagerly offering the sight of every`
		);
		if (V.showInches === 2) {
			r.push(`inch`);
		} else {
			r.push(`centimeter`);
		}
		r.push(`of ${his} nude body with you. ${He} is confident in ${his} appearance, and more than happy to share it.`);
		App.Events.addParagraph(node, r);

		r = [];
		if (canSee(eventSlave)) {
			r.push(`Seeing`);
		} else {
			r.push(`Feeling`);
		}
		r.push(`your intent gaze, ${he}`);
		if (SlaveStatsChecker.checkForLisp(eventSlave)) {
			r.push(`lisps,`);
		} else {
			r.push(`asks,`);
		}
		r.push(Spoken(eventSlave, `"${Master}, may I please ask you for something?"`));

		r.push(`At your`);
		if (canSee(eventSlave)) {
			r.push(`nod,`);
		} else {
			r.push(`acknowledgment,`);
		}
		r.push(he);
		if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== Fetish.NONE) {
			if (eventSlave.fetish === Fetish.SUBMISSIVE) {
				r.push(
					`gives a submissive shudder, and turns to show you ${his} bare back.`,
					Spoken(eventSlave, `"${Master}, may I have a corset piercing? I would love to feel more, um, bound. Tied up. Please?"`)
				);
				r.push(`${He} awaits your answer coquettishly,`);
				if (canSee(eventSlave)) {
					r.push(`${his} ${App.Desc.eyesColor(eventSlave)} huge.`);
				} else {
					r.push(`a look of begging on ${his} face.`);
				}
			} else if (eventSlave.fetish === "cumslut") {
				r.push(
					`blows you a wet kiss.`,
					Spoken(eventSlave, `"${Master}, may I have a tongue piercing? It would take my dicksucking to the next level. Please?"`)
				);
				r.push(`${He} sticks out ${his} tongue helpfully, leaving ${his} favorite fuckhole wide open so you can see down ${his} hungry throat.`);
			} else if (eventSlave.fetish === "humiliation") {
				r.push(`blushes with humiliation.`,
					Spoken(eventSlave, `"${Master}, may I have a t-tattoo? L-like, on my face. A mean one. Please?"`)
				);
				r.push(`${He} hangs ${his} head.`);
			} else if (eventSlave.fetish === "buttslut") {
				r.push(`spins around to show off ${his} favorite fuckhole, bending over`);
				if (eventSlave.belly >= 5000) {
					r.push(`as far as ${he} can with ${his} ${belly}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnant`);
					}
					r.push(`belly in the way`);
				} else {
					r.push(`farther than usual`);
				}
				r.push(`to indicate the area between it and`);
				if (eventSlave.vagina > -1) {
					r.push(`${his} cunt.`);
				} else if (eventSlave.balls > 0 && eventSlave.scrotum > 0) {
					r.push(`${his} ballsack.`);
				} else if (eventSlave.dick === 0) {
					r.push(`${his} featurelessly smooth groin and its little cumhole.`);
				} else {
					r.push(`the base of ${his} soft bitchclit.`);
				}
				r.push(Spoken(eventSlave, `"${Master}, may I have a piercing right here? Right below my butthole? It would keep me so ready for a buttfuck. I mean, more than I already am. Please?"`));
				r.push(`The shameless buttslut begins to wink ${his} asshole meaningfully.`);
			} else if (eventSlave.fetish === "boobs") {
				r.push(`wiggles ${his} shoulders to give ${his} boobs some motion.`,
					Spoken(eventSlave, `"${Master}, may I have some nipple piercings? It would be like having someone playing with my nipples, but, like, all the time. Please?"`)
				);
				r.push(`${He} starts to bounce flirtily.`);
			} else if (eventSlave.fetish === "pregnancy") {
				r.push(`blushes suddenly and hangs ${his} head.`);
				if (eventSlave.belly >= 10001) {
					r.push(Spoken(eventSlave, `"${Master}, may I have a piercing? Right here? A big one?" ${He} indicates ${his} popped navel. "I feel it like it would get my belly more attention, plus I'd hate to not take advantage of my new outie. Please?`));
				} else {
					r.push(Spoken(eventSlave, `"${Master}, may I have a tattoo? Right here?"`),
						`${He} indicates ${his}`);
					if (eventSlave.belly > 1500) {
						r.push(`rounded belly.`);
					} else {
						r.push(`abdomen.`);
					}
					r.push(Spoken(eventSlave, `"I would love an advertisement that I want to be, um, filled up.`));
					if (eventSlave.pregKnown === 1) {
						r.push(Spoken(eventSlave, `Well, when I'm empty again.`));
					}
					r.push(Spoken(eventSlave, `Please?"`));
				}
				r.push(`${He}`);
				if (canSee(eventSlave)) {
					r.push(`looks`);
				} else {
					r.push(`gazes`);
				}
				r.push(`at you hopefully.`);
			} else if (eventSlave.fetish === "dom") {
				r.push(`tosses ${his} head, a`);
				if (canSee(eventSlave)) {
					r.push(`gleam in ${his} eye`);
				} else {
					r.push(`devious look on ${his} face`);
				}
				r.push(
					Spoken(eventSlave, `"${Master}, may I have a tattoo? Right here?"`),
					`${He} indicates ${his} eyebrow, temple, and cheek.`,
					Spoken(eventSlave, `"It would be cool if other girls saw me and were all, 'I'm about to get fucked.' Please?"`)
				);
				r.push(`${He} smiles at you hopefully.`);
			} else if (eventSlave.fetish === "sadist") {
				r.push(`tosses ${his} head, a`);
				if (canSee(eventSlave)) {
					r.push(`gleam in ${his} eye.`);
				} else {
					r.push(`malicious look on ${his} face.`);
				}
				if (canAchieveErection(eventSlave)) {
					r.push(Spoken(eventSlave, `"${Master}, may I have a shaft piercing? If I get to stick it in another girl, I'd love to`));
					if (canSee(eventSlave)) {
						r.push(Spoken(eventSlave, `see her face`));
					} else {
						r.push(`feel her shudder`);
					}
					r.push(Spoken(eventSlave, `when that extra little bit of metal slides inside ${him}. Please?"`));
				} else if (eventSlave.dick > 0) {
					r.push(Spoken(eventSlave, `"${Master}, may I have a tongue piercing? If I get to eat another girl out, I'd love to listen to her squeal when that little bit of metal scrapes against her. Please? Please?"`));
				} else {
					r.push(Spoken(eventSlave, `"${Master}, may I have a labia piercing? If I get to trib another girl, I'd love to`));
					if (canSee(eventSlave)) {
						r.push(Spoken(eventSlave, `see her face`));
					} else {
						r.push(Spoken(eventSlave, `feel her shudder`));
					}
					r.push(Spoken(eventSlave, `when that little bit of metal grinds against her. Please?"`));
				}
				r.push(`${He} shudders at the thought,`);
				if (canSee(eventSlave)) {
					r.push(`looking`);
				} else {
					r.push(`gazing`);
				}
				r.push(`at you hopefully.`);
			} else if (eventSlave.fetish === "masochist") {
				r.push(`bites ${his} lower lip, looking aroused.`);
				if (eventSlave.dick > 0) {
					r.push(Spoken(eventSlave, `"${Master}, may I have a dick piercing? Right th-through my cock. Oh f-fuck it would hurt. Please?"`));
				} else {
					r.push(Spoken(eventSlave, `"${Master}, may I have a pussy piercing? Right th-through me. Oh f-fuck it would hurt. Please?"`));
				}
				r.push(`${He} shivers at the thought,`);
				if (canSee(eventSlave)) {
					r.push(`looking`);
				} else {
					r.push(`gazing`);
				}
				r.push(`at you hopefully.`);
			}
		} else {
			r.push(`bats ${his} eyes at you, and turns halfway to display ${his} boobs in profile.`,
				Spoken(eventSlave, `"${Master}, may I have my nipples pierced? It's silly and girly, but I guess— I guess I'd like something silly and girly. Please?"`));
			r.push(`${He} blushes prettily and`);
			if (canSee(eventSlave)) {
				r.push(`looks`);
			} else {
				r.push(`gazes`);
			}
			r.push(`at you hopefully.`);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Perform it yourself`, perform),
			new App.Events.Result(`${He}'s beautiful just the way ${he} is`, beautiful),
			new App.Events.Result(`No, and slaves should not make requests of this kind`, no),
		]);

		function perform() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You stand up from behind your desk and head towards the body modification studio,`);
			if (canSee(eventSlave)) {
				r.push(`crooking a finger at`);
			} else {
				r.push(`calling`);
			}
			r.push(`${him} as you as you go. ${He} follows bouncily, thanking you profusely, and then thanking you again when it becomes apparent to ${him} that you intend to do the body art yourself. ${He} snuggles into the chair, relaxing as the restraints bind ${him} in. They're not really necessary to modify a willing ${girl}, never mind one this enthusiastic, but they could possibly prevent ${him} from flinching, and it's not like ${he} resents being bound at this point.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`Manipulating the machine, you`);
			if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== Fetish.NONE) {
				if (eventSlave.fetish === Fetish.SUBMISSIVE) {
					r.push(`place the first piercing, eliciting a hum of mild pain and abject submission from ${eventSlave.slaveName}. The piercing session goes on and on, with the slave sinking into a boneless, mindless state in which ${his} being is completely in your hands. ${He}'s almost sleepy when you finally release ${him}, but ${he} rises and`);
					if (canSee(eventSlave)) {
						r.push(`turns, craning around to see in the mirror.`);
					} else {
						r.push(`gingerly feeling around ${his} new piercings.`);
					}
					r.push(`${He} <span class="devotion inc">smiles devotedly,</span> and asks you when ${he}'ll be healed enough that ${he} can be laced up.`);
					eventSlave.piercing.corset.weight = 1;
				} else if (eventSlave.fetish === "cumslut") {
					r.push(`hold ${his} mouth agape and place the first piercing. ${He} can't make much of a facial expression with ${his} mouth that wide, but there is a lewd`);
					if (canSee(eventSlave)) {
						r.push(`glint in ${his} eye`);
					} else {
						r.push(`look on ${his} face`);
					}
					r.push(`when ${he} realizes ${he}'s getting more than one. When you're done, ${he}'s sore enough that ${he} gestures ${his} thanks, smiling devotedly, and begs you to try ${him} out when ${he}'s healed up.`);
					eventSlave.piercing.tongue.weight = 2;
				} else if (eventSlave.fetish === "humiliation") {
					r.push(`activate the ink gun, its low buzzing drawing a moan of anticipation out of ${eventSlave.slaveName}. Working at a touchscreen, you exercise your artistic talents, inscribing the slave's status as a sex object on ${his} forehead. The pain is intense, but ${he} tolerates it, the tears running fast out of the corners of ${his} eyes and low groans rising out of ${his} throat. When ${he}'s finally allowed to rise`);
					if (canSee(eventSlave)) {
						r.push(`and sees ${himself} in a mirror,`);
					} else if (canHear(eventSlave)) {
						r.push(`and listens intently on your descriptions of ${his} new face,`);
					}
					r.push(`${he} blushes furiously and cries harder, knowing that ${his} status as a humiliation slut is now permanent. This culmination of ${his} deeply perverse sense of self draws ${him} closer to you.`);
					eventSlave.lipsTat = "degradation";
				} else if (eventSlave.fetish === "buttslut") {
					r.push(`place a spreader to keep ${his} legs and cheeks apart and start piercing. ${He} whines with the pain, and then gasps when ${he} realizes that the piercing is going on much longer than ${he} expected. You give ${him} a couple of huge piercings below ${his} anus, big enough that ${he}'ll never be free of them rubbing against ${his} slutty butthole. Not done yet, you put some small, smooth studs around it, just to make sure nobody can possibly misunderstand where to fuck this bitch. ${He} gets up gingerly, but smiling sluttily.`);
					eventSlave.piercing.anus.weight = 2;
				} else if (eventSlave.fetish === "boobs") {
					if (eventSlave.nipples.includes("inverted")) {
						r.push(`use a couple of its actuators to stimulate ${his} nipples until they're almost all the way protruded, and then direct them to pull them out all the way. ${He} screams wholeheartedly at the pain, yelling on and on until ${he}'s out of breath and relaxes against the restraints, gasping and crying.`);
					} else {
						r.push(`use its actuators to pull ${his} nipples out as far as they will go, forcing a gasp of pain out of ${him}.`);
					}
					r.push(`${He} expects a simple nipple piercing, one for each boob; what ${he} gets is a set of heavy rings in each nipple. ${He}'s no masochist, so the pleasure will come later, but ${he} moans as ${he} feels the gradual addition of weight to ${his} nipples. ${He} rises very carefully, trying to keep ${his} boobs still, and smiles devotedly at you. Soon enough, ${he}'ll be able to orgasm by walking.`);
					eventSlave.piercing.nipple.weight = 2;
				} else if (eventSlave.fetish === "pregnancy") {
					if (eventSlave.belly >= 10001) {
						r.push(`hold ${his} ${belly} stomach steady and pierce ${his} navel with the largest, heaviest ring available. There is a lewd`);
						if (canSee(eventSlave)) {
							r.push(`glint in ${his} eye`);
						} else {
							r.push(`look on ${his} face`);
						}
						r.push(`as ${he} feels the new weight settle against ${his} middle. ${He} rises very carefully, trying to keep ${his} new piercing from moving, and smiles devotedly at you. Soon enough, all eyes will be on ${his} belly as ${he} waddles by.`);
						eventSlave.piercing.navel.weight = 2;
					} else {
						r.push(`activate the ink gun, its low buzzing drawing a moan of anticipation out of ${eventSlave.slaveName}. Working at a touchscreen, you exercise your artistic talents, beautifying ${his}`);
						if (eventSlave.belly >= 150) {
							r.push(`${belly} stomach`);
						} else {
							r.push(`abdomen`);
						}
						r.push(`with an inducement to fuck ${him}.`);
						if (canSee(eventSlave)) {
							if (eventSlave.belly >= 5000) {
								r.push(`${He} can't see what you are inking into the underside of ${his} belly, but ${he} tries anyway.`);
							} else {
								r.push(`${He}'s just able to crane ${his} head enough to see the work, and eagerly watches.`);
							}
							r.push(`When you're done, ${he} stares at ${himself} for a long time,`);
						} else {
							r.push(`Once you finish ${his} new tattoo, you describe it to ${him} in detail. ${He} pauses for a moment,`);
						}
						r.push(`a curiously mixed expression on ${his} face. This is ${his} life now; it's permanently a part of ${him}, and <span class="devotion inc">${he} knows it.</span>`);
						eventSlave.vaginaTat = "lewd crest";
					}
				} else if (eventSlave.fetish === "dom") {
					r.push(`activate the ink gun, its low buzzing drawing a moan of anticipation out of ${eventSlave.slaveName}. Working at a touchscreen, you exercise your artistic talents, making the side of ${his} face fierce with tribal patterns. Tattooing over such thin and sensitive skin is intensely painful, but ${he} tolerates it, permitting nothing but a low and continuing growl to escape. ${He}'s obviously tired out by the pain when ${he}'s finally allowed to rise, but ${he}`);
					if (canSee(eventSlave)) {
						r.push(`looks at ${himself} in the mirror`);
					} else if (canHear(eventSlave)) {
						r.push(`listens to your description`);
					} else {
						r.push(`traces the design with ${his} fingertips`);
					}
					r.push(`with <span class="devotion inc">obvious approval.</span>`);
					eventSlave.lipsTat = "tribal patterns";
				} else if (eventSlave.fetish === "sadist") {
					if (canAchieveErection(eventSlave)) {
						r.push(`take hold of ${his} most intimate parts and put a set of massive piercings straight through ${his} shaft. ${He} shrieks with agony, the noise going on and on before diminishing into breathless sobbing. Much later, when ${he} gets gingerly up from the chair, ${he} doesn't look eager to stick ${his} cock in anything, but ${he}'s thankful enough.`);
						eventSlave.piercing.dick.weight = 2;
					} else if (eventSlave.dick > 0) {
						r.push(`hold ${his} mouth agape and place the first piercing. ${He} can't make much of a facial expression with ${his} mouth that wide, but there is a lewd`);
						if (canSee(eventSlave)) {
							r.push(`glint in ${his} eye`);
						} else {
							r.push(`look on ${his} face`);
						}
						r.push(`when ${he} realizes ${he}'s getting more than one. When you're done, ${he}'s sore enough that ${he} gestures ${his} thanks, smiling devotedly; ${he} looks eager to try out ${his} new piercing on a fresh pussy.`);
						eventSlave.piercing.tongue.weight = 2;
					} else {
						r.push(`take hold of ${his} most intimate parts and put a set of massive piercings straight through ${his} pussylips. ${He} shrieks with agony, the noise going on and on before diminishing into breathless sobbing. Much later, when ${he} gets gingerly up from the chair, ${he} doesn't look eager to trib anything, but ${he}'s thankful enough.`);
						eventSlave.piercing.vagina.weight = 2;
					}
				} else if (eventSlave.fetish === "masochist") {
					r.push(`take hold of ${his} most intimate parts and put a series of massive piercing straight through ${his}`);
					if (eventSlave.dick > 0) {
						r.push(`shaft.`);
						eventSlave.piercing.dick.weight = 2;
					} else {
						r.push(`pussylips.`);
						eventSlave.piercing.vagina.weight = 2;
					}
					r.push(`${He} shrieks with agony and then orgasms as strongly as you've ever seen a slave climax, ${his} every fiber tensing against the restraints. For a long, long time ${he} has to work to breathe, the overstimulation clearing slowly. When you finally let ${him} up, ${he} hasn't remembered how to talk yet, but ${his} gaze says it for ${him}. It looks like ${he}'s just had the best sex of ${his} life.`);
				}
			} else {
				if (eventSlave.nipples.includes("inverted")) {
					r.push(`use a couple of its actuators to stimulate ${his} nipples until they're almost all the way protruded, and then direct them to pull them out all the way. ${He} screams wholeheartedly at the pain, yelling on and on until ${he}'s out of breath and relaxes against the restraints, gasping and crying.`);
				} else {
					r.push(`use its actuators to pull ${his} nipples out as far as they will go, forcing a gasp of pain out of ${him}.`);
				}
				r.push(`This done, you give ${him} a simple pair of barbell nipple piercings. The machine makes this take less time than it takes to describe it, and after a shocked squeal of pain ${he}'s released. ${He} rises carefully, trying to keep ${his} boobs still, and smiles thankfully at you. ${He}`);
				if (canSee(eventSlave)) {
					r.push(`glances at ${himself} in the mirror,`);
				} else {
					r.push(`listens to your description of ${him},`);
				}
				r.push(`looking pleased.`);
				eventSlave.piercing.nipple.weight = 1;
			}
			eventSlave.devotion += 5; // TODO: consider surgeryDamage
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function beautiful() {
			eventSlave.trust += 4;
			return `You tell ${him} firmly that ${he}'s beautiful just the way ${he} is. ${He} blushes and giggles at the absurdly trite statement. You conclude the inspection, and ${he} continues on to the next item in ${his} life as a sex slave, pleased and reassured that you have a plan for what ${he} should look like.`;
		}

		function no() {
			V.modRequestsAllowed = 0;
			return `You tell ${him} firmly that you don't intend to apply body modifications to ${him}, your tone communicating that further requests on this subject are not permitted. ${He} understands clearly and looks a little crushed, but trusts that ${he} won't be punished for violating a rule you hadn't promulgated. You repair the oversight immediately, directing your personal assistant to spread notice that decisions about body modifications are yours alone.`;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.devotion.isBetween(50, 75),
				s => s.rules.living === "luxurious",
			]
		];
	}

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

		App.Events.drawEventArt(node, slave);

		let r = [];
		r.push(`Early to bed and early to rise makes an arcology owner healthy, wealthy, and wise. It also allows you to enjoy the beautiful sunrises. The degradation of the planet does have its advantages: all the rubbish in the air often paints the morning light a striking color, and this is one such morning. Taken with the grandeur, you step out onto a balcony to take it in, only to find`);
		r.push(contextualIntro(V.PC, slave, true));
		r.push(`out there already, doing just the same thing. The luxurious rules ${he} enjoys offer ${him} small breaks here and there, and ${he}'s obviously come out to enjoy`);
		if (canSee(slave)) {
			r.push(`the sight`);
		} else {
			r.push(`the morning breeze and the warmth of the rising sun on ${his} face`);
		}
		r.push(`before starting ${his} day's work.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`${He} notices your approach with a start and`);
		if (!canTalk(slave)) {
			r.push(`asks with a gesture that carries just the right mixture of submission and respect if ${he} can serve you in any way.`);
		} else {
			r.push(
				`asks respectfully,`,
				Spoken(slave, `"May I serve you in any way, ${Master}?"`)
			);
		}
		r.push(`You shake your head no, for the moment, and just enjoy the view. After a few minutes of silent mutual enjoyment of the pretty sunrise, ${he} steals a sidelong glance at you, a hesitant, questioning look on ${his} face. You tell ${him} to ask ${his} question, whatever it is, and ${he}`);
		if (!canTalk(slave)) {
			r.push(`carefully uses ${his}`);
			if (hasBothArms(slave)) {
				r.push(`hands`);
			} else {
				r.push(`hand`);
			}
			r.push(`to ask if ${he} can hold your hand.`); // ???
		} else {
			r.push(
				`${say}s,`,
				Spoken(slave, `"${Master}, may I please hold your hand?"`)
			);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Slaveowners do not hold their slaves' hands`, no),
			new App.Events.Result(`Hold ${his} hand`, hold),
			(canDoAnal(slave))
				? 	new App.Events.Result(`Buttfuck ${him} against the railing`, buttfuck, (slave.anus === 0) ? `This option will take ${his} anal virginity` : null)
				: new App.Events.Result(),
			(canDoVaginal(slave))
				? 	new App.Events.Result(`Fuck ${him} against the railing`, fuck, (slave.vagina === 0) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
		]);

		function no() {
			r = [];
			if (canSee(slave)) {
				r.push(`You shake your head sternly.`);
			} else {
				r.push(`You say nothing but don't take ${his} hand.`);
			}
			r.push(`${He} looks neither afraid nor crushed, but simply gazes properly at you, clearly waiting for punishment. When none comes, ${he} accepts that it was not culpably wrong of ${him} to ask, but that the answer is no. ${He} leaves the balcony feeling reassured about ${his} place in ${V.arcologies[0].name} — a little more independent of ${his} ${getWrittenTitle(slave)} and yet a little more inured to the reality of his control. ${He} is a proper devoted slave and will remain so.`);
			return r;
		}

		function hold() {
			r = [];
			if (canSee(slave)) {
				r.push(`You nod without taking your eyes off the blazing horizon.`);
			} else {
				r.push(`You take ${his} hand without taking your eyes off the blazing horizon.`);
			}
			r.push(`${His}`);
			if (slave.height >= 185) {
				r.push(`hand is almost as large as yours,`);
			} else if (slave.height >= 170) {
				r.push(`hand fits into yours,`);
			} else if (slave.height >= 160) {
				r.push(`small hand fits comfortably into yours,`);
			} else if (slave.height >= 150) {
				r.push(`petite hand slides into yours,`);
			} else {
				r.push(`tiny hand nestles into yours,`);
			}
			r.push(`and`);
			if (slave.muscles > 30) {
				r.push(`${his} grip is extremely powerful.`);
			} else if (slave.muscles > 5) {
				r.push(`${his} grip surprisingly strong.`);
			} else {
				r.push(`${his} grip is soft and feminine.`);
			}
			r.push(`Through ${his} hand you feel ${him} give a little shiver and relax. It's not difficult to sense ${his} emotions as the two of you stand there gazing at the rising sun: ${he}'s reassessing who ${he} is in light of ${his} growing devotion to you, drawing emotional strength from the strong grip that gently encircles ${his} hand.`);
			slave.devotion += 4;
			return r;
		}

		function fuckResponse() {
			r = [];
			r.push(`You move quietly over to ${him} and encircle ${him} with your arms, holding both ${his} hands over ${his} ${belly}`);
			if (slave.pregKnown === 1) {
				r.push(`pregnant`);
			}
			r.push(`belly with both of yours. ${He} relaxes into your`);
			if (V.PC.boobs >= 1400) {
				r.push(`enormous`);
				if (V.PC.boobsImplant !== 0) {
					r.push(`fake`);
				}
				r.push(`breasts`);
			} else if (V.PC.boobs >= 1200) {
				r.push(`huge`);
				if (V.PC.boobsImplant !== 0) {
					r.push(`fake`);
				}
				r.push(`breasts`);
			} else if (V.PC.boobs >= 1000) {
				r.push(`big`);
				if (V.PC.boobsImplant !== 0) {
					r.push(`firm`);
				}
				r.push(`breasts`);
			} else if (V.PC.boobs >= 800) {
				r.push(`breasts`);
			} else if (V.PC.boobs >= 650) {
				r.push(`breasts`);
			} else if (V.PC.boobs >= 500) {
				r.push(`average breasts`);
			} else if (V.PC.boobs >= 300) {
				r.push(`small breasts`);
			} else if (V.PC.title === 0) {
				r.push(`flat chest`);
			} else {
				r.push(`chest`);
			}
			r.push(`for a few moments until ${he} feels your`);
			if (V.PC.dick === 0) {
				r.push(`building warmth`);
			} else {
				r.push(`hardening member`);
			}
			r.push(`against`);
			if (slave.height >= 160) {
				r.push(`${his} ass.`);
			} else {
				r.push(`${his} lower back.`);
			}
			r.push(`${He} automatically begins to rub ${himself} up and down to stimulate you; once ${he} feels you reach`);
			if (V.PC.dick === 0) {
				r.push(`full arousal`);
			} else {
				r.push(`rock hardness`);
				if (V.PC.vagina !== -1) {
					r.push(`and total wetness`);
				}
			}
			r.push(he);
			return r;
		}

		function buttfuck() {
			r = [...fuckResponse()];
			if (slave.height >= 170) {
				r.push(`leans into the rail, bending over it just slightly to offer ${his} asshole at just the right height.`);
			} else {
				r.push(`hikes ${himself} up on the rail, up on tiptoe, to bring ${his} asshole to the most comfortable height.`);
			}
			r.push(`${He} moans a little as you`);
			if (V.PC.dick === 0) {
				r.push(`pull on your trusty vibrating strap-on and`);
			}
			r.push(`enter ${his} butt, but ${he} keeps ${his} gaze on the fiery horizon. ${He} extricates ${his} hands from yours to stabilize ${himself} against the railing, leaving you free to gently massage ${his} breasts in time with your slow thrusts. ${He} does not climax, but after you do ${he} turns halfway within your arms and kisses you impulsively. ${He} leaves the balcony with a small smile on ${his} face.`);
			r.push(VCheck.Anal(slave, 1));
			slave.devotion += 4;
			return r;
		}

		function fuck() {
			r = [...fuckResponse()];
			if (slave.height >= 170) {
				r.push(`leans into the rail, bending over it just slightly to offer ${his} pussy at just the right height`);
			} else {
				r.push(`hikes ${himself} up on the rail, up on tiptoe, to bring ${his} pussy to the most comfortable height.`);
			}
			r.push(`${He} moans a little as you`);
			if (V.PC.dick === 0) {
				r.push(`pull on your trusty vibrating strap-on and`);
			}
			r.push(`enter ${his} depths, but ${he} keeps ${his} gaze on the fiery horizon. ${He} extricates ${his} hands from yours to stabilize ${himself} against the railing, leaving you free to gently massage ${his} breasts in time with your slow thrusts. ${He} does not climax, but after you do ${he} turns halfway within your arms and kisses you impulsively. ${He} leaves the balcony with a small smile on ${his} face.`);
			r.push(VCheck.Vaginal(slave, 1));
			slave.devotion += 4;
			return r;
		}
	}
};