code:
App.Events.RESSNotMyName = class RESSNotMyName 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 => canDoAnal(s),
				s => s.anus > 0,
				s => s.slaveName !== s.birthName,
				s => s.birthName !== "",
				s => s.devotion <= 20,
				s => s.trust >= -20,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		const birthName = Spoken(eventSlave, eventSlave.birthName);
		const slaveName = Spoken(eventSlave, eventSlave.slaveName);

		let r = [];
		r.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		r.push(`is not yet broken to your will. With your experience with slaves, you've been expecting ${him} to take some opportunity of exercising ${his} remaining independence. You don't have long to wait. One day, you give ${him} inconsequential orders, naturally addressing ${him} by ${his} slave name, ${eventSlave.slaveName}. ${He} replies`);
		if (eventSlave.lips > 70) {
			r.push(`waspishly through ${his} dick-sucking lips,`);
		} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
			r.push(`waspishly through ${his} heavily-pierced lips,`);
		} else {
			r.push(`waspishly,`);
		}
		r.push(
			Spoken(eventSlave, `"${Master}, my name is ${birthName}."`),
			`${He} sets ${his} jaw and`
		);
		if (canSee(eventSlave)) {
			r.push(`manages to meet your eyes without flinching.`);
		} else {
			r.push(`meets your glare with a look of defiance.`);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Extirpate this foolishness with pain`, exptirpate),
			new App.Events.Result(`Allow ${him} to resume ${his} birth name`, allow),
			new App.Events.Result(`Allow ${him} to resume ${his} birth name, but make it publicly humiliating`, humiliate, `This may impact ${his} sexuality.`),
			V.arcade > 0
				? 	new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
				: 	new App.Events.Result(),
		]);

		function exptirpate() {
			r = [];
			r.push(`You seize ${him} and begin to bind ${him} for appropriate punishment. ${eventSlave.slaveName} does not resist you physically at first. ${He} finds ${himself} tied bent over your desk, face-down, with ${his} ${arms} locked behind ${him}`);
			if (eventSlave.belly >= 1500) {
				r.push(`and ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
				r.push(`belly hanging off the edge`);
			}
			r.push(r.pop() + ".");
			r.push(`${He} struggles a little when you insert your`);
			if (V.PC.dick > 0) {
				r.push(`cock`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`into ${his}`);
			if (eventSlave.anus === 1) {
				r.push(`poor little anus,`);
			} else if (eventSlave.anus === 2) {
				r.push(`whore's butt,`);
			} else {
				r.push(`gaping rear end,`);
			}
			r.push(`but ${his} real agony begins when you place ${his} ${arms} in an inescapable joint lock and apply a little pressure. It doesn't damage ${him}, but it easily causes more pain than ${he} is capable of resisting. ${He} does a little dance within ${his} bindings, squealing and involuntarily clenching you nicely with ${his} anal ring. You require ${him} to recite the litany`,
				Spoken(eventSlave, `"My name is ${slaveName}!",`),
				`coaching ${him} with alternate orders and agonizing correction until ${he}'s screaming every word at the top of ${his} lungs in an endless wail. ${His} screeching rises and falls as ${he} feels the burning sensation of your merciless use of ${his} ass, but ${he} works ${his} lungs hard to avoid as much pain as ${he} can. When you've climaxed and cast off ${his} bindings, you make ${him} repeat ${his} name one last time as ${he} stiffly rubs ${his} abused ${arms} and anus. ${He} does, without hesitation.`);
			eventSlave.trust -= 5;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function allow() {
			eventSlave.trust += 15;
			eventSlave.devotion -= 5;
			eventSlave.slaveName = eventSlave.birthName;
			return `You calmly and charitably tell ${him} that that's acceptable; ${he} can be ${eventSlave.birthName} again. ${He} has the wit to be worried, but ${he} soon finds that ${his} fears are unjustified. You offer no condition or "catch" with this bit of generosity; it seems all ${he} really had to do was ask. You usher the stunned ${SlaveTitle(eventSlave)} out of your office and on to ${his} duties before ${he} can even offer a perfunctory "thanks". Over the next week, it's clear that while ${eventSlave.slaveName} — no, ${eventSlave.birthName} — is not sure what to think of you now, it's clear that ${he} is at least less afraid of you.`;
		}

		function humiliate() {
			r = [];
			r.push(`You calmly and charitably tell ${him} that that's acceptable; ${he} can be ${eventSlave.birthName} again. ${He} has the wit to be worried, and ${he} soon finds that ${his} fears are not unjustified. You bring ${him} out to`);
			if (V.club) {
				r.push(V.clubName);
			} else {
				r.push(`a public club,`);
			}
			r.push(
				`and explain with equanimity that ${he} has two choices: ${he} can either introduce ${himself} to strangers by name and offer them free oral sex, or ${he} can be whipped until ${he} introduces ${himself} to strangers by name and offers them free oral sex. ${His} lip quivers a little, but ${he} stumbles over to a nearby group of local worthies and whimpers hesitantly,`,
				Spoken(eventSlave, `"H-hi, my name is ${slaveName}, can I suck you off, please?"`),
				`They laugh, and understanding the situation perfectly, give you a grateful wave even as their leader pushes ${him} to ${his} knees. For the rest of the week, ${he}'s seeing to ${his} duties, sleeping, or blowing strangers after telling them ${his} name. Though ${he} has reassumed ${his} birth name, it is no longer any source of independence to ${him}.`
			);
			repX(500, "event", eventSlave);
			eventSlave.trust -= 5;
			eventSlave.slaveName = eventSlave.birthName;
			seX(eventSlave, "oral", "public", "penetrative", 50);
			V.oralTotal += 50;
			if (random(1, 100) > 50) {
				r.push(`The experience has given ${him} an <span class="fetish gain">interest in humiliation.</span>`);
				eventSlave.fetishStrength = 10;
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
			}
			return r;
		}

		function arcade(){
			r = [];
			r.push(`${eventSlave.slaveName} screams and begs when ${he} realizes what ${his} punishment is, but you are obdurate.`);
			if (eventSlave.muscles > 30) {
				r.push(`${His} powerful form has to be sedated for immurement in the arcade.`);
			} else if (eventSlave.weight >= 190) {
				r.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`);
			} else if (eventSlave.belly >= 120000) {
				r.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`);
			} else if (eventSlave.weight >= -10) {
				r.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`);
			} else if (eventSlave.belly >= 1500) {
				r.push(`${His}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				} else {
					r.push(belly);
				}
				r.push(`body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`);
			} else if (eventSlave.muscles < -15) {
				r.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`);
			} else {
				r.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`);
			}
			r.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} ${eventSlave.skin} butt as ${he} wriggles desperately against ${his} restraints.`);
			assignJob(eventSlave, "be confined in the arcade");
			eventSlave.sentence = 4;
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.fetishKnown === 1,
				s => s.energy > 95,
				s => s.devotion > 20,
				s => s.rules.release.masturbation === 1
			]
		];
	}

	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;
		const {himA} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.drawEventArt(node, eventSlave);

		const r = new SpacedTextAccumulator(node);
		r.push(
			`You pass one of the penthouse's several supply closets by chance, and are surprised to hear ${V.assistant.name}'s voice inside. Oddly, there seems to be more than one of ${himA}. You open the door on a whim, to find that almost every one of the dildo machines in the closet is currently fucking`,
			contextualIntro(PC, eventSlave, true)
		);
		if (eventSlave.belly >= 500000) {
			r.addToLast(`, atop ${his}`);
			if (eventSlave.bellyPreg >= 5000) {
				r.push(`excited and wriggling mass of children`);
			} else {
				r.push(`over-inflated sphere of a stomach`);
			}
		} else {
			r.addToLast(`, on`);
			if (hasAllLimbs(eventSlave)) {
				r.push(`all fours`);
			} else {
				r.push(`the ground`);
			}
		}
		r.push(`in the middle of the room with the machines all around ${him}. ${He} has`);
		if (canDoVaginal(eventSlave)) {
			if (eventSlave.vagina > 2) {
				r.push(`two large dildos working ${his} gaping cunt,`);
			} else if (eventSlave.vagina > 1) {
				r.push(`a large dildo working ${his} cunt,`);
			} else if (eventSlave.vagina > 0) {
				r.push(`a dildo working ${his} tight pussy,`);
			}
		}
		if (canDoAnal(eventSlave)) {
			if (eventSlave.anus > 2) {
				r.push(`two large dildos fucking ${his} enormous butthole,`);
			} else if (eventSlave.anus > 1) {
				r.push(`a large dildo fucking ${his} butthole,`);
			} else if (eventSlave.anus > 0) {
				r.push(`a dildo fucking ${his} tight butt,`);
			}
		}
		if (eventSlave.boobs > 1200) {
			r.push(`has lubricated ${his} cavernous cleavage to titfuck another,`);
		} else if (eventSlave.boobs > 400) {
			r.push(`has lubricated ${his} cleavage to titfuck another,`);
		}
		if (eventSlave.nipples === "fuckable") {
			r.push(`has a pair pistoning in and out of ${his} nipples,`);
		}
		if (hasAnyArms(eventSlave)) {
			r.push(`is performing`);
			if (!hasBothArms(eventSlave)) {
				r.push(`a frantic handjob,`);
			} else {
				r.push(`two handjobs at once, to either side,`);
			}
		}
		if (eventSlave.belly >= 5000) {
			r.push(`has lubricated the sides of ${his} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnancy`);
			}
			r.addToLast(`, along with ${his} inner thighs, to create a sort of belly job,`);
		}
		if (eventSlave.skill.oral >= 60) {
			r.push(`and is making use of ${his} outstanding oral skills to suck off two more.`);
		} else if (eventSlave.skill.oral > 30) {
			r.push(`and is taking a throatfuck from one more.`);
		} else {
			r.push(`and is giving the final one a blowjob.`);
		}
		r.push(`When ${he}`);
		if (canSee(eventSlave)) {
			r.push(`sees that you've entered — which takes a while, since ${he}'s distracted`);
		} else if (canHear(eventSlave)) {
			r.push(`hears that you've entered — which takes a while, given the amount of noise`);
		} else {
			r.push(`realizes that you've entered — which takes a while, considering ${his} state`);
		}
		r.push(`— ${he} tries to smile`);
		if (hasAnyArms(eventSlave)) {
			r.push(`and wave`);
		}
		r.addToLast(`.`);
		r.toParagraph();
		r.push(`The source of the many-voiced personal assistant becomes clear: probably on the incorrigible ${eventSlave.slaveName}'s request, your sultry personal assistant is voicing each and every one of the machines. When the nymphomaniac masturbator tries to smile`);
		if (hasAnyArms(eventSlave)) {
			r.push(`and wave`);
		}
		r.addToLast(`, there's an absolute chorus of "Back to work, slut", "Smile less, suck more", "Take it, bitch", et cetera. Yet another instance of ${V.assistant.name} chuckles in your ear. "Care to join in, ${properTitle()}? I'm sure we can find room somewhere."`);

		r.toParagraph();

		const _cumSlaves = cumSlaves().filter(s => isSlaveAvailable(s) && canPenetrate(s)); // add additional filters
		App.Events.addResponses(node, [
			new App.Events.Result(`No, spectate and relax with ${him} afterward`, spectate),
			new App.Events.Result(`Tour ${his} holes`, tour, virginityWarning()),
			_cumSlaves.length >= 5
				? new App.Events.Result(`Replace the machines with cockmilkees from the Dairy`, replace, virginityWarning())
				: new App.Events.Result(),
		]);

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

		function spectate() {
			const r = new SpacedTextAccumulator();
			r.push(`You leave for a moment, but return quickly with a chair and a refreshing beverage so you can sit and enjoy the spectacle. It's hard to tell, but you're reasonably sure ${eventSlave.slaveName} is flattered by your interest. ${capFirstChar(V.assistant.name)} does not let ${him} go for a long time, however, and when ${he} finally retracts all the phalli, ${eventSlave.slaveName} collapses weakly to the sweat-stained floor.`);
			if (eventSlave.belly >= 300000) {
				r.push(`You try to gather the limp nympho in your arms, but ${his} ${belly} is far too heavy to carry, so you settle for assisting ${him} to your private bath, which is all ready and filled with steaming water. ${eventSlave.slaveName} groans with pleasure as you help ${him} into the water and slip in beside ${him}.`);
			} else {
				r.push(`You gather the limp nympho in your arms and carry ${him} to your private bath, which is all ready and filled with steaming water. ${eventSlave.slaveName} groans with pleasure as you lower ${him}, still cradled in your arms, into the water.`);
			}
			r.push(`${He} nuzzles ${his} ${eventSlave.skin} cheek against your`);
			if (V.PC.boobs >= 300) {
				r.push(`breasts,`);
			} else {
				r.push(`chest,`);
			}
			r.push(`<span class="devotion inc">eyes closed in bliss.</span>`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function tour() {
			const r = new SpacedTextAccumulator();
			r.push(`The polite thing to do would be to instruct ${V.assistant.name} to retract a dildo before replacing it with`);
			if (V.PC.dick === 0) {
				r.push(`a strap-on.`);
			} else {
				r.push(`your dick.`);
			}
			r.push(`You are not, however, feeling particularly polite. ${eventSlave.slaveName} writhes in anguish when ${he} feels an additional phallus forcing its way past ${his} lips. ${He} tries to relax but loses control and spasms; the throat fucking continues unmercifully and in short order ${he} is gagging desperately. Each of ${his} holes receives the same treatment in turn; all ${he} manages to do in response is writhe here and there, and squeal incoherently whenever ${his} mouth isn't totally full. ${He} has become more submissive to you.`);
			r.push(VCheck.Both(eventSlave, 1));
			eventSlave.devotion += 4;
			if (eventSlave.vagina === 1 && canDoVaginal(eventSlave)) {
				r.push(`${His} tight pussy <span class="lime">isn't so tight any more.</span>`);
				eventSlave.vagina += 1;
			}
			if (eventSlave.anus === 1 && canDoAnal(eventSlave)) {
				r.push(`${His} tight butt <span class="lime">has been loosened by the double anal.</span>`);
				eventSlave.anus += 1;
			}
			if (eventSlave.nipples === "fuckable") {
				seX(eventSlave, "mammary", V.PC, "penetrative");
				seX(eventSlave, "mammary", "assistant", "penetrative");
			}
			const skillIncrease = 10;
			if (eventSlave.skill.anal <= 10 && canDoAnal(eventSlave)) {
				r.push(`${He} can't help but learn how to take a rough buttfuck.`);
				r.push(slaveSkillIncrease(`anal`, eventSlave, skillIncrease));
			}
			if (eventSlave.skill.oral <= 10) {
				r.push(`${He} can't help but learn how to deepthroat.`);
				r.push(slaveSkillIncrease('oral', eventSlave, skillIncrease));
			}
			r.toParagraph();
			return r.container();
		}

		function replace() {
			const r = new SpacedTextAccumulator();
			r.push(`Some minutes later ${eventSlave.slaveName} feels one of the dildos retract and wriggles in protest. ${He}'s not long disappointed, though, as ${he} immediately feels it replaced by a turgid dick. You and ${V.assistant.name} stage-manage, and it isn't easy. Getting all the cocks into ${him} requires some creative choreography; quite apart from the limits of even ${his} well-used holes, it's hard just figuring out where everyone ought to stand. The cockmilked slaves are used to coming fast, and they do here, too, so there's also the necessity of switching them out periodically. Eventually you tire of the amusement and direct the Dairy bitches to clean up, which is no mean job, since ${eventSlave.slaveName} is by now lying in a pool of sweat and cum. But mostly cum. Despite the mess, everyone enjoys themselves immensely.`);
			if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) {
				r.push(`${He} certainly <span class="virginity loss">isn't a virgin any more.</span>`);
				eventSlave.vagina += 1;
			}
			if (eventSlave.anus === 0 && canDoAnal(eventSlave)) {
				r.push(`${His} virgin butt <span class="virginity loss">has been broken in.</span>`);
				eventSlave.anus += 1;
			}
			eventSlave.devotion += 4;
			_cumSlaves.forEach(cumSlave => {
				cumSlave.devotion += 4;
				actX(cumSlave, "penetrative");
				if (canImpreg(eventSlave, cumSlave)) {
					if (canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
						r.push(knockMeUp(eventSlave, 5, 2, cumSlave.ID));
					} else if (canDoVaginal(eventSlave)) {
						r.push(knockMeUp(eventSlave, 5, 0, cumSlave.ID));
					} else if (canDoAnal(eventSlave)) {
						r.push(knockMeUp(eventSlave, 5, 1, cumSlave.ID));
					}
				}
			});
			if (eventSlave.nipples === "fuckable") {
				seX(eventSlave, "mammary", V.PC, "penetrative", _cumSlaves.length);
			}
			if (canDoAnal(eventSlave)) {
				seX(eventSlave, "anal", V.PC, "penetrative", _cumSlaves.length);
			}
			if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", V.PC, "penetrative", _cumSlaves.length);
			}
			seX(eventSlave, "oral", V.PC, "penetrative", _cumSlaves.length);
			r.toParagraph();
			return r.container();
		}
	}
};

repo_name: Banyanael/fc

license: mit


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

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(`At appropriate intervals during the day ${V.assistant.name} directs an unoccupied slave to visit your office to ensure all your needs are currently being met. With such a vague task set before them, the slaves who enter your domain in such a way often find themselves used in a multitude of refreshingly novel ways. At this particular moment,`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`comes through the door of your office and obediently`);
		if (eventSlave.belly >= 300000) {
			r.push(`settles ${himself}`);
		} else {
			r.push(`kneels`);
		}
		r.push(`beside your desk to await further orders. It occurs to you, gazing down at your obedient slave, that ${he} exists as little more than an object to meet your various needs. Perhaps you should treat ${him} as such.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Use ${him} as a footrest`, footrest),
			eventSlave.boobs > 300
				? new App.Events.Result(`Use ${his} breasts as stress balls`, stressballs)
				: new App.Events.Result(),
			(eventSlave.balls.isBetween(2, 20) && eventSlave.scrotum > 0)
				? new App.Events.Result(`Relieve your stress with ${his} balls`, balls)
				: new App.Events.Result(),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave) || eventSlave.belly >= 300000)
				? new App.Events.Result(`Use ${him} as an exercise ball`, exerciseball, virginityWarning())
				: new App.Events.Result(),
		]);

		function footrest() {
			r = [];
			if (eventSlave.belly >= 300000) {
				r.push(`You order ${him} to get on ${his} ${belly} belly and steady ${himself}, a task that ${he} carries out quickly and obediently. Once as comfortable as ${he} can possibly get perched awkwardly atop ${his} straining stomach,`);
			} else {
				r.push(`You order ${him} to get beneath your desk`);
				if (hasAllLimbs(eventSlave)) {
					r.push(`on all fours,`);
				} else {
					r.push(`and bend over,`);
				}
				r.push(`a task that ${he} carries out quickly and obediently. Once as comfortable as ${he} can be perched awkwardly underneath your desk,`);
			}
			r.push(`${he} braces`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0) {
					r.push(`${himself} for the loss of ${his} virginity`);
				} else {
					r.push(`${himself} for the inevitable rough fucking`);
				}
			} else if (!canDoAnal(eventSlave)) {
				r.push(`${himself} for the inevitable molestation`);
			} else {
				if (eventSlave.anus === 0) {
					r.push(`${himself} for the anal breaking`);
				} else {
					r.push(`${his} ass for the inevitable rough anal`);
				}
			}
			r.push(`${he} assumes must be coming. Fortunately for ${him}, it never does. Instead, you kick your feet up and rest them on the small of ${his} back. After a few hours of objectifying degradation in this way, you rise from your chair to attend business elsewhere in your penthouse and dismiss ${eventSlave.slaveName}. Although you didn't fuck ${him}, ${his} experience as a piece of furniture for your comfort has increased ${his} submissiveness.`);
			eventSlave.devotion += 5;
			return r;
		}

		function stressballs() {
			r = [];
			r.push(`${He} came to your office clearly expecting to get fucked, but takes it in stride when you order ${him} to kneel beside you and stick out ${his} breasts. ${He} is similarly unruffled when you first reach over to take one of ${his}`);
			if (eventSlave.boobs > 2000) {
				r.push(`massive breasts`);
			} else if (eventSlave.boobs > 1000) {
				r.push(`large breasts`);
			} else if (eventSlave.boobs > 400) {
				r.push(`breasts`);
			} else {
				r.push(`tiny breasts`);
			}
			r.push(`in your hand and slowly squeeze it. As a result, when a particularly irritating piece of news is relayed through your monitor and you suddenly crush the breast held in your hand in response, ${eventSlave.slaveName} can't help but let out a sharp yelp before silencing ${himself}. ${He} soon realizes ${his} time with you in the near future will be as an outlet for your frustrations, and ${his} tits will be taking the brunt of the punishment. When you dismiss ${him} hours later, ${he} scurries out of your office cradling ${his} bruised bosom and trembling from ${his} recent objectifying experience.`);
			eventSlave.trust -= 5;
			return r;
		}

		function balls() {
			r = [];
			r.push(`${He} came to your office clearly expecting to get fucked, but takes it in stride when you order ${him} to get up on your desk with ${his} crotch to you. ${He} is shudders slightly when you first reach over to take one of ${his}`);
			if (eventSlave.balls > 10) {
				r.push(`hypertrophied`);
			} else if (eventSlave.balls > 9) {
				r.push(`inhuman`);
			} else if (eventSlave.balls > 8) {
				r.push(`titanic`);
			} else if (eventSlave.balls > 7) {
				r.push(`gigantic`);
			} else if (eventSlave.balls > 6) {
				r.push(`monstrous`);
			} else if (eventSlave.balls > 5) {
				r.push(`huge`);
			} else if (eventSlave.balls > 4) {
				r.push(`pendulous`);
			} else if (eventSlave.balls > 3) {
				r.push(`swinging`);
			} else if (eventSlave.balls > 2) {
				r.push(`big`);
			} else if (eventSlave.balls > 1) {
				r.push(`average`);
			} else {
				r.push(`pathetic`);
			}
			r.push(`balls in your hand and slowly squeeze it. As a result, when a particularly irritating piece of news is relayed through your monitor and you suddenly crush the testicle held in your hand in response, ${eventSlave.slaveName} can't help but let out a sharp yelp before struggling to silence ${himself}. ${He} soon realizes ${his} time with you in the near future will be as an outlet for your frustrations, and you fully intend to use ${his} balls as literal stress balls. When you dismiss ${him} hours later, ${he} staggers out of your office trying ${his} best to not touch ${his} swollen testicles and trembling from ${his} recent objectifying experience.`);
			eventSlave.trust -= 5;
			return r;
		}

		function exerciseball() {
			r = [];
			if (eventSlave.belly >= 3000000) {
				r.push(`You pull your chair back from your desk and order ${him} to lie on ${his} back with ${his} ${belly} belly to the ceiling. ${He} isn't sure what you are up to, but it quickly dawns on ${him} as you straddle ${his} stomach and take a seat. ${He} groans under the massive pressure increase inside ${him}, but does ${his} best to hold your weight.`);
				if (eventSlave.preg > (eventSlave.pregData.normalBirth / 4)) {
					r.push(`You manage to get very little work done. The sheer amount of motion`);
					if (V.PC.dick !== 0) {
						r.push(`beneath your balls`);
						if (V.PC.vagina !== -1) {
							r.push(`and across your pussy quickly have your cock at full attention and pussy leaking femcum.`);
						} else {
							r.push(`and between your legs quickly have your cock at full attention and dribbling precum.`);
						}
					} else {
						r.push(`on your pussy and asshole quickly have you hot and bothered.`);
					}
					r.push(`You can't stop yourself from rubbing against the squirming mass, enjoying the unique undulations across your junk. It doesn't take long to coat ${his} stomach in a layer of fluids. After a few hours of objectifying degradation in this way, you rise from your enjoyable seat to attend business elsewhere in your penthouse and dismiss ${eventSlave.slaveName}. Although you didn't penetrate ${him}, ${his} experience as a sex toy for your amusement has increased ${his} submissiveness.`);
				} else {
					r.push(`After a few hours of objectifying degradation in this way, you rise from your novel seat to attend business elsewhere in your penthouse and dismiss ${eventSlave.slaveName}. Although you didn't fuck ${him}, ${his} experience as a piece of furniture for your comfort has increased ${his} submissiveness.`);
				}
				eventSlave.devotion += 2;
			} else {
				r.push(`You order ${him} to get down on`);
				if (hasAllLimbs(eventSlave)) {
					r.push(`all fours`);
				} else {
					r.push(`the ground`);
				}
				r.push(`and stick ${his} butt up in the air, a position ${he} assumes with the practiced efficiency of a veteran sex slave. ${He}'s expecting doggystyle and only lets out a perfunctory moan when you`);
				if (V.PC.dick === 0) {
					r.push(`don a strap-on and`);
				}
				r.push(`mount ${his} ass from behind.`);
				if (canDoVaginal(eventSlave)) {
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					r.push(VCheck.Anal(eventSlave, 1));
				}
				r.push(`However, ${he} is caught off guard when you half sit on ${his} ass while fucking it, using it like an exercise ball as you bounce up and down. ${His}`);
				if (eventSlave.butt > 12) {
					r.push(`immense ass fully absorbs your impacts as you pummel ${him} into the ground,`);
				} else if (eventSlave.butt > 5) {
					r.push(`huge ass cushions your thighs as you pummel ${him} into the ground,`);
				} else if (eventSlave.butt > 2) {
					r.push(`ass provides some cushioning as you pound ${him} into the ground,`);
				} else {
					r.push(`ass does little to cushion you as you fuck ${him} into the ground,`);
				}
				r.push(`but ${eventSlave.slaveName} fares much worse in ${him} role as living exercise equipment. By the end of your power workout you manage to work up quite a sweat, while your slave lays limp in the middle of your office with ${his} gaped`);
				if (canDoVaginal(eventSlave)) {
					r.push(`cunt comically held up in the air. Using ${his} pussy`);
				} else {
					r.push(`butt comically held up in the air. Using ${his} ass`);
				}
				r.push(`in such a way <span class="devotion inc">nearly fucked ${him} senseless,</span> but ${he}'ll remember <span class="trust dec">your objectifying treatment of ${him}.</span>`);
				eventSlave.devotion += 2;
				eventSlave.trust -= 2;
			}
			return r;
		}

		function virginityWarning(){
			if (eventSlave.belly < 300000) {
				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`;
				}
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.assignment !== Job.QUARTER,
				s => s.balls > 0,
				s => s.hormoneBalance >= 100,
				s => s.trust >= -50,
				s => s.devotion >= -20,
				s => s.devotion <= 50,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`Near the end of`,
			contextualIntro(PC, eventSlave, true)
		);
		r.addToLast(`'s weekly inspection, it's obvious the ${SlaveTitle(eventSlave)} is nerving ${himself} to ask you something.`);
		if (eventSlave.devotion > 20) {
			r.push(`${He}'s been good recently,`);
		} else {
			r.push(`${He} went through the nude inspection obediently,`);
		}
		r.push(`so you save ${him} further torment and order ${him} to ask ${his} question. It's a command, but you issue it in a tone meant to assuage ${his} nervousness. It works, and after two false starts, ${he} gathers ${his} courage and politely asks you to cut ${his} balls off.`);
		r.toParagraph();
		r.push(`${He} doesn't phrase it quite like that, of course.`);
		if (!canTalk(eventSlave)) {
			r.push(`${He} uses careful gestures to explain ${himself} in detail. ${He} expresses acceptance of ${his} status as a sex slave, and states that ${he}'s become used to impotence. ${He}'s suffering from moodiness, however, and has`);
			if (canHear(eventSlave)) {
				r.push(`heard rumors`);
			} else {
				r.push(`learned`);
			}
			r.push(`from other slaves that this might be because of the hormonal suppression necessary to allow ${his} hormone treatments to work despite ${his} natural hormones. ${He} asks for an orchiectomy, if it will help stabilize ${his} emotional state.`);
		} else {
			r.push(
				Spoken(eventSlave, `"${Master}, may I please have an orchiectomy?"`),
				`${he} ${say}s, and then gestures at ${his} limp dick.`,
				Spoken(eventSlave, `"I'm, um, impotent, and since I'm on hormones, I've, um, kind of gotten used to being that way. I get really sad randomly, though. And some of the other girls say that it's the hormones and, um, my hormones clashing."`),
				`${He} squares ${his} shoulders.`,
				Spoken(eventSlave, `"I understand that I'm a sex slave. I accept it. May I please have that surgery, ${Master}, if it'll make me less moody?"`)
			);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Order ${him} to behave ${himself}`, order),
			new App.Events.Result(`Reassure ${him} about ${his} body`, reassure),
			(canDoAnal(eventSlave))
				?	new App.Events.Result(`Agree and make sure ${he} doesn't regret it`, agree, eventSlave.anus === 0 ? `This option will take ${his} virginity` : null)
				:	new App.Events.Result()
		]);

		function order() {
			eventSlave.trust -= 2;
			return `You give ${him} stern orders to be a good ${girl} and behave ${himself}, regardless of ${his} silly moods. You don't deign to directly deny ${his} request for a genital reconfiguration, and ${he} has the presence of mind not to ask for an explicit denial. ${He} offers you profoundly submissive promises to control ${his} emotions and be a good slave, though ${he} can't hide a glimmer of fear that ${he}'ll fail and suffer punishment.`;
		}

		function reassure() {
			const r = new SpacedTextAccumulator();
			r.push(`You tell ${him} you aren't planning to do that to ${him}. You explain that ${he} might be feeling like ${he}'s fully integrated into a life of sexual slavery now, but ${he}'s not even close; ${he}'s got a long way to go before ${he}'s perfectly devoted and trusting. The words might sound harsh, but you deliver them kindly, making the statement one of hope. ${He} listens without disappointment, and brightens further when you predict that in a few weeks, ${he}'ll get used to ${his} body's chemistry and accept it. Finally, you add, ${his} current configuration is the best for ${his} sex drive. ${He} bites ${his} lip and gives you a daring little look when ${he}`);
			if (canHear(eventSlave)) {
				r.push(`hears`);
			} else {
				r.push(`understands`);
			}
			r.push(`that, but you decide to keep ${him} waiting and send ${him} on ${his} way. ${He} thanks you without dissembling, not realizing how profoundly ${his} life has changed, for ${him} to be reassured by that.`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function agree() {
			const r = new SpacedTextAccumulator();
			r.push(`You agree and send ${him} straight to the surgery. ${He} looks a little hesitant, as though the prospect is intimidating now that it's actually about to happen, but ${he} complies obediently. You direct ${V.assistant.name} to bring ${him} back to your office as soon as ${he}'s fully recovered. The curatives applied right after surgery hasten ${his} recovery, and ${he}'s back the next day, standing a little gingerly, ${his} limp dick looking a bit sore. ${He} greets you properly, and comes over willingly when you recline in your chair and`);
			if (canSee(eventSlave)) {
				r.push(`crook a finger at`);
			} else {
				r.push(`beckon`);
			}
			r.push(`${him}.`);
			if (canSee(eventSlave)) {
				r.push(`As ${he} approaches, ${he} notices that`);
				if (PC.dick !== 0) {
					r.push(`you've got your`);
					if (PC.vagina !== -1) {
						r.push(`futa`);
					}
					r.push(`dick out,`);
				} else {
					r.push(`you're wearing a strap-on,`);
				}
				r.push(`and looks a little apprehensive,`);
			} else {
				r.push(`${He} approaches gingerly, still slightly sore,`);
			}
			r.push(`but ${he} sits down obediently,`);
			if (PC.dick !== 0) {
				r.push(`your erection`);
			} else {
				r.push(`the phallus`);
			}
			r.push(`coming to rest between ${his} legs and lower buttocks, resting against ${his} perineum and the smooth, recently healed patch of skin at the base of ${his} dick where ${his} ballsack used to be. ${He} gasps at the sensation of`);
			if (PC.dick !== 0) {
				r.push(`your hot cock`);
				if (PC.vagina !== -1) {
					r.push(`and the wet pussy beneath it`);
				}
			} else {
				r.push(`the hard thing`);
			}
			r.push(`pressed against ${his} most intimate area, but ${he} doesn't flinch away.`);
			r.toParagraph();
			r.push(`You take your time with ${him}, leaning back in your chair so that ${he}'s lying`);
			if (PC.boobs >= 1400) {
				r.push(`against your enormous`);
				if (PC.boobsImplant !== 0) {
					r.push(`fake breasts.`);
				} else {
					r.push(`cow tits.`);
				}
			} else if (PC.boobs >= 1200) {
				r.push(`against your huge`);
				if (PC.boobsImplant !== 0) {
					r.push(`firm`);
				} else {
					r.push(`soft`);
				}
				r.push(`breasts.`);
			} else if (PC.boobs >= 1000) {
				r.push(`against your big`);
				if (PC.boobsImplant !== 0) {
					r.push(`firm`);
				}
				r.push(`breasts.`);
			} else if (PC.boobs >= 300) {
				r.push(`against your tits`);
			} else if (PC.title === 0) {
				r.push(`against your flat chest`);
			} else {
				r.push(`on your chest`);
			}
			r.push(`and bringing ${his} head around so you can make out. You play with ${his}`);
			if (eventSlave.boobs > 1000) {
				r.push(`udders`);
			} else if (eventSlave.boobs > 300) {
				r.push(`boobs`);
			} else {
				r.push(`nipples`);
			}
			r.push(`for a while, slowly starting to grind`);
			if (PC.dick !== 0) {
				r.push(`your dick`);
				if (PC.vagina !== -1) {
					r.push(`and the pussy attached to it`);
				}
			} else {
				r.push(`the strap-on`);
			}
			r.push(`back and forth between ${his} legs. ${He} starts to ride you, and starts to beg you to fuck ${him}. You take ${him} under the arms and pull ${him} up, letting`);
			if (PC.dick !== 0) {
				r.push(`your erection`);
			} else {
				r.push(`the dildo`);
			}
			r.push(`spring free; ${he} takes the cue and lines its head up with ${his}`);
			if (eventSlave.anus > 2) {
				r.push(`asspussy.`);
			} else if (eventSlave.anus > 1) {
				r.push(`asshole.`);
			} else {
				r.push(`tight pucker.`);
			}
			r.push(VCheck.Anal(eventSlave, 1));
			r.push(`${He} shivers with pleasure as you lower ${him} onto it and ${he} feels the pressure`);
			if (eventSlave.prostate > 0) {
				r.push(`against ${his} prostate.`);
			} else {
				r.push(`in ${his} rectum.`);
			}
			r.push(`${He}'s so aroused that ${he} climaxes immediately, shuddering as ${his}`);
			if (eventSlave.dick > 6) {
				r.push(`monstrous floppy dick twitches, dripping`);
			} else if (eventSlave.dick > 3) {
				r.push(`big but now permanently soft dick drips`);
			} else if (eventSlave.dick > 1) {
				r.push(`little bouncing bitch dick dribbles`);
			} else {
				r.push(`shockingly tiny penis dribbles`);
			}
			if (eventSlave.prostate > 2) {
				r.push(`an obscene`);
			} else if (eventSlave.prostate > 1) {
				r.push(`a large`);
			} else if (eventSlave.prostate === 0) {
				r.push(`a negligible`);
			} else {
				r.push(`a small`);
			}
			r.push(`amount of clear fluid. By the time you carry ${his} <span class="devotion inc">limply submissive</span> body to the shower, ${he}'s orgasmed twice more to your artful anal lovemaking.`);
			eventSlave.devotion += 4;
			eventSlave.balls = 0;
			eventSlave.scrotum = 0;
			healthDamage(eventSlave, 1);
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.assignment !== Job.QUARTER,
				s => s.behavioralFlaw === "arrogant",
				s => s.devotion < -50,
				s => s.trust >= -50,
			]
		];
	}

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

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

		App.Events.addParagraph(node, [
			`You have a lot of work to do with`,
			App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "."),
			`${He} compounds the usual rebellious anger at being a slave with an apparently unshakeable conviction that ${he} is better than you. Oddly, ${he} seems to maintain the idea that enslaving other people is somehow inappropriate, and that having done so has lowered you morally. This morning, ${he} did not appear to start ${his} morning chores as previously ordered. ${He} sleeps on a bedroll: a brief investigation discloses that ${he} is still in it, and has pulled the blanket up over ${his} head. ${He} refuses to acknowledge your peremptory command to get up.`
		]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Force ${him} out of bed and humiliate ${him} publicly`, humiliate, virginityWarning()),
			new App.Events.Result(`Let ${him} stay in bed`, stay),
			V.seePee === 1
				? new App.Events.Result(`Let ${him} stay in bed, but move it to a public restroom`, restroom)
				: new App.Events.Result(),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Let ${him} stay in bed, but move it to a whorehouse`, whorehouse, virginityWarning())
				: new App.Events.Result(),
			V.arcade > 0
				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
				: new App.Events.Result(),

		]);

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

		function humiliate() {
			let r = [];
			r.push(`You drag ${him} unceremoniously out of bed and straight down into the public areas of ${V.arcologies[0].name}. ${His} struggles and protests grow more frantic as ${he}`);
			let textArray = [];
			if (canSee(eventSlave)) {
				textArray.push(`sees the first passersby beginning to stare at the little spectacle`);
			}
			if (canHear(eventSlave)) {
				textArray.push(`begins to hear the various catcalls and other comments directed at ${him}`);
			} else {
				textArray.push(`feels the outdoor air on ${his} body`);
			}
			if (textArray.length === 1) {
				r.push(`${textArray[0]}.`);
			} else if (textArray.length === 2) {
				r.push(`${textArray[0]} and ${textArray[1]}.`);
			} else if (textArray.length === 3) {
				r.push(`${textArray[0]}, ${textArray[2]} and ${textArray[3]}.`);
			}
			r.push(`You force ${him} right there, thoroughly raping the struggling ${girl} in public. <span class="trust dec">${He} learns the consequences of refusal,</span>`);
			if (V.arcologies[0].FSDegradationist !== "unset") {
				r.push(`and <span class="reputation inc">your citizens certainly enjoy the public spectacle.</span>`);
				repX(100, "event", eventSlave);
			} else {
				r.push(`but <span class="reputation dec">your reputation has been decreased by the unseemly commotion.</span>`);
				repX(-100, "event", eventSlave);
			}
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(VCheck.Both(eventSlave, 1));
			} else if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave)) {
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			eventSlave.trust -= 5;
			return r;
		}

		function stay() {
			eventSlave.trust += 10;
			eventSlave.devotion -= 10;
			return `You shrug and walk out of the room and back to your office; you've got more important things to worry about than some drowsy brat. ${eventSlave.slaveName}, for ${his} part, gets out of bed not long after you leave, but is surprised at how easily ${he} got away with this, and is wondering what else ${he} could get away with.`;
		}

		function restroom() {
			eventSlave.trust -= 5;
			return `You quickly pin the blanket to the mattress, securing ${him} in place. You direct that a urinal in one of ${V.arcologies[0].name}'s public restrooms be unbolted and replaced by the mattress, slave and all. ${He}'s been swearing and threatening all this time, but the calumny reaches a shrieking crescendo (though muffled by the blanket) when ${he} feels urine beginning to soak through the blanket. After an hour or so ${he}'s begging to be let out, swearing ${he}'ll improve ${his} conduct.`;
		}

		function whorehouse() {
			let r = [];
			r.push(`You quickly pin the blanket to the mattress, securing ${him} in place. You direct that ${he} be brought to an arcology salon that serves as a slave brothel. Once ${he}'s there, you take a pair of scissors and cut a slit through the sheets. ${He}'s been swearing and threatening all this time, but the calumny reaches a shrieking crescendo when ${he} feels a cock being shoved through the slit and between ${his} buttocks. Being muffled and held immobile for rape for hire terrifies ${him} but earns some cash.`);
			eventSlave.trust -= 5;
			if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative", 5);
				if (canDoAnal(eventSlave)) {
					seX(eventSlave, "anal", "public", "penetrative", 5);
					if (eventSlave.vagina === 0 && eventSlave.anus === 0) {
						r.push(`After the patrons have their way with ${him}, both ${his} pussy and asshole have been broken in. ${He} hates losing ${his} virginities in such an undignified manner and fears what will be taken from ${him} next.`);
						eventSlave.trust -= 5;
						eventSlave.devotion -= 5;
						eventSlave.vagina++;
						eventSlave.anus++;
					} else if (eventSlave.vagina === 0) {
						r.push(`After the patrons have their way with ${him}, ${he}'s certainly no longer a virgin. ${He} hates losing ${his} virginity in such an undignified manner and fears what will be taken from ${him} next.`);
						eventSlave.trust -= 5;
						eventSlave.devotion -= 5;
						eventSlave.vagina++;
					} else if (eventSlave.anus === 0) {
						r.push(`After the patrons have their way with ${him}, ${he}'s certainly no longer an anal virgin. ${He} hates losing ${his} anal virginity in such an undignified manner and fears what will be taken from ${him} next.`);
						eventSlave.trust -= 5;
						eventSlave.devotion -= 5;
						eventSlave.anus++;
					}
					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
						knockMeUp(eventSlave, 25, 2, -2);
					}
				} else {
					if (eventSlave.vagina === 0) {
						r.push(`After the patrons have their way with ${him}, ${he}'s certainly no longer a virgin. ${He} hates losing ${his} virginity in such an undignified manner and fears what will be taken from ${him} next.`);
						eventSlave.trust -= 5;
						eventSlave.devotion -= 5;
						eventSlave.vagina++;
					}
					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
						knockMeUp(eventSlave, 25, 0, -2);
					}
				}
			} else if (canDoAnal(eventSlave)) {
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (eventSlave.anus === 0) {
					r.push(`After the patrons have their way with ${him}, ${he}'s certainly no longer an anal virgin. ${He} hates losing ${his} anal virginity in such an undignified manner and fears what will be taken from ${him} next.`);
					eventSlave.trust -= 5;
					eventSlave.devotion -= 5;
					eventSlave.anus++;
					if (canGetPregnant(eventSlave) && eventSlave.eggType === "human") {
						knockMeUp(eventSlave, 50, 1, -2);
					}
				}
			}
			cashX(100, "event", eventSlave);
			return r;
		}

		function arcade() {
			let r = [];
			r.push(`${eventSlave.slaveName} screams and begs when ${he} realizes what ${his} punishment is, but you are obdurate.`);
			if (eventSlave.muscles > 30) {
				r.push(`${His} powerful form has to be sedated for immurement in the arcade.`);
			} else if (eventSlave.weight >= 190) {
				r.push(`${He} is so massively fat that immuring ${him} in the arcade is a struggle, even when ${he} isn't trying to.`);
			} else if (eventSlave.belly >= 120000) {
				r.push(`${He} is so enormously gravid that immuring ${him} in the arcade is a hassle, even though ${his} ${belly} middle limits ${his} ability to struggle.`);
			} else if (eventSlave.weight >= -10) {
				r.push(`${His} desperate struggles make immuring ${him} in the arcade difficult.`);
			} else if (eventSlave.belly >= 1500) {
				r.push(`${His} `);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				} else {
					r.push(belly);
				}
				r.push(` body makes it slightly difficult to fit ${him} properly into the restraints for immurement in the arcade.`);
			} else if (eventSlave.muscles < -15) {
				r.push(`${His} weak body makes immuring ${him} in the arcade pathetically easy.`);
			} else {
				r.push(`${His} thin form makes immuring ${him} in the arcade pathetically easy.`);
			}
			r.push(`After ${he}'s properly confined, the only sign of ${his} discomfiture is a slight movement of ${his} ${eventSlave.skin} butt as ${he} wriggles desperately against ${his} restraints.`);
			r.push(assignJob(eventSlave, "be confined in the arcade"));
			eventSlave.sentence = 4;
			return r;
		}
	}
};


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

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`has never had anything significant up ${his} ass. Living in ${V.arcologies[0].name}, ${he} can't have missed that anal sex is a part of most slaves' lives. ${He}`
		);
		if (canSee(eventSlave)) {
			r.push(`witnesses`);
		} else if (canHear(eventSlave)) {
			r.push(`hears`);
		} else {
			r.push(`thinks about`);
		}
		r.push(`sodomy several times a day, at least.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`Lately, you've noticed that ${he} reacts to these`);
		if (canSee(eventSlave)) {
			r.push(`sights`);
		} else if (canHear(eventSlave)) {
			r.push(`sounds`);
		} else {
			r.push(`thoughts`);
		}
		r.push(`with a well-concealed flash of apprehension. It seems ${he}'s figured out that ${he} will probably be required to take it up ${his} little`);
		if (V.seeRace === 1) {
			r.push(eventSlave.race);
		}
		r.push(`butt someday, and isn't enthusiastic about the prospect. You could probably exploit this.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} earn continued anal virginity`, earn),
			hasAnyLegs(eventSlave)
				? new App.Events.Result(`Force ${him} to degrade ${himself}`, force, `This option will take ${his} anal virginity`)
				: new App.Events.Result(),
			eventSlave.vagina === 0
				? new App.Events.Result(`Make ${him} choose between ${his} virginities`, choose, `This option will take one of ${his} virginities`)
				: new App.Events.Result()
		]);

		function earn() {
			r = [];
			r.push(`You tell ${him} ${he}'s a sex slave, and that ${he} needs to learn how to take a dick up the ass.`);
			if (!canTalk(eventSlave) && hasAnyArms(eventSlave)) {
				r.push(`${He} frantically begs with gestures, pleading`);
				if (hasBothLegs(eventSlave)) {
					r.push(`on ${his} knees.`);
				} else {
					r.push(`desperately.`);
				}
			} else if (!canTalk(eventSlave)) {
				r.push(`${He} frantically mouths pleas that you leave ${his} butt alone.`);
			} else {
				r.push(
					`${He} begs,`,
					Spoken(eventSlave, `"Please no, ${Master}, please don't rape me in my ass, ${Master}!"`)
				);
			}
			r.push(`You make a show of considering, and then tell ${him} that if ${he}'s extra obedient, you might let ${him} keep ${his} butt — for now. You tell ${him} to`);
			if (PC.dick !== 0) {
				r.push(`blow you`);
				if (PC.vagina !== -1) {
					r.push(`and`);
				}
			}
			if (PC.vagina !== -1) {
				r.push(`lick your pussy`);
			}
			r.push(r.pop() + `, and ${he} does with unusual obedience. When ${he}'s done, you bend down and whisper in ${his} ear that if ${he} shows any sign of rebelliousness, you'll ruin ${his} little asshole. ${He}'s terrified.`);
			eventSlave.trust -= 5;
			seX(eventSlave, "oral", PC, "penetrative");
			return r;
		}

		function force() {
			r = [];
			r.push(`Suction cup dildos are terribly useful. You place a moderate-sized one on a low table in your office,`);
			if (eventSlave.chastityAnus) {
				r.push(`unlock ${his} chastity belt,`);
			}
			r.push(`and order ${him} to squat down on it and fuck ${his} own asshole. ${He} hesitates, incredulous, and finds ${himself} bound to the couch and thoroughly whipped. It isn't a sexual whipping, either, but a methodical and scientific administration of pain right up to the border of damage. When ${he}'s been reduced to a state of abject, sobbing surrender, you free ${him} and repeat your orders as though nothing had happened. Still crying, ${he} hobbles over and up onto the table,`);
			if (eventSlave.belly >= 300000 || eventSlave.weight > 190) {
				r.push(`struggles to line ${himself} up, and finds it slammed into ${his} asshole when the table gives out under ${his}`);
				if (eventSlave.belly >= 300000) {
					r.push(`gravid`);
				}
				r.push(`weight. You leave ${him} there to struggle with the dildo wedged in ${his} rear until ${he} finally manages to pop it free from the table fragment stuck under mass and roll over. You haul ${him} onto`);
			} else {
				if (eventSlave.belly > 20) {
					r.push(`gingerly lowers ${his}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`pregnant`);
					}
					r.push(`bulk onto it,`);
				}
				r.push(`and fucks ${his} little ass open on the dildo. You keep ${him} up there until ${his} legs give out`);
				if (eventSlave.belly >= 10000 || eventSlave.weight > 190) {
					r.push(`and ${his}`);
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`gravid`);
					}
					r.push(`weight pins ${him} on the toy;`);
				} else {
					r.push(r.pop() + `, and`);
				}
				r.push(`then let ${him} lie down on`);
			}
			r.push(`the couch, telling ${him} to keep working the dildo with ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} or suffer another whipping. After ${he}'s had ${his} ass filled for a good while, ${he} has no trouble taking a`);
			if (PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`real dick`);
			}
			r.push(`for the first time, and is by this point too exhausted to do anything but lie there and be a good little anal slave. ${He} fears you, and ${his} butthole has been broken in.`);
			eventSlave.trust -= 5;
			eventSlave.anus = 1;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function choose() {
			r = [];
			r.push(`You tell ${him} ${he}'s a sex slave, and that ${he} needs to learn how to take a dick up the ass.`);
			if (!canTalk(eventSlave) && hasAnyArms(eventSlave)) {
				r.push(`${He} frantically begs with gestures, pleading`);
				if (hasBothLegs(eventSlave)) {
					r.push(`on ${his} knees.`);
				} else {
					r.push(`desperately.`);
				}
			} else if (!canTalk(eventSlave)) {
				r.push(`${He} frantically mouths pleas that you leave ${his} butt alone.`);
			} else {
				r.push(
					`${He} begs,`,
					Spoken(eventSlave, `"Please no, ${Master}, please don't rape me in my ass, ${Master}!"`)
				);
			}
			r.push(`You make a show of considering, and then tell ${him} you know a way ${he} can continue being an anal virgin — for now. You want a new hole to play with, and ${he} has two untouched holes. ${He} gasps when ${he} realizes what you want. ${He} hesitates to answer, uncertain of which ${he} values more, and finds ${himself} bound to the couch`);
			if (eventSlave.chastityAnus) {
				r.push(r.pop() + `, stripped of ${his} chastity,`);
			}
			r.push(`and thoroughly whipped. It isn't a sexual whipping, either, but a methodical and scientific administration of pain right up to the border of damage. When ${he}'s been reduced to a state of abject, sobbing surrender, you free ${him} and repeat your orders as though nothing had happened. Still crying, ${he} prostrates ${himself} and`);
			if (eventSlave.trust < 20) {
				r.push(`spreads ${his} butt for you.`);
			} else {
				r.push(`${his} pussylips for you.`);
			}
			r.push(`You callously ram a dildo into ${his} fresh hole and tell ${him} to keep working ${himself} with it or suffer another whipping. After ${he}'s fucked ${himself} for a good while, ${he} has no trouble taking a`);
			if (PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`real dick`);
			}
			r.push(`for the first time, and is by this point too exhausted to do anything but lie there and take it a good little slave. ${He} fears you but loses ${himself} to your rule.`);
			if (eventSlave.trust < 20) {
				r.push(`<span class="virginity loss">${His} butthole has been broken in.</span>`);
				eventSlave.anus = 1;
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				r.push(`<span class="virginity loss">${His} pussy has been broken in.</span>`);
				eventSlave.vagina = 1;
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			eventSlave.trust -= 5;
			eventSlave.devotion += 3;
			return r;
		}
	}
};


code:
App.Events.RESSResistantGelding = class RESSResistantGelding 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 > 0,
				s => s.balls === 0,
				s => s.genes === "XY",
				s => s.devotion <= 50,
				s => s.trust < -50,
				s => s.anus > 0,
			]
		];
	}

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

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

		let r = [];
		r.push(
			`You come across`,
			contextualIntro(V.PC, eventSlave, true),
			`standing in the bathroom in front of the sink, with one leg up on the counter so ${he} can inspect ${his} genitalia.`
		);
		if (canSee(eventSlave)) {
			r.push(`From the feeds, it's obvious ${he}'s grieved by what ${he} sees.`);
		} else {
			r.push(`From the feeds, it's obvious ${he}'s grieved by what ${he} feels.`);
		}
		r.push(`As you watch, ${he} sobs quietly, reaching towards where ${his} scrotum used to be with a trembling hand. Apparently, ${he}'s having trouble accepting ${his} status as a gelded slut.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Abuse ${his} ass`, abuse),
			new App.Events.Result(`Reassure ${him} of ${his} sexual worth`, reassure),
			new App.Events.Result(`Comfort ${him}`, comfort)
		]);

		function abuse() {
			r = [];
			r.push(`${He} turns around as`);
			if (canHear(eventSlave)) {
				r.push(`${he} hears`);
			}
			r.push(`you enter the bathroom, fear and loathing on ${his} face, but you seize ${his} shoulder and spin ${his} back around without a word. You drag ${him} across the counter until ${his} face is over the sink, and turn it on. ${He} struggles in sheer incomprehension as you hold ${his} head over the filling basin with one hand and roughly grope ${his} butt with the other. When the sink is full, you tell ${him} to spread ${his} buttocks for you like a good butthole bitch. ${He} hesitates, so you push ${his} face under the surface of the water and hold it there until ${he} complies. You shove`);
			if (V.PC.dick === 0) {
				r.push(`a dildo`);
			} else {
				r.push(`your member`);
			}
			r.push(`up ${his} anus so harshly that ${he} spasms and reflexively tries to get away, so you push ${him} under again until ${he} stops struggling. For the next ten minutes, ${he} gets shoved under water whenever ${he} offers the slightest resistance to anal rape. Soon, ${his} tears are pattering down into the sink. The next time you decide to buttfuck ${him}, ${he}'s compliant from sheer terror.`);
			eventSlave.trust -= 5;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function reassure() {
			r = [];
			r.push(`${He} turns around as`);
			if (canHear(eventSlave)) {
				r.push(`${he} hears`);
			}
			r.push(`you enter the bathroom, fear and loathing on ${his} face, but is surprised by`);
			if (canSee(eventSlave)) {
				r.push(`your gentle expression.`);
			} else {
				r.push(`by how calm your steps seem.`);
			}
			r.push(`${He}'s more shocked still when you give ${him} a reassuring hug and kiss ${his} unresisting mouth. ${He}'s so unable to figure out what's happening that ${he} eventually gives up and relaxes into you. You gently turn ${him} around to face the mirror again, and working from the top of ${his} head, describe ${his} body in minute detail, explaining how pretty and valuable a sex slave ${he} is. When you're about to reach ${his} butt,`);
			if (canTalk(eventSlave)) {
				r.push(`${he} uses gestures to beg you not to assrape ${him}.`);
			} else {
				if (eventSlave.lips > 70) {
					r.push(`${he} begs meekly through ${his} massive dick-sucking lips,`);
				} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
					r.push(`${he} begs meekly through ${his} mouthful of piercings,`);
				} else {
					r.push(`${he} begs meekly,`);
				}
				r.push(Spoken(eventSlave, `"${Master}, please, please don't assrape me. I don't think I can take it."`));
			}
			r.push(`You patiently explain that taking`);
			if (V.PC.dick === 0) {
				r.push(`anything you feel like inserting into ${his} backdoor`);
			} else {
				r.push(`your cock`);
			}
			r.push(`is ${his} duty, and begin to massage ${his} sphincter open with a single gentle finger. ${He} doesn't enjoy the ensuing assfuck, but ${he} doesn't truly hate it either and begins to hope that being your butt slave won't be so painful after all.`);
			eventSlave.devotion += 4;
			r.push(slaveSkillIncrease('anal', eventSlave, 10));
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function comfort() {
			r = [];
			r.push(`${He} turns around as`);
			if (canHear(eventSlave)) {
				r.push(`${he} hears`);
			}
			r.push(`you enter the bathroom, fear and loathing on ${his} face, but is surprised by`);
			if (canSee(eventSlave)) {
				r.push(`your gentle expression.`);
			} else {
				r.push(`by how calm your steps seem.`);
			}
			r.push(`${He}'s more shocked still when you give ${him} a reassuring hug and kiss ${his} unresisting mouth. ${He}'s so unable to figure out what's happening that ${he} eventually gives up and relaxes into you. You run your hands along ${his} body and kiss ${his} deeply for a long while before reassuring ${him} of ${his} value to you. ${He} looks confused, but goes about ${his} business with dry eyes. ${He} hates you a little less, but wonders whether ${he} can get away with retaining some independence.`);
			return r;
		}
	}
};


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

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

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

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

		App.Events.addParagraph(node, [
			`Though ${V.assistant.name} constantly monitors all your slaves, you keep an eye on the video feeds yourself. There's nothing like the personal, human touch. You notice one night that`,
			contextualIntro(V.PC, eventSlave, true),
			`is crouched in the bottom of the shower. Sensing something amiss, you discreetly investigate, and find that ${he}'s crying quietly under the warm water.`
		]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Enter the shower and quietly comfort ${him}`, comfort),
			new App.Events.Result(`Talk through ${his} problems with ${him}`, talk),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Use ${him} when ${he} gets out`, out, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
		]);

		function comfort() {
			let r = [];
			r.push(`${He} starts with surprise`);
			if (canSee(eventSlave)) {
				r.push(`as you enter the shower,`);
			} else if (canHear(eventSlave)) {
				r.push(`as ${he} hears you enter the shower,`);
			} else {
				r.push(`as ${he} feels the water being disturbed by your body,`);
			}
			r.push(`and then`);
			if (canSee(eventSlave)) {
				r.push(`looks at`);
			} else {
				r.push(`turns to`);
			}
			r.push(`you in shock as you sit down beside ${him}, ignoring the water soaking your clothes. ${He} does not resist when you draw ${him} gently into your lap. ${He}'s stiff and uncomfortable as you hold ${him} gently, but ${he} eventually relaxes and allows ${his} head to rest`);
			if (V.PC.boobs >= 300) {
				r.push(`between your breasts.`);
			} else {
				r.push(`against your shoulder.`);
			}
			r.push(`${He}'s utterly conflicted; the hateful person who ${he} is expected to fuck is tenderly comforting ${him}. ${He} finally seems to accept the animal comfort, whatever its source, and begins to trust you to do more than just use ${him}.`);
			eventSlave.trust += 4;
			return r;
		}

		function talk() {
			const frag = document.createDocumentFragment();
			let r = [];
			r.push(`You enter the bathroom and quietly wait until ${he}'s done. When the water shuts off, ${he} stands up absently and spins so the shower's air dry function can blow the water off ${him}. You can't help but notice`);
			if (eventSlave.weight > 30) {
				r.push(`a lot of motion across ${his}`);
				if (eventSlave.weight > 190) {
					r.push(`expansive`);
				} else if (eventSlave.weight > 130) {
					r.push(`fat`);
				} else if (eventSlave.weight > 95) {
					r.push(`thick`);
				} else {
					r.push(`chubby`);
				}
				r.push(`body when the air jets play across ${him}.`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`how firm ${his} ${belly} belly is.`);
			} else if (eventSlave.dick > 1) {
				r.push(`${his} soft cock flop around as one of the air jets strikes it.`);
			} else if (eventSlave.boobs > 800) {
				if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
					r.push(`how ${his} fake tits refuse to jiggle under the air jets.`);
				} else {
					r.push(`how the air jets produce a lot of delectable jiggling when they strike ${his} boobs.`);
				}
			} else if (eventSlave.butt > 4) {
				r.push(`how ${he} has to spread ${his} big buttcheeks to let an air jet dry between them.`);
			} else if (eventSlave.labia > 0) {
				r.push(`how one of the air jets creates some motion in ${his} generous labia.`);
			} else if (eventSlave.muscles > 5) {
				r.push(`how the air jets make ${his} taut abs look even more impressive.`);
			} else {
				r.push(`${his} nipples`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`stiffen`);
				} else {
					r.push(`engorge`);
				}
				r.push(`under the air jets.`);
			}
			r.push(`As ${he} rotates,`);
			if (canSee(eventSlave)) {
				r.push(`${he} notices you with a start and looks concerned, but you do your best to look reassuring and beckon`);
			} else {
				r.push(`you gently call ${his} name. ${He} jumps at the sound of your voice and looks concerned, but you do your best to calm ${him} and gingerly coax`);
			}
			r.push(`${him} out of the shower.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`You ask ${him} what's troubling ${him}, and the look of concern returns. Suspecting that ${he}'s afraid of telling the truth, you gently encourage ${him} to be honest, and assure ${him} that you're simply taking an interest in ${his} well-being. ${He} still hesitates, but eventually sniffles a little and`);
			if (!canTalk(eventSlave)) {
				r.push(`reluctantly gestures,`);
			} else if (SlaveStatsChecker.checkForLisp(eventSlave)) {
				r.push(`lisps,`);
			} else {
				r.push(`admits,`);
			}
			if (eventSlave.sexualFlaw === "hates oral" && eventSlave.counter.oral > 0) {
				r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting facefucked."`));
			} else if (eventSlave.sexualFlaw === "hates anal" && eventSlave.counter.anal > 0) {
				r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting assraped."`));
			} else if (eventSlave.sexualFlaw === "hates penetration" && eventSlave.counter.vaginal > 0) {
				r.push(Spoken(eventSlave, `"It's nothing special, ${Master}. I just h-hate getting fucked."`));
			} else if (eventSlave.behavioralFlaw === "hates women") {
				r.push(Spoken(eventSlave, `"Sorry, ${Master}. I just h-hate girls. They're gross."`));
			} else if (eventSlave.behavioralFlaw === "hates men") {
				r.push(Spoken(eventSlave, `"Sorry, ${Master}. I just h-hate cocks. I don't want to see another one, ever again."`));
			} else if ((eventSlave.sexualFlaw === "idealistic") && (eventSlave.counter.oral + eventSlave.counter.anal + eventSlave.counter.vaginal + eventSlave.counter.mammary > 0)) {
				r.push(Spoken(eventSlave, `"I feel like I'm going crazy, ${Master}. No one here seems to know that rape is wrong. Th-they just r-rape me."`));
			} else if (eventSlave.sexualFlaw === "shamefast") {
				r.push(Spoken(eventSlave, `"I want to cover myself so badly, ${Master}. I'm so embarrassed all the time. I'm so tired of being embarrassed."`));
			} else if ((eventSlave.sexualFlaw === "repressed") && (eventSlave.counter.oral + eventSlave.counter.anal + eventSlave.counter.vaginal + eventSlave.counter.mammary > 0)) {
				r.push(Spoken(eventSlave, `"I'm filthy, ${Master}. I've been used, and I can't ever be clean again. I'm a d-dirty, sinful whore."`));
			} else {
				r.push(Spoken(eventSlave, `"Sorry, ${Master}. I was just r-remembering, b-before — all this."`));
			}
			r.push(`You tell ${him} kindly that you understand, and that ${he}'ll be trained to address this. Then, you turn and go. ${He}'s mystified; though ${he}'s not overjoyed by the promise of correction, ${he} finds ${himself} less resistant to following your plans.`);
			eventSlave.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function out() {
			let r = [];
			r.push(`Eventually ${he} finishes and switches the shower to dry. The airflow dries ${him} and ${he} steps out, but as ${he} does, ${he}'s seized and flung over the countertop with a slap as ${his} naked, ${eventSlave.skin}`);
			if (eventSlave.belly >= 5000) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly`);
			} else {
				r.push(`skin`);
			}
			r.push(`hits the surface.`);
			const yourself = V.PC.dick === 0 ? `your vibrating strap-on` : `yourself`;
			if (eventSlave.vagina > -1 && !canDoVaginal(eventSlave)) {
				r.push(`With ${his} chastity belt protecting ${his} pussy, you ram ${yourself} up ${his} ass instead, drawing a pained sob.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`You ram ${yourself} up ${his} ass, drawing a pained sob.`);
			} else if (!canDoAnal(eventSlave)) {
				r.push(`You ram mercilessly into ${his} cunt, forcing a few gasps out of ${him} before it sinks in that this is happening.`);
			} else {
				r.push(`You take ${his} silly cunt just long enough to force a few gasps out of ${him} before you pull out and ram ${yourself} up ${his} ass, drawing a pained sob.`);
			}
			r.push(`As ${he} takes the pounding sullenly,`);
			if (canSee(eventSlave)) {
				r.push(`${he} has a direct view of ${his} own eyes in the mirror, and clearly <span class="trust dec">is disturbed by what ${he} sees.</span>`);
			} else if (canHear(eventSlave)) {
				r.push(`${he} can hear nothing but the sound of ${his} brutal rape, and clearly <span class="trust dec">is disturbed by what ${he} hears.</span>`);
			} else {
				r.push(`${his} blindness and deafness mean that one of the few things ${he} can feel is ${his} own rape, which <span class="trust dec">disturbs ${him} to no end.</span>`);
			}
			eventSlave.trust -= 5;
			r.push(VCheck.Both(eventSlave, 1));
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.rules.speech === "restrictive",
				s => s.devotion > 60,
				s => s.trust >= -20,
			]
		];
	}

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

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

		let r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`is`
		);
		if (!hasAnyLegs(eventSlave)) {
			r.push(`sitting`);
			if (hasAnyArms(eventSlave)) {
				r.push(`helplessly`);
			} else {
				r.push(`limblessly`);
			}
		} else if (!canWalk(eventSlave)) {
			r.push(`kneeling`);
		} else {
			r.push(`standing`);
		}
		r.push(`before your desk for ${his} regular inspection. ${He} is studiously observing the letter of the rule against speaking, and is doing ${his} best to make your inspection as efficient as possible. ${His} desire to please radiates off ${him} in almost palpable waves. ${He} obviously wants to communicate something to you, but can't do it without breaking the rules.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} speak briefly if ${he}'s very quiet`, briefly),
			new App.Events.Result(`Make ${him} say it in public`, make),
			new App.Events.Result(`Keep ${him} quiet but spend some time with ${him}`, quiet),
		]);

		function briefly() {
			r = [];
			r.push(`You stand up from your desk and approach ${him} very closely without touching ${him}. Looking straight`);
			if (hasAnyEyes(eventSlave)) {
				r.push(`into ${his} ${hasBothEyes(eventSlave) ? "eyes" : "eye"},`);
				r.push(`which are`);
				if (canSee(eventSlave)) {
					r.push(`fixed helplessly on you,`);
				} else {
					r.push(`gazing in your general direction,`);
				}
			} else {
				r.push(`at ${him},`);
			}
			r.push(`you tell ${him} that you'll let ${him} say whatever it is ${he} needs to say to you, but only if ${he}'s very quiet. ${He}`);
			if (canSee(eventSlave)) {
				r.push(`looks at you with huge eyes but`);
			}
			r.push(`nods vigorously. ${He} waits until you lean into ${him}, making ${him} shiver at your proximity, before putting ${his}`);
			if (eventSlave.lips > 70) {
				r.push(`ridiculous`);
			} else if (eventSlave.lips > 40) {
				r.push(`enormous`);
			} else if (eventSlave.lips > 20) {
				r.push(`pillowlike`);
			} else {
				r.push(`girlish`);
			}
			r.push(`lips next to your ear and whispering nervously, "I love you, ${Master}." ${He} recoils a little as if burned by the audacity of ${his} words, but only manages to back off a little before you gather ${his}`);
			if (isAmputee(eventSlave)) {
				r.push(`limbless`);
			} else if (eventSlave.bellyPreg >= 1500) {
				r.push(`gravid`);
			} else if (eventSlave.belly >= 1500) {
				r.push(belly);
			} else {
				r.push(`rocking`);
			}
			r.push(`torso into your arms, holding the back of ${his} head with one hand and rubbing ${his} quivering back with the other. Eventually, ${he} relaxes into`);
			if (PC.boobs >= 300) {
				if (PC.boobsImplant !== 0) {
					r.push(`your fake breasts,`);
				} else {
					r.push(`your soft chest,`);
				}
			} else {
				r.push(`you,`);
			}
			r.push(`knowing that ${his} ${getWrittenTitle(eventSlave)} can never and will never reciprocate, but accepting that the loving physical contact is a tremendously kind gesture for a master to make.`);
			eventSlave.devotion += 4;
			return r;
		}

		function make() {
			r = [];
			r.push(`Since you suspect you know what it is ${he} wants to say, you`);
			if (!hasAnyLegs(eventSlave)) {
				r.push(`carry ${him} out`);
			} else if (hasAnyArms(eventSlave)) {
				r.push(`lead ${him} by the hand`);
			} else {
				r.push(`have ${him} follow you`);
			}
			r.push(`onto the club, busy with citizens. You tell ${him} quietly that ${he}'s to shout whatever it is ${he} wanted to say, if it's something everyone should hear; otherwise ${he}'s to keep it to ${himself}. ${He}`);
			if (canSee(eventSlave)) {
				r.push(`looks around`);
			} else if (canHear(eventSlave)) {
				r.push(`listens`);
			} else {
				r.push(`opens ${his} mouth`);
			}
			r.push(`nervously, ${his} ${eventSlave.skin} skin betraying a growing blush, before clearing ${his} throat twice, licking ${his} lips, and howling "I LOVE MY ${Master.toUpperCase()}" at the tops of ${his} lungs. When this is out of ${him} ${he} collapses a little, as though the pressure of holding it inside were propping ${him} up. This attracted a considerable amount of attention, almost all of it positive, with many passersby laughing at the fun, and your fellow slaveowners giving you discreet winks and quiet congratulations.`);
			repX(750, "event", eventSlave);
			return r;
		}

		function quiet() {
			r = [];
			r.push(`You announce that you're finished with business for the day, and feel like some quiet time. ${He} cannot keep`);
			if (canSee(eventSlave)) {
				r.push(`a gleam of humor out of ${his} eye`);
			} else {
				r.push(`the corners of ${his} lips from rising slightly`);
			}
			r.push(`at`);
			if (canHear(eventSlave)) {
				r.push(`hearing`);
			} else {
				r.push(`the phrase`);
			}
			r.push(`'quiet time,' and ${he}`);
			if (!hasAnyLegs(eventSlave)) {
				r.push(`presents ${himself} to be carried`);
			} else {
				r.push(`follows you`);
			}
			r.push(`happily enough. When ${he}`);
			if (canSee(eventSlave)) {
				r.push(`sees`);
			} else {
				r.push(`realizes`);
			}
			r.push(`you're headed to your bedroom ${he} begins to anticipate ${his} ${getWrittenTitle(eventSlave)}'s`);
			if (PC.dick === 0) {
				r.push(`strap-on,`);
			} else {
				r.push(`cock,`);
			}
			r.push(`but is surprised to find that instead of using ${him} you simply`);
			if (isAmputee(eventSlave)) {
				r.push(`place ${him} in bed and curl up around ${his} limbless torso.`);
			} else if (eventSlave.bellyPreg >= 5000) {
				r.push(`help ${him} into bed and curl up with ${him}, your arms encircling ${his} prominent baby bump.`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`help ${him} into bed and curl up with ${him}, your arms encircling ${his} ${belly} dome of a middle.`);
			} else {
				r.push(`climb into bed and pull ${him} under the sheets with you.`);
			}
			r.push(`${He}'s almost disappointed, but after looking into your resting face for a while, nestles ${his} head onto your broad chest and goes to sleep with a look of contentment on ${his} face. When the two of you wake from your brief nap, you ask ${him} if ${he} has anything else to communicate to you. ${He} smiles sleepily and shakes ${his} head no.`);
			eventSlave.devotion += 4;
			return r;
		}
	}
};


code:
App.Events.RESSServantMaid = class RESSServantMaid 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.devotion <= 20,
				s => [Job.QUARTER, Job.HOUSE].includes(s.assignment),
				s => ["a nice maid outfit", "a slutty maid outfit"].includes(s.clothes),
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		App.Events.addParagraph(node, [
			`As one of ${his} many duties while a servant in your penthouse,`,
			contextualIntro(V.PC, eventSlave, true),
			`is scheduled to clean your office today. ${He} pauses in the doorway of your office for a moment, only entering once it becomes clear that you're not going to be using ${him} immediately.`
		]);
		r.push(`${He} begins ${his} cleaning dutifully, fluttering about your office in a flurry of scrubbing and dusting. ${His} almost frenzied sanitization of your office allows you ample opportunity to inspect ${him}, your eyes lingering on ${his} body as ${he} moves back and forth in front of you.`);
		if (eventSlave.clothes === "a slutty maid outfit") {
			r.push(`${His} maid uniform does little to conceal ${his} form from prying eyes, with a thin white blouse all that separates the surfaces of ${his} breasts from the air. The associated skirt is similarly superficial, made more for easy access to a slave's holes than for provision of any sort of modesty.`);
			if (getLimbCount(eventSlave, 102) > 2) {
				r.push(`Although ${his} movements rarely stray from a slight flick of ${his} wrist as ${he} dusts some surface or a gyration of ${his} body as ${he} scrubs the floor clean, ${his} P-Limbs nonetheless produce a steady stream of minute machine noises. They give ${him} the coordination ${he} needs to purge even the smallest of stains, but the multitude of gyros, servos, and other mechanical pieces constantly working to maintain it ensure that the process is far from silent.`);
			} else if (eventSlave.belly >= 150000) {
				r.push(`${His} middle has become so enormous it's a miracle ${he} can even reach objects to clean them. It greatly complicates ${his} cleaning duties, often causing ${him} to attack any blemishes sideways lest ${his} ${belly} belly prevent ${him} from reaching the offending smudge at all. ${He} moves very carefully, not wanting to accidentally knock something to the floor and be forced to figure out how to return it to its proper place.`);
			} else if (eventSlave.boobs > 4000) {
				r.push(`${His} breasts are so massive that a whole ream of cloth is needed to provide even the semblance of covering ${his} massive chest. They do little to aid in ${his} cleaning duties, often causing ${him} to attack any blemish on the wall sideways lest ${his} gigantic boobs prevent ${him} from reaching the offending smudge at all.`);
			} else if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
				r.push(`Despite ${his} pregnancy, ${he} manages to clean with surprising efficacy. ${He} often cradles ${his} gravid belly through ${his} sheer skirt as ${he} dusts or scrubs with one hand, conscious of the fragile life within ${him} even as ${he} works hard to cleanse your office of any unsightly blemishes.`);
			} else if (eventSlave.boobs > 800) {
				r.push(`${His} breasts are pleasingly large and appealingly visible despite the minor concealment provided by ${his} blouse. They often cause ${him} difficulty by mashing against the top surface of your desk as ${he} tries to duck beneath to clean the underside. The struggle is surprisingly erotic — if not without humor.`);
			} else if (eventSlave.muscles > 30) {
				r.push(`With ${his} incredible musculature, ${he}'s able to conduct a deep cleaning that few other slaves can match. Life as an arcology owner exposes you to a wealth of unique situations, but you doubt many of your peers have seen a slave in a slutty maid ensemble lift up a couch with one outstretched arm as they sweep the now exposed ground beneath it clean with the other.`);
			} else if (eventSlave.energy > 95) {
				r.push(`Despite the mundanity of ${his} current duties, it's clear ${he}'s holding back ${his} immense sex drive for the duration of ${his} cleaning.`);
				if (eventSlave.dick > 0) {
					if (eventSlave.chastityPenis === 1) {
						r.push(`${His} chastity cage is dribbling precum, visibly dripping onto the floor as ${he} goes.`);
					} else if (canAchieveErection(eventSlave)) {
						r.push(`${His} cock is painfully erect, visible under ${his} flimsy skirt.`);
					} else {
						r.push(`${His} soft dick is dribbling precum, visibly dripping down ${his} legs.`);
					}
				} else if (eventSlave.vagina === -1) {
					r.push(`${He}'s unconsciously presents ${his} bare bottom as ${he} scrubs the ground clean.`);
				} else {
					r.push(`${His} pussy is visibly soaked, ironically staining the flimsy skirt of ${his} uniform as ${he} cleans your office.`);
				}
			}
		} else if (eventSlave.clothes === "a nice maid outfit") {
			r.push(`${His} maid uniform is fairly demure for a sex slave and makes some effort to conceal ${his} form from prying eyes, even whilst presenting an image of servitude and obedience that a classic maids' ensemble embodies so well. ${His} dress is fairly conservative, enveloping ${his} breasts in intricate lace and cloth. Likewise, ${his} apron is more than ornamental, ${eventSlave.slaveName} having stuffed it with cleaning materials and tools.`);
			if (getLimbCount(eventSlave, 102) > 2) {
				r.push(`Although ${his} movements rarely stray from a slight flick of ${his} wrist as ${he} dusts some surface or a gyration of ${his} body as ${he} scrubs the floor clean, ${his} P-Limbs nonetheless produce a steady stream of minute machine noises. They give ${him} the coordination ${he} needs to purge even the smallest of stains, but the multitude of gyros, servos, and other mechanical pieces constantly working to maintain it ensure that the process is far from silent.`);
			} else if (eventSlave.belly >= 150000) {
				r.push(`${His} middle has become so enormous it's a miracle ${he} can even reach objects to clean them. It greatly complicates ${his} cleaning duties, often causing ${him} to attack any blemishes sideways lest ${his} ${belly} belly prevent ${him} from reaching the offending smudge at all. ${He} moves very carefully, not wanting to accidentally knock something to the floor and be forced to figure out how to return it to its proper place.`);
			} else if (eventSlave.boobs > 4000) {
				r.push(`${His} breasts are so massive that several reams of cloth are needed to provide ${his} massive chest with any semblance of modesty. They do little to aid in ${his} cleaning duties, often causing ${him} to attack any blemish on the wall sideways lest ${his} gigantic boobs prevent ${him} from reaching the offending smudge at all.`);
			} else if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
				r.push(`Despite ${his} pregnancy, ${he} manages to clean with surprising efficacy. ${He} often cradles ${his} gravid belly through ${his} thick apron as ${he} dusts or scrubs with one hand, conscious of the fragile life within ${him} even as ${he} works hard to cleanse your office of any unsightly blemishes.`);
			} else if (eventSlave.boobs > 800) {
				r.push(`${His} breasts are pleasingly large and appealingly visible, even beneath the folds and ruffles of ${his} dress. They often cause ${him} difficulty by mashing against the top surface of your desk as ${he} tries to duck beneath to clean the underside. The struggle is surprisingly erotic — if not without humor.`);
			} else if (eventSlave.muscles > 30) {
				r.push(`With ${his} incredible musculature, ${he}'s able to conduct a deep cleaning that few other slaves can match. Life as an arcology owner exposes you to a wealth of unique situations, but you doubt many of your peers have seen a slave in a modest maid ensemble lift up a couch with one outstretched arm as they sweep the now exposed ground beneath it clean with the other.`);
			} else if (eventSlave.energy > 95) {
				r.push(`Despite the mundanity of ${his} current duties, it's clear ${he}'s holding back ${his} immense sex drive for the duration of ${his} cleaning.`);
				if (eventSlave.dick > 0) {
					if (eventSlave.chastityPenis === 1) {
						r.push(`${His} chastity cage is dribbling precum, visibly dripping onto ${his} apron.`);
					} else if (canAchieveErection(eventSlave)) {
						r.push(`${His} cock is painfully erect, poking through ${his} apron.`);
					} else {
						r.push(`${His} soft dick is dribbling precum, visibly dripping down ${his} legs.`);
					}
				} else if (eventSlave.vagina === -1) {
					r.push(`${He}'s unconsciously presents ${his} bottom, though it remains covered by the length of ${his} apron, as ${he} scrubs the ground clean.`);
				} else {
					r.push(`${His} pussy is visibly soaked, ironically staining the once immaculate apron of ${his} uniform as ${he} cleans your office.`);
				}
			}
		}
		r.push(`Eventually, ${his} duties satisfactorily completed, ${he} comes before your desk to beg your permission to continue ${his} servitude elsewhere in the penthouse.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Stop ${him}`, stop),
			new App.Events.Result(`Let ${him} go`, go),
		]);

		function stop() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`You look ${eventSlave.slaveName} up and down slowly before informing ${him} that ${he} has one more duty left to perform.`);
			App.Events.addResponses(frag, [
				canDoAnal(eventSlave)
					? new App.Events.Result(`Clean out ${his} ass with an enema and fuck it`, enema, eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null)
					: new App.Events.Result(),
				new App.Events.Result(`Have ${him} lick you clean`, lick),

			]);
			return frag;

			function enema() {
				r = [];
				r.push(`You tell ${eventSlave.slaveName} that ${he} forgot to clean one thing in ${his} office — ${himself}. As ${he} looks at you in confusion, you rise from your chair and lightly press ${his} chest down on your desk. ${He} lays there obediently, only letting out a gasp as the cold tip of an enema bulb penetrates ${his} ass. As a result of ${his} slave diet and daily anal preparation, the insertion of the enema is little more than a bit of roleplaying spectacle. When you retrieve the enema from ${his} rectum,`);
				if (V.PC.dick === 0) {
					r.push(`and donning a strap-on,`);
				}
				r.push(`you remark that you'll need to inspect ${his} asshole personally with a vigorous assfucking. Soon ${eventSlave.slaveName} finds ${himself} being pounded so forcefully that a small pool of drool begins to form beneath ${his} open mouth, staining the surface of your desk that ${he} so meticulously cleaned. ${He} resolves to trust you more in the future, since you took a personal interest in ${his} cleanliness.`);
				r.push(VCheck.Anal(eventSlave, 1));
				eventSlave.trust += 4;
				return r;
			}

			function lick() {
				r = [];
				r.push(`You recline in your chair and inform ${eventSlave.slaveName} that ${he} has one last thing to clean in your office. ${He} understands your meaning quickly, sinks to ${his} knees and`);
				if (eventSlave.belly >= 5000) {
					r.push(`struggles to crawl`);
				} else {
					r.push(`crawls`);
				}
				r.push(`beneath your desk to kneel between your legs. Soon enough you feel the sensation of ${his} lips wrapping obediently about one of your toes, fellating the appendage with some enthusiasm. ${He} works ${his} way through your various digits, taking some solace in the simplicity of ${his} task, before a sudden understanding dawns on ${him}. ${He} runs ${his} tongue up your leg, cleansing your skin with ${his} tongue as best ${he} can, before heading for your`);
				if (V.PC.dick !== 0) {
					r.push(`cock`);
					if (V.PC.vagina !== -1) {
						r.push(`and`);
					}
				}
				if (V.PC.vagina !== -1) {
					r.push(`cunt`);
				}
				r.push(`but you lay a hand on ${his} forehead and halt ${him} — ${he}'ll do that last.`);
				if (V.PC.boobs >= 300 || V.PC.title === 0) {
					r.push(`Soon enough ${he} manages to lick all the way up from your feet to your breasts, cleansing your`);
					if (V.PC.belly >= 60000) {
						r.push(`massively gravid`);
					} else if (V.PC.belly >= 5000) {
						r.push(`motherly`);
					}
					r.push(`body with ${his} wet tongue all the way. ${He} hesitates before teasingly laying a single lap on your nipples, so you take ${his} head and hold it against your breasts to enjoy ${his} skillful tongue on your nipples.`);
					if (V.PC.lactation > 0) {
						r.push(`${He} even gets a special treat to savor, fresh from ${his} ${getWrittenTitle(eventSlave)}'s milky breasts. ${He} makes sure your sore breasts are sufficiently relieved.`);
					}
				} else {
					r.push(`Soon enough ${he} manages to lick all the way up from your feet to your`);
					if (V.PC.belly >= 10000) {
						r.push(`taut dome of a stomach,`);
					} else if (V.PC.belly >= 5000) {
						r.push(`pregnancy strained abs,`);
					} else {
						r.push(`abs,`);
					}
					r.push(`pecs, and collarbone, cleansing your body with ${his} wet tongue all the way. ${He} lavishes particular attention on every nook and groove of your chiseled body, clearly eager to please ${his} muscular`);
					if (V.PC.belly >= 5000) {
						r.push(`(and very pregnant)`);
					}
					r.push(`${getWrittenTitle(eventSlave)}.`);
				}
				r.push(`When ${he}'s satisfied that every other`);
				if (V.showInches === 2) {
					r.push(`inch`);
				} else {
					r.push(`centimeter`);
				}
				r.push(`of your body has been bathed by ${his} tongue, ${he} moves for your`);
				if (V.PC.dick === 0) {
					r.push(`cunt, and laps at you enthusiastically`);
				} else {
					r.push(`cock, and runs ${his} tongue all over its surface`);
					if (V.PC.vagina !== -1) {
						r.push(`before turning ${his} attentions to lavish the same wet service to your pussy`);
					}
				}
				r.push(`This extravagant display of ${his} subservience leaves ${him} more sure of ${his} <span class="devotion inc">submission</span> to you than before.`);
				eventSlave.devotion += 4;
				seX(eventSlave, "oral", V.PC, "penetrative");
				return r;
			}
		}

		function go() {
			eventSlave.trust += 2;
			return `You grant ${him} your assent to leave, and ${he} hurries off to go on with ${his} day. ${His} trust for you grows as a result of allowing ${him} to go about ${his} duties unmolested.`;
		}
	}
};