code:
App.Events.refsTransformationFetishismEncounter = class refsTransformationFetishismEncounter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].FSTransformationFetishist > random(25, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0),
		];
	}

	execute(node) {
		V.nextButton = "Continue";
		V.nextLink = "RIE Eligibility Check";
		const cost = 1000;
		const enslaveCost = 10000;
		const slave = GenerateNewSlave("XX", {maxAge: 22, disableDisability: 1, race: "nonslave"});
		slave.origin = "$He was enslaved by you when you overcharged $him for surgery.";
		slave.devotion = random(-70, -55);
		slave.trust = random(-45, -25);
		setHealth(slave, jsRandom(10, 20), jsRandom(10, 20));
		slave.boobs += 600;
		slave.boobsImplant = 600;
		slave.boobsImplantType = "normal";
		slave.butt++;
		slave.buttImplant = 1;
		slave.buttImplantType = "normal";
		slave.lips += 10;
		slave.lipsImplant = 10;
		slave.clothes = "conservative clothing";

		const {
			He,
			he, his, him, himself, woman
		} = getPronouns(slave);

		App.Events.drawEventArt(node, slave);

		App.Events.addParagraph(node, [`As a result of ${V.arcologies[0].name}'s adoption of transformation fetishism, a number of plastic surgery clinics, cosmetic surgeries and other transformative businesses have begun to crop up around the arcology's various promenades and shopping districts. The citizens of ${V.arcologies[0].name} have taken to the idea of altering their bodies with a gusto — though not all are so quick to adopt the trend just because it's in vogue.`]);

		App.Events.addParagraph(node, [`On one particular outing, you come across a citizen outside a surgery clinic staring pensively up at a poster advertising the variety of cosmetic procedures on offer in the institution. The citizen's expression is wistful, if somewhat grave, and at odds with the display above ${him} lit up with silicone breasts, plump bee-stung lips and fake asses. From ${his} unaltered appearance and simple garments, it is likely that ${he} is not one of the arcology's wealthier denizens and thus is unable to shape ${his} body to ${his} heart's desire.`]);

		const choices = [];
		choices.push(new App.Events.Result(`Keep walking`, ignore));
		if (V.cash >= (cost)) {
			choices.push(new App.Events.Result(`Pay for ${his} treatment`, pay, `This will cost ${cashFormat(cost)}.`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to promote ${him}.`));
		}
		choices.push(new App.Events.Result(`Offer to enhance ${him} in your remote surgery in exchange for a fuck`, fuck));
		App.Events.addResponses(node, choices);

		function ignore() {
			return `It's unfortunate that this citizen is unable to realize ${his} dreams, but that's the way of the Free Cities. There are winners, and there are losers.`;
		}

		function pay() {
			repX(5000, "event");
			cashX(-cost, "event");
			return `It takes a moment for you to convince the ${woman} that you aren't playing some cruel joke on ${him}, but once you do ${he} practically squeals with joy as you take ${him} through the doors of the clinic and announce your intent to pay to give your loyal citizen the absolute transformative works. When you next see ${him} it's on a gurney as ${he}'s wheeled out of the surgery, ${his} patient's gown jutting out from ${his} chest due to the size of ${his} new rack. Through swollen lips ${he} gushes to you about how great ${he} feels to finally be a veritable bimbo, and how ${he}'s going to tell every citizen ${he} fucks in ${V.arcologies[0].name} that they have you to thank for ${his} new body.`;
		}

		function fuck() {
			const frag = new DocumentFragment();
			App.Events.addParagraph(frag, [`You make your presence known to citizen, and once the usual shock and disbelief have worn off the citizen rapidly agrees to your proposal. ${He} follows you back to the penthouse where you inform ${V.assistant.name} that the citizen is to be given the works in the remote surgery. As the citizen passes through the doors to the surgery, ${he} turns and blows you a kiss of gratitude.`]);

			App.Events.addParagraph(frag, [`When the citizen is later delivered to your private suite to uphold ${his} end of the bargain, ${he} does so as the veritable image of a perfect bimbo slut. In ${his} rush to come thank you for transforming ${him} from ${his} plain and plebian appearance ${he} has evidently neglected to clothe ${himself}, so you can admire ${his} new firm tits, plump ass and bee-stung lips from the moment ${he} enters the room. Despite being fresh from surgery, ${he}'s an exquisite fuck and an enthusiastic partner — citizens like ${him} often are, given that penetration from a slave would be a social suicide.`]);
			const choices = [];
			if (V.cash >= (enslaveCost)) {
				choices.push(new App.Events.Result(`Enslave ${him} afterwards`, enslave, `Purchasing ${his} outstanding debts will cost ${cashFormat(enslaveCost)}.`));
			} else {
				choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
			}
			App.Events.addResponses(frag, choices);

			repX(1500, "event");
			return frag;

			function enslave() {
				newSlave(slave);
				cashX(-enslaveCost, "event", slave);
				return `As your new playmate lies slumbering in bed, you consult with ${V.assistant.name} as to the cost of the surgery conducted today. With some creative accounting, you settle the citizen's other outstanding debts and then arrange for ${him} to be charged a sum in excess of ${his} financial means for the surgery conducted on ${him} today. Of course, that was not what you agreed, but it was ${his} mistake for undergoing an expensive procedure without a formal contract. When ${he} awakens, though ${he} will retain ${his} new bimbo body, ${he} will be just another slave in your penthouse.`;
			}
		}
	}
};


code:
App.Events.REMMerger = class REMMerger extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.corp.Cash > 50000
		];
	}

	execute(node) {
		V.nextButton = "Continue";
		V.nextLink = "RIE Eligibility Check";

		const slaveCompany = App.Corporate.divisionList
			.filter	(div => div.founded && div.hasMergers)
			.map	(div => div.mergerChoices.map((merger, index) => ({merger, index, division:div})))
			.flat	();
		const maxCompanies = Math.trunc(Math.log2(App.Corporate.divisionList.filter(div => div.founded).length)) + 1;
		const numCompanies = random(1, maxCompanies);

		const companies = [];
		for (let index = 0; index < numCompanies; ++index) {
			companies.push(slaveCompany.pluck());
		}
		const assistant = V.assistant.market ? "your market assistant" : V.assistant.name;

		App.UI.DOM.appendNewElement("p", node, `${capFirstChar(assistant)} constantly combs business records, tax receipts and the media for leads on opportunities for your corporation to take advantage of. Small businesses go under all the time, and with a large amount of cash on hand, your corporation can afford to step in and acquire them. This week, ${assistant} has found ${numberWithPlural(numCompanies, "troubled organization")} you could easily fold into your corporation.`);

		if (companies.length === 1) {
			const company = companies[0];
			App.UI.DOM.appendNewElement("div", node, `This week you come across ${company.merger.text.trouble}`, "majorText");
		} else {
			for (const [index, company] of companies.entries()) {
				App.UI.DOM.appendNewElement("div", node, `The ${ordinalSuffixWords(index + 1)} is ${company.merger.text.trouble}`, "majorText");
			}
		}

		const choices = [];

		for (const company of companies) {
			choices.push(new App.Events.Result(`Absorb the ${company.merger.name}`, () => absorb(company)));
		}
		App.Events.addResponses(node, choices);

		function absorb(company) {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You quickly acquire the ${company.merger.name} ${company.merger.text.acquire}`);

			const devCount = company.merger.result.development;
			const slaveCount = company.merger.result.slaves;
			if (devCount) {
				company.division.developmentCount += devCount;
			}
			if (slaveCount) {
				company.division.activeSlaves += slaveCount;
			}
			const cost = (company.merger.cost || 50) * 1000;
			if (devCount && slaveCount) {
				App.Corporate.chargeAsset(cost / 2, "development");
				App.Corporate.chargeAsset(cost / 2, "slaves");
			} else if (devCount) {
				App.Corporate.chargeAsset(cost, "development");
			} else if (slaveCount) {
				App.Corporate.chargeAsset(cost, "slaves");
			} else {
				r.push(`<span class="red">ERROR! No changes to the corporation are made!</span>`);
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};

repo_name: Elohiem/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canTalk,
				canSee,
				canHear,
				s => s.devotion > 50,
				s => s.trust > 75,
				s => s.assignment !== Job.QUARTER,
				s => s.energy > 60,
				s => ((canDoAnal(s) && s.anus > 0) || (canDoVaginal(s) && s.vagina > 0)),
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const desc = SlaveTitle(eventSlave);
		const {
			HeA, heA, HisA, hisA, himA, girlA, womanA, loliA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const assistantCap = capFirstChar(V.assistant.name);

		V.nextLink = "Next Week";

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

		let r = [];
		r.push(`Partway through`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), "'s"));
		r.push(`weekly inspection, you have to leave for a moment to deal with a minor matter. Inspecting such a devoted slave is a pleasure, but you tear yourself away. Such sacrifices must be made.`);
		App.Events.addParagraph(node, r);

		r = [];
		r.push(`When you return, the comfortably nude ${desc} is flirting shamelessly with ${V.assistant.name}. Your personal assistant's ${V.assistant.appearance} avatar is glowing brightly on the desktop, and ${he} and ${eventSlave.slaveName} are trading increasingly exaggerated compliments.`);

		switch (V.assistant.appearance) {
			case "monstergirl":
				r.push(Spoken(eventSlave, `"I love your hair,"`), `the slave ${say}s.`, Spoken(eventSlave, `"Have you done anything to it lately?"`));
				r.push(`${assistantCap} smiles dangerously, ${hisA} tentacle hair flaring out, its suckers starting to pulsate. "Don't you mean, 'have I done anyone with it lately?' I'd love to do you," ${heA} purrs.`);
				break;
			case "shemale":
				r.push(Spoken(eventSlave, `"I love your cock,"`));
				r.push(`the slave`);
				if (SlaveStatsChecker.checkForLisp(eventSlave)) {
					r.push(`lisps wistfully.`);
				} else {
					r.push(`sighs wistfully.`);
				}
				if (canAchieveErection(eventSlave)) {
					r.push(Spoken(eventSlave, `"I'd love to be that big."`));
				} else if (eventSlave.dick > 6) {
					r.push(Spoken(eventSlave, `"I wish mine could get that hard."`));
				} else {
					r.push(Spoken(eventSlave, `"I can't look away."`));
				}
				r.push(`Complimented, ${V.assistant.name} looks pleased. "Yeah, it's pretty great," ${heA} giggles.`);
				break;
			case "amazon":
				r.push(Spoken(eventSlave, `"You're so big and strong,"`), `the slave ${say}s.`, Spoken(eventSlave, `"You look like you could give a great hug."`));
				r.push(`${assistantCap} blushes. "Um, well," ${heA} says, ${hisA} muscular avatar kicking its heels. "I can't. But I'd like to give you one!"`);
				break;
			case "businesswoman":
				r.push(Spoken(eventSlave, `"You're so confident and sexy,"`), `the slave ${say}s.`, Spoken(eventSlave, `"I love doing what you say."`));
				r.push(`${assistantCap} favors ${him} with an aristocratic look. "Well, you are a good slave," ${heA} says measuringly. "So I suppose I love telling you what to do." ${HeA} uncrosses and recrosses ${hisA} legs.`);
				break;
			case "fairy":
				r.push(Spoken(eventSlave, `"You're so tiny and adorable,"`), `the slave ${say}s.`, Spoken(eventSlave, `"You're a load of fun to be with."`));
				r.push(`${assistantCap} giggles and holds ${hisA} hands up to ${hisA} face. "Aw shucks, you're just saying that," ${heA} says shyly. "You're quite the cutie yourself!" ${HeA} flits to and fro.`);
				break;
			case "pregnant fairy":
				r.push(Spoken(eventSlave, `"You're so tiny and adorable,"`), `the slave ${say}s.`, Spoken(eventSlave, `"You're a load of fun to be with."`));
				r.push(`${assistantCap} giggles and holds ${hisA} hands up to ${hisA} face. "Aw shucks, you're just saying that," ${heA} says shyly. "You're quite the cutie yourself!" ${HeA} moves one hand down to caress ${hisA} belly.`);
				break;
			case "cherub":
			case "schoolgirl":
				r.push(Spoken(eventSlave, `"You're so cute,"`), `the slave ${say}s.`, Spoken(eventSlave, `"It makes things fun."`));
				r.push(`${assistantCap} looks touched. "Aw," ${heA} coos, "I love you too!"`);
				break;
			case "goddess":
			case "hypergoddess":
				r.push(Spoken(eventSlave, `"I love the way you glow,"`), `the slave ${say}s.`, Spoken(eventSlave, `"It's really comforting."`));
				r.push(`${assistantCap} beams maternally. "That's wonderful," ${heA} says resonantly. "I want the best for you."`);
				break;
			case "loli":
				r.push(Spoken(eventSlave, `"You're so cute,"`), `the slave ${say}s.`, Spoken(eventSlave, `"It's really calming."`));
				r.push(`${assistantCap} beams cutely. ${HeA} giggles quietly. "I'll be cuter just for you."`);
				break;
			case "preggololi":
				r.push(Spoken(eventSlave, `"You're so cute,"`), `the slave ${say}s.`, Spoken(eventSlave, `"It's really calming."`));
				r.push(`${assistantCap} beams proudly. ${HeA} giggles loudly and pats ${hisA} belly. "I'll be cuter just for you."`);
				break;
			case "angel":
				r.push(Spoken(eventSlave, `"I love your wings,"`), `the slave ${say}s.`, Spoken(eventSlave, `"They are so majestic."`));
				r.push(`${assistantCap} smiles happily. "If it keeps you out of trouble."`);
				break;
			case "incubus":
				r.push(Spoken(eventSlave, `"You're so sexy,"`), `the slave ${say}s.`, Spoken(eventSlave, `"I can't help be feel so hot around you."`));
				r.push(`${assistantCap} beams proudly. "What kind of sex demon would I be if I couldn't turn you on?"`);
				break;
			case "succubus":
				r.push(Spoken(eventSlave, `"You're so sexy,"`), `the slave ${say}s.`, Spoken(eventSlave, `"I can't help be feel so hot around you."`));
				r.push(`${assistantCap} beams proudly. "What kind of sex demoness would I be if I couldn't turn you on?"`);
				break;
			case "imp":
				r.push(Spoken(eventSlave, `"You're so cute,"`), `the slave ${say}s.`, Spoken(eventSlave, `"It makes you fun."`));
				r.push(`${assistantCap} cackles. "Won't spare you the whip and hot wax just for compliments!"`);
				break;
			case "witch":
				r.push(Spoken(eventSlave, `"You're so, uh, determined,"`), `the slave ${say}s.`, Spoken(eventSlave, `"It makes you fun."`));
				r.push(`${assistantCap} giggles. "I'll just have to play with you more often then."`);
				break;
			case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
				r.push(Spoken(eventSlave, `"You're so interesting,"`), `the slave ${say}s.`, Spoken(eventSlave, `"You always have something new to show off."`));
				r.push(`${assistantCap} laughs. "I'll always find a way into your pants, so why bother trying to say no?"`);
				break;
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Tell your personal assistant to fuck ${him} already`, fuck),
			new App.Events.Result(`Get the slave to get to the point`, point),
		]);

		function fuck() {
			const frag = document.createDocumentFragment();
			r = [];
			let spokenResponse;
			r.push(`You ask ${V.assistant.name} whether ${heA}'s going anywhere with all this flirting. ${HisA} avatar looks at ${eventSlave.slaveName}. "Hear that,`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`human?" ${heA} growls. "You're all mine!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm being sacrificed to a rape monster,"`);
					break;
				case "shemale":
					r.push(`slut?" ${heA} says, smacking ${hisA} lips. "You're all mine!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, there's no way that thing will fit inside me,"`);
					break;
				case "amazon":
					r.push(`slave?" ${heA} roars, rubbing ${hisA} palms together powerfully. "You're my prize!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I've been captured by a horny amazon,"`);
					break;
				case "businesswoman":
					r.push(`bitch?" ${heA} says icily, making a steeple with ${hisA} fingers. "You'll satisfy me! Now!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm a slave to a horny older ${womanA}'s lewd desires,"`);
					break;
				case "fairy":
				case "pregnant fairy":
					r.push(`cutie?" ${heA} says, giggling devilishly. "You're aaaaaall miiiine!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm a slave to a horny fairy's lewd desires,"`);
					break;
				case "schoolgirl":
					r.push(`cutie?" ${heA} says eagerly, already reaching down to start schlicking away. "You get to be my FWB!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I have to satisfy a naughty little school${girlA},"`);
					break;
				case "goddess":
					r.push(`${girl}?" ${heA} says beatifically. "When I'm through with you, you'll be as pregnant as I!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm about to be impregnated by a goddess,"`);
					break;
				case "hypergoddess":
					r.push(`${girl}?" ${heA} says beatifically. "When I'm through with you, you'll be struggling to move!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm about to be burst by a slut goddess,"`);
					break;
				case "loli":
					r.push(`${girl}?" ${heA} says cutely. "If you think I'm so cute, why don't you lick my pussy?"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm about to be dominated by a ${loliA},"`);
					break;
				case "preggololi":
					r.push(`${girl}?" ${heA} says cutely. "If you think I'm so cute, why don't you lick my pussy?"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm about to be dominated by a slutty ${loliA},"`);
					break;
				case "angel":
					r.push(`${girl}?" ${heA} says beatifically. "I'm going to show you divine skill!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm going to be taken to heaven,"`);
					break;
				case "cherub":
					r.push(`cutie?" ${heA} says cutely, already reaching down to start schlicking away. "You get to be my best friend for the evening!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm going to get baptised by a squirting little angel,"`);
					break;
				case "incubus":
					r.push(`dick-sleeve?" ${heA} says dominantly, already at full mast. "I'm going to use you till all you can think of is cock!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm going to fucked out of my mind,"`);
					break;
				case "succubus":
					r.push(`bitch?" ${heA} says dominantly, already wet. "I'm going to ride you till you're all used up!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm going to have my sexual essence stolen,"`);
					break;
				case "imp":
					r.push(`whore?" ${heA} says eagerly. "I'm going to torment you till you scream in pleasure!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'd better start licking if I don't want to suffer,"`);
					break;
				case "witch":
					r.push(`sexy?" ${heA} says eagerly, hiking ${hisA} dress to reveal a squirming cock. "For once a spell gone wrong is working out!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm going to get violated by a terrible witch,"`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`nest?" ${heA} says eagerly, forming multiple cocks out of ${hisA} body. "I'm going to fill you with eggs!"`);
					spokenResponse = Spoken(eventSlave, `"Oh noo, I'm going to be a nursery for a freak,"`);
					break;
			}
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(spokenResponse, `the ${desc} gasps with mock horror. Your personal assistant gives ${him} rapid-fire orders, making ${him} set up sex toys in the corner of your office to conform to ${hisA} avatar.`);
			App.Events.addParagraph(frag, r);

			r = [];
			const {heU, hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');
			r.push(`The next slave on the inspection enters and approaches you, sitting imperturbably behind your desk, but stops and stares when ${heU} notices what's going on in the corner of your office. A wallscreen in the corner shows ${V.assistant.name}'s avatar`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`with both ${hisA} cocks up the asshole of an avatar of ${eventSlave.slaveName}. Below this, the slave ${himself} is`);
					if (eventSlave.belly >= 300000) {
						r.push(`face-down, perched atop ${his} ${belly}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`pregnancy,`);
						} else {
							r.push(`belly,`);
						}
					} else if (eventSlave.belly >= 5000) {
						r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
						if (eventSlave.bellyPreg >= 3000) {
							r.push(`pregnancy`);
						} else {
							r.push(`belly`);
						}
						r.push(`room,`);
					} else {
						r.push(`face-down,`);
					}
					r.push(`with two fuckmachines pounding`);
					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
						r.push(`${him}: one in the pussy, one in the ass.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative");
						seX(eventSlave, "anal", "assistant", "penetrative");
					} else if (canDoVaginal(eventSlave)) {
						r.push(`${his} pussy.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative", 2);
					} else {
						r.push(`${his} ass.`);
						seX(eventSlave, "anal", "assistant", "penetrative", 2);
					}
					break;
				case "shemale":
					r.push(`with ${hisA} third leg inside`);
					if (canDoVaginal(eventSlave)) {
						r.push(`the pussy of an avatar of ${eventSlave.slaveName}. Below this, the slave ${himself} is taking vaginal from a fuckmachine with an absurdly big dildo.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative");
					} else {
						r.push(`the ass of an avatar of ${eventSlave.slaveName}. Below this, the slave ${himself} is taking anal from a fuckmachine with an absurdly big dildo.`);
						seX(eventSlave, "anal", "assistant", "penetrative");
					}
					break;
				case "amazon":
					r.push(`powerfully fucking an avatar of ${eventSlave.slaveName} with a beautiful carved bone and worked leather strap-on.`);
					if (canDoVaginal(eventSlave)) {
						r.push(`Below this, the slave ${himself} is taking hard vaginal from a fuckmachine.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative");
					} else {
						r.push(`Below this, the slave ${himself} is taking hard anal from a fuckmachine.`);
						seX(eventSlave, "anal", "assistant", "penetrative");
					}
					break;
				case "angel":
				case "businesswoman":
				case "cherub":
				case "loli":
				case "preggololi":
				case "schoolgirl":
					r.push(`being eaten out by an avatar of ${eventSlave.slaveName}, who is touching ${himself} in turn. Below this, the slave ${himself} is performing oral on a realistic fake pussy while masturbating.`);
					seX(eventSlave, "oral", "assistant", "penetrative");
					break;
				case "fairy":
					if (eventSlave.height < 35) {
						if (eventSlave.dick > 0) {
							r.push(`bouncing on ${eventSlave.slaveName}'s lap and eagerly taking ${his} cock, finally enjoying sex with someone ${hisA} size. Below this, the slave ${himself} is thrusting into a 'realistic' tiny fairy doll, bloated with cum.`);
						} else {
							r.push(`legs tied to one another as they scissor enthusiastically, covered in sexual fluids from the waist down, Below this, the slave ${himself} is grinding away between a 'realistic' tiny fairy doll's legs.`);
						}
					} else {
						r.push(`bouncing on ${eventSlave.slaveName}'s`);
						if (eventSlave.dick > 0) {
							r.push(`cock, distending ${hisA} belly with each thrust`);
						} else {
							r.push(`hard clit`);
						}
						r.push(`while a vine is gently penetrating below ${him}. Below this, the slave ${himself} is thrusting into a 'realistic' tiny fairy doll pussy`);
						if (eventSlave.dick > 0) {
							r.push(`bloated with cum`);
						}
						r.push(`while a flexible dildo gently thrusts into ${his}`);
						if (canDoVaginal(eventSlave)) {
							r.push(`pussy. It's an ejaculating model, and it's currently pumping a large volume of semen into ${his} cunt.`);
							seX(eventSlave, "vaginal", "assistant", "penetrative");
						} else {
							r.push(`ass. It's an ejaculating model, and it's currently pumping a large volume of semen into ${his} ass.`);
							seX(eventSlave, "anal", "assistant", "penetrative");
						}
					}
					break;
				case "pregnant fairy":
					if (eventSlave.height < 35) {
						if (eventSlave.dick > 0) {
							r.push(`lying on ${hisA} back as ${eventSlave.slaveName} gently thrusts into ${himA}, legs locked around ${his} waist. ${eventSlave.slaveName} enjoys running ${his}`);
							if (hasBothArms(eventSlave)) {
								r.push(`hands`);
							} else {
								r.push(`hand`);
							}
							r.push(`over the fairy's pregnant belly as ${he} leans in to suckle on the fairy's breasts. Below this, the slave ${himself} is thrusting into a 'realistic' tiny fairy doll, the pregnant belly swelling a little larger with every ejaculation.`);
						} else {
							r.push(`legs tied to one another as they scissor gently, covered in sexual fluids from the waist down. ${eventSlave.slaveName} enjoys rubbing and kissing the pregnant belly from time to time. Below this, the slave ${himself} is grinding away between a 'realistic' tiny fairy doll's legs.`);
						}
					} else {
						r.push(`cradling ${hisA} belly as ${heA}'s being eaten out by an avatar of ${eventSlave.slaveName}, who is being double penetrated by a couple of vines. Below this, the slave ${himself} is performing oral on a 'realistic' tiny fairy doll pussy while being penetrated by two flexible dildos. They're an ejaculating model, and it's filled ${him} so completely that each thrust sends a gush of fake cum down ${his} legs to join the puddle on the floor.`);
						seX(eventSlave, "oral", "assistant", "penetrative");
						if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
							seX(eventSlave, "vaginal", "assistant", "penetrative");
							seX(eventSlave, "anal", "assistant", "penetrative");
						} else if (canDoVaginal(eventSlave)) {
							seX(eventSlave, "vaginal", "assistant", "penetrative", 2);
						} else {
							seX(eventSlave, "anal", "assistant", "penetrative", 2);
						}
					}
					break;
				case "goddess":
					r.push(`gently making love to an avatar of ${eventSlave.slaveName}, whose`);
					if (eventSlave.bellyPreg >= 1500) {
						r.push(`${belly} pregnant belly is growing ever more full of children.`);
					} else if (eventSlave.belly >= 1500) {
						r.push(`${belly} belly is growing ever larger and kicks begin to dot its surface.`);
					} else {
						r.push(`belly is becoming distended.`);
					}
					r.push(`Below this, the slave ${himself}`);
					if (isItemAccessible.entry("a huge empathy belly", "bellyAccessory", eventSlave) === true) {
						r.push(`has a huge empathy belly hanging from ${his} middle and is`);
					} else {
						r.push(`is`);
					}
					r.push(`taking a fuckmachine`);
					if (canDoVaginal(eventSlave)) {
						r.push(`in ${his} cunt;`);
						seX(eventSlave, "vaginal", "assistant", "penetrative");
					} else {
						r.push(`up ${his} butt;`);
						seX(eventSlave, "anal", "assistant", "penetrative");
					}
					r.push(`it's an ejaculating model, and it's filled ${him} so completely that each thrust sends a gush of fake cum down ${his} legs to join the puddle on the floor.`);
					break;
				case "hypergoddess":
					r.push(`gently making love to an avatar of ${eventSlave.slaveName}, whose`);
					if (eventSlave.bellyPreg >= 450000) {
						r.push(`${belly} pregnant belly is rapidly ballooning with life and pushing ${him} upwards from the sheer size of the squirming mass.`);
					} else if (eventSlave.bellyPreg >= 1500) {
						r.push(`${belly} pregnant belly is growing taut and beginning to bulge from the amount of children growing within ${him}.`);
					} else if (eventSlave.belly >= 1500) {
						r.push(`${belly} belly is growing taut and beginning to bulge from the amount of children growing within ${him}.`);
					} else {
						r.push(`belly is becoming massively distended.`);
					}
					r.push(`Below this, the slave ${himself}`);
					if (isItemAccessible.entry("a huge empathy belly", "bellyAccessory", eventSlave) === true) {
						r.push(`has a huge empathy belly hanging from ${his} middle and is`);
					} else {
						r.push(`is`);
					}
					r.push(`taking a fuckmachine`);
					if (canDoVaginal(eventSlave)) {
						r.push(`in ${his} cunt;`);
						seX(eventSlave, "vaginal", "assistant", "penetrative");
					} else {
						r.push(`up ${his} butt;`);
						seX(eventSlave, "anal", "assistant", "penetrative");
					}
					r.push(`it's an ejaculating model, and it's filled ${him} so completely that each thrust sends a gush of fake cum down ${his} legs to join the puddle on the floor.`);
					break;
				case "incubus":
					r.push(`powerfully fucking an avatar of ${eventSlave.slaveName} with a dick sized to perfectly fill ${him}.`);
					if (canDoVaginal(eventSlave)) {
						r.push(`Below this, the slave ${himself} is taking hard vaginal from a fuckmachine;`);
						seX(eventSlave, "vaginal", "assistant", "penetrative");
					} else {
						r.push(`Below this, the slave ${himself} is taking hard anal from a fuckmachine;`);
						seX(eventSlave, "anal", "assistant", "penetrative");
					}
					r.push(`it's an ejaculating model, and it's filled ${him} so completely that each thrust sends a gush of fake cum down ${his} legs to join the puddle on the floor.`);
					break;
				case "succubus":
					if (canPenetrate(eventSlave)) {
						r.push(`riding ${eventSlave.slaveName}'s dick. Below this, the slave ${himself} is humping a realistic fake pussy built into a finely crafted female lower body.`);
						seX(eventSlave, "penetrative", "assistant", "vaginal");
					} else {
						r.push(`being eaten out by an avatar of ${eventSlave.slaveName}, who is touching ${himself} in turn. Below this, the slave ${himself} is performing oral on a realistic fake pussy while masturbating.`);
						seX(eventSlave, "oral", "assistant", "penetrative");
					}
					break;
				case "imp":
					r.push(`being eaten out by an avatar of ${eventSlave.slaveName}, who is touching ${himself} in turn while the imp yanks a chain connected to ${his} nipples with one hand and smacks ${him} with a riding crop with the other. Below this, the slave ${himself} is performing oral on a realistic fake pussy while masturbating; a pair of`);
					if (eventSlave.nipples !== "fuckable") {
						r.push(`clamps attached to ${his} nipples randomly jerking`);
					} else {
						r.push(`vibrators wedged in ${his} nipples violently vibrating`);
					}
					r.push(`and a whip lined wheel steadily slapping at ${his} ass and back.`);
					seX(eventSlave, "oral", "assistant", "penetrative");
					break;
				case "witch":
					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
						r.push(`with ${hisA} prehensile cocks crammed into every available hole in an avatar of ${eventSlave.slaveName}. Below this, the slave ${himself} is`);
						if (eventSlave.belly >= 300000) {
							r.push(`face-down, perched atop ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy,`);
							} else {
								r.push(`belly,`);
							}
						} else if (eventSlave.belly >= 5000) {
							r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy`);
							} else {
								r.push(`belly`);
							}
							r.push(`room,`);
						} else {
							r.push(`face-down,`);
						}
						r.push(`with multiple vibrating dildos quivering in ${his} ass and pussy.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative", 2);
						seX(eventSlave, "anal", "assistant", "penetrative", 2);
					} else if (canDoVaginal(eventSlave)) {
						r.push(`with ${hisA} prehensile cocks crammed into every available hole in an avatar of ${eventSlave.slaveName}. Below this, the slave ${himself} is`);
						if (eventSlave.belly >= 300000) {
							r.push(`face-down, perched atop ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy,`);
							} else {
								r.push(`belly,`);
							}
						} else if (eventSlave.belly >= 5000) {
							r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy`);
							} else {
								r.push(`belly`);
							}
							r.push(`room,`);
						} else {
							r.push(`face-down,`);
						}
						r.push(`with multiple vibrating dildos quivering in ${his} pussy.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative", 4);
					} else {
						r.push(`with ${hisA} prehensile cocks crammed into the asshole of an avatar of ${eventSlave.slaveName}. Below this, the slave ${himself} is`);
						if (eventSlave.belly >= 300000) {
							r.push(`face-down, perched atop ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy,`);
							} else {
								r.push(`belly,`);
							}
						} else if (eventSlave.belly >= 5000) {
							r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy`);
							} else {
								r.push(`belly`);
							}
							r.push(`room,`);
						} else {
							r.push(`face-down,`);
						}
						r.push(`with multiple vibrating dildos quivering in ${his} ass.`);
						seX(eventSlave, "anal", "assistant", "penetrative", 4);
					}
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`with ${hisA} tentacles crammed into every available hole in an avatar of ${eventSlave.slaveName}, rapidly pumping eggs into ${his} quickly swelling body.`);
					if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
						r.push(`Below this, the slave ${himself}`);
						if (isItemAccessible.entry("a huge empathy belly", "bellyAccessory", eventSlave) === true) {
							r.push(`has a huge empathy belly strapped to ${his} middle and`);
						}
						r.push(`is`);
						if (eventSlave.belly >= 300000) {
							r.push(`face-down, perched atop ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy,`);
							} else {
								r.push(`belly,`);
							}
						} else if (eventSlave.belly >= 5000) {
							r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy`);
							} else {
								r.push(`belly`);
							}
							r.push(`room,`);
						} else {
							r.push(`face-down,`);
						}
						r.push(`while a fuckmachine powerfully fucks ${his} mouth, ass and pussy.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative", 4);
						seX(eventSlave, "anal", "assistant", "penetrative", 4);
						seX(eventSlave, "oral", "assistant", "penetrative", 3);
					} else if (canDoVaginal(eventSlave)) {
						r.push(`Below this, the slave ${himself}`);
						if (isItemAccessible.entry("a huge empathy belly", "bellyAccessory", eventSlave) === true) {
							r.push(`has a huge empathy belly strapped to ${his} middle and`);
						}
						r.push(`is`);
						if (eventSlave.belly >= 300000) {
							r.push(`face-down, perched atop ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy,`);
							} else {
								r.push(`belly,`);
							}
						} else if (eventSlave.belly >= 5000) {
							r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy`);
							} else {
								r.push(`belly`);
							}
							r.push(`room,`);
						} else {
							r.push(`face-down,`);
						}
						r.push(`with multiple vibrating dildos quivering in ${his} pussy.`);
						seX(eventSlave, "vaginal", "assistant", "penetrative", 8);
						seX(eventSlave, "oral", "assistant", "penetrative", 3);
					} else {
						r.push(`Below this, the slave ${himself}`);
						if (isItemAccessible.entry("a huge empathy belly", "bellyAccessory", eventSlave) === true) {
							r.push(`has a huge empathy belly strapped to ${his} middle and`);
						}
						r.push(`is`);
						if (eventSlave.belly >= 300000) {
							r.push(`face-down, perched atop ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy,`);
							} else {
								r.push(`belly,`);
							}
						} else if (eventSlave.belly >= 5000) {
							r.push(`face-down, ${his} rear up in the air to give ${his} ${belly}`);
							if (eventSlave.bellyPreg >= 3000) {
								r.push(`pregnancy`);
							} else {
								r.push(`belly`);
							}
							r.push(`room,`);
						} else {
							r.push(`face-down,`);
						}
						r.push(`with multiple vibrating dildos quivering in ${his} ass.`);
						seX(eventSlave, "anal", "assistant", "penetrative", 8);
						seX(eventSlave, "oral", "assistant", "penetrative", 3);
					}
					r.push(`At different intervals, an undulation moves down the dildo, forcing ${him} to stretch wide to allow it to pass into ${his} body. Each "egg" forced into ${him} coincides with another blast from the ejaculating model, and it's filled ${him} so completely that each gush of fake cum flows down ${his} legs to join the puddle on the floor.`);
			}
			r.push(`"<span class="devotion inc">Good ${girl},</span>" ${V.assistant.name} says. The new slave turns resolutely away from the arresting sight and gets on with the inspection, doing ${hisU} best to ignore the lewd noises coming from that part of the room.`);
			eventSlave.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function point() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You tell ${eventSlave.slaveName} that ${he} and your personal assistant really should get a room. ${He} looks at ${V.assistant.name}'s avatar, and then back up at you. ${He} gives you a mischievous look, and then bends down to whisper to the avatar behind ${his} hand.`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`"Why not," the monster${girlA} chuckles,`);
					break;
				case "shemale":
					r.push(`"Oh yeah, sure," the shemale giggles,`);
					break;
				case "amazon":
					r.push(`"Fuck yes," the amazon exclaims,`);
					break;
				case "businesswoman":
					r.push(`"Because you asked," the business${womanA} says,`);
					break;
				case "fairy":
				case "pregnant fairy":
					r.push(`"Of course, cutie!" the fairy giggles,`);
					break;
				case "schoolgirl":
					r.push(`"Aw, hot! Of course," the school${girlA} giggles,`);
					break;
				case "goddess":
				case "hypergoddess":
					r.push(`"Oh, lovely," the goddess says beatifically,`);
					break;
				case "loli":
					r.push(`"K-kay," the ${loliA} says naïvely,`);
					break;
				case "preggololi":
					r.push(`"Okay," the ${loliA} says excitedly,`);
					break;
				case "angel":
					r.push(`"What? But..." the angel says reluctantly,`);
					break;
				case "cherub":
					r.push(`"Sounds fun," the cherub says with a giggle,`);
					break;
				case "incubus":
					r.push(`"I'd never turn down getting my dick sucked," the incubus beams,`);
					break;
				case "succubus":
					r.push(`"You know it," the succubus exclaims,`);
					break;
				case "imp":
					r.push(`"Fuck yes," the imp shouts,`);
					break;
				case "witch":
					r.push(`"That would be nice," the witch says with a blush,`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`"Like you had a choice," the creature screams,`);
			}
			r.push(`and directs ${him} to an unoccupied room with the necessary sex toys.`);
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`Several minutes later, ${V.assistant.name}'s avatar reappears on your desk,`);
			if ((eventSlave.fetishKnown === 0) || (eventSlave.fetish === "none")) {
				r.push(`making love to an avatar of ${eventSlave.slaveName}.`);
			} else if (eventSlave.fetish === "buttslut") {
				r.push(`fucking an avatar of ${eventSlave.slaveName} up the ass. "Excellent idea, ${properTitle()}," ${heA} says, and the slave's avatar, which is a little overwhelmed, waves weakly.`);
				if (canDoAnal(eventSlave)) {
					seX(eventSlave, "anal", "assistant", "penetrative");
				}
			} else if (eventSlave.fetish === "cumslut") {
				r.push(`getting oral from an avatar of ${eventSlave.slaveName}. "Excellent idea, ${properTitle()}," ${heA} says, and the slave's avatar waves, since ${his} mouth is full.`);
				seX(eventSlave, "oral", "assistant", "penetrative");
			} else if (eventSlave.fetish === "sadist") {
				r.push(`getting spanked by an avatar of ${eventSlave.slaveName}. "Oh, ah, e-excellent idea, ${properTitle()}, ow," ${heA} says, and the slave's avatar waves.`);
			} else if (eventSlave.fetish === "masochist") {
				r.push(`raining spanks on an avatar of ${eventSlave.slaveName} as it kisses and licks ${his} lower legs. "Excellent idea, ${properTitle()}," ${heA} says, and the slave's avatar waves weakly, since ${his} mouth is busy.`);
				seX(eventSlave, "oral", "assistant", "penetrative");
			} else if (eventSlave.fetish === "dom") {
				r.push(`getting fucked by an avatar of ${eventSlave.slaveName}. "Excellent idea, ${properTitle()}," ${heA} says, and the slave's avatar waves cheerily.`);
				seX(eventSlave, "penetrative", "assistant", "anal");
			} else if (eventSlave.fetish === "submissive") {
				r.push(`along with a crowd of copies of ${himself}. They're gangbanging an avatar of ${eventSlave.slaveName}. "Excellent idea, ${properTitle()}," ${heA} says, and the slave's avatar waves weakly.`);
				seX(eventSlave, "oral", "assistant", "penetrative", 5);
				if (canDoAnal(eventSlave)) {
					seX(eventSlave, "anal", "assistant", "penetrative", 5);
				}
				if (canDoVaginal(eventSlave)) {
					seX(eventSlave, "vaginal", "assistant", "penetrative", 5);
				}
			} else if (eventSlave.fetish === "boobs") {
				r.push(`kissing and sucking the nipples of an avatar of ${eventSlave.slaveName}. "Excellent idea, ${properTitle()}," ${heA} breaks off to say, and the slave's avatar waves.`);
				seX(eventSlave, "mammary", "assistant", "penetrative");
			} else if (eventSlave.fetish === "pregnancy") {
				switch (V.assistant.appearance) {
					case "goddess":
					case "hypergoddess":
					case "incubus":
					case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
						r.push(`fucking a heavily pregnant avatar of ${eventSlave.slaveName}, each thrust producing the lewd sound of a cum-filled hole being fucked. "Excellent idea, ${properTitle()}," ${heA} says, thrusting hard and swelling ${his} partner's belly a bit more; the slave's avatar, which is a little overwhelmed and very full, waves weakly, before returning ${his} hand to ${his} overfilled middle.`);
						break;
					default:
						r.push(`fucking an avatar of ${eventSlave.slaveName}, each thrust producing the lewd sound of a cum-filled hole being fucked. "Excellent idea, ${properTitle()}," ${heA} says, and the slave's avatar, which is a little overwhelmed, waves weakly.`);
				}
				if (canDoVaginal(eventSlave)) {
					seX(eventSlave, "vaginal", V.PC, "penetrative");
				} else {
					seX(eventSlave, "anal", V.PC, "penetrative");
				}
			} else {
				r.push(`making sweet love to an avatar of ${eventSlave.slaveName}, in the missionary position. "Excellent idea, ${properTitle()}," ${heA} says, and then goes back to kissing the slave's delighted avatar.`);
				if (canDoVaginal(eventSlave)) {
					seX(eventSlave, "vaginal", V.PC, "penetrative");
				} else {
					seX(eventSlave, "anal", V.PC, "penetrative");
				}
			}
			r.push(`${eventSlave.slaveName} probably isn't thinking about how far this is from vanilla human sexuality at the moment. But if ${he} took a moment to reflect, you muse, ${he} might be surprised at what <span class="mediumaquamarine">${he}'s learned to be comfortable with.</span>`);
			eventSlave.trust += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canWalk,
				canTalk,
				canHear,
				s => s.devotion > 20,
				s => s.trust > 20,
				s => s.actualAge < 22,
				s => (canDoAnal(s) || canDoVaginal(s)),
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl, daughter
		} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);

		V.nextLink = "Next Week";

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

		let r = [];
		r.push(`As another long week draws to a close,`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), ","));
		r.push(`happens to`);
		if (eventSlave.belly >= 10000) {
			r.push("waddle");
		} else {
			r.push("walk");
		}
		r.push(`past your office toward bed. There's nothing inherently abnormal about ${his} actions, but you do notice as ${he} steps past the doorway that an expression of worry and concern adorns ${his} ${eventSlave.skin} face. When you call ${him} into your office, ${his} face visibly brightens up in an attempt to conceal ${his} obvious distress as ${he} comes before you. Notably, although ${he} stands still and patiently awaits further orders, you notice ${he}`);
		if (canSee(eventSlave)) {
			r.push(`never manages to meet your eyes.`);
		} else {
			r.push(`keeps ${his} sightless eyes downcast.`);
		}
		r.push(`When you ask ${him} what's troubling ${him}, ${his} face plainly falls.`);
		App.Events.addParagraph(node, r);
		r = [];

		if (eventSlave.mother !== -1 && eventSlave.father !== -1) {
			r.push(Spoken(eventSlave, `"${Master}, you're so old,"`));
			r.push(`${he} ${say}s penitently before smiling shyly in an attempt to insert some levity into ${his} confession.`);
			r.push(Spoken(eventSlave, `"It's just that I'm young enough to be your ${daughter}, ${Master}. It's a little weird, isn't it?"`));
		} else {
			r.push(Spoken(eventSlave, `"${Master}, you're so old,"`));
			r.push(`${he} ${say}s penitently before smiling shyly in an attempt to insert some levity into ${his} confession.`);
			r.push(Spoken(eventSlave, `"Compared to you, I'm nothing, ${Master}. I feel so inadequate and I don't want to`));
			if (eventSlave.mother === -1) {
				r.push(Spoken(eventSlave, `have been a waste of time for you. I'm sorry you had to carry me inside you for nine months, and I'm sorry I stretched you out when I was born, ${Master}. Is it a little weird to feel this way?"`));
			} else {
				r.push(Spoken(eventSlave, `be a disappointment to you, ${Master}. Is it a little weird to feel this way?"`));
			}
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Gently acclimate ${him} to the age difference with some lovemaking`, lovemaking, virginityWarning(false)),
			new App.Events.Result(`Cruelly torment ${him} about the age difference`, torment, virginityWarning(false)),
			isFertile(eventSlave)
				? new App.Events.Result(`Give ${him} an afternoon off for some quality time with a local retirement community`, afternoon, virginityWarning(true))
				: new App.Events.Result(),
		]);

		function virginityWarning(knockedUp){
			if (knockedUp) {
				let t = `This option will render ${eventSlave.slaveName} pregnant`;
				if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
					t += ` and take ${his} virginity`;
				} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
					t += ` and take ${his} anal virginity`;
				}
				return t;
			} else if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
				return `This option will take ${his} virginity`;
			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
				return `This option will take ${his} anal virginity`;
			}
		}

		function lovemaking() {
			r = [];
			r.push(`As you cross the breadth of your office to reach ${eventSlave.slaveName}, ${he} presents ${himself} for your sexual usage out of habit. However, you take ${him} by surprise by drawing ${him} into your arms, running the tips of your fingers`);
			if (eventSlave.hStyle.includes("bald") || eventSlave.bald === 1) {
				r.push(`across ${his} scalp,`);
			} else {
				r.push(`through ${his} ${eventSlave.hColor} hair,`);
			}
			r.push(`and looking into ${his} ${App.Desc.eyesColor(eventSlave)}.`);
			if (canSee(eventSlave)) {
				r.push(`${He} meets your gaze for a brief moment before blushing girlishly, as if forgetting how many years ${his} senior you are.`);
			} else {
				r.push(`${He} seems to feel the intensity of your gaze despite ${his} sightless eyes and blushes girlishly, as if forgetting how many years ${his} senior you are.`);
			}
			r.push(`In lieu of words, you lift ${his} chin with a single beckoning finger and steal ${his} breath from ${his} lips with a firm kiss. Once ${he}'s recovered ${his} wits ${he} clings to you with almost animalistic attachment. After a few moments ${he} moves to get down on ${his} knees, clearly defaulting to ${his} role as a sex slave in response to your unexpected intimacy.`);
			r.push(`Instead, you`);
			if (eventSlave.belly >= 300000) {
				r.push(`help ${him} to ${his} feet and guide ${him} to bed, aiding the`);
				if (eventSlave.physicalAge <= 3) {
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`bursting at the seams with life`);
					} else {
						r.push(`nearly circular`);
					}
					r.push(`little ${girl}`);
				} else if (eventSlave.physicalAge < 13) {
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`poor overfilled and ready to pop`);
					} else {
						r.push(`tremendously swollen`);
					}
					r.push(girl);
				} else if (eventSlave.physicalAge < 18) {
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`child-filled`);
					} else {
						r.push(`tremendously swollen`);
					}
					r.push(`teen`);
				} else {
					if (eventSlave.bellyPreg >= 3000) {
						r.push(`child-laden`);
					} else {
						r.push(`tremendously swollen`);
					}
					r.push(`young lady`);
				}
				r.push(`onto the sheets before gently mounting ${him}.`);
			} else { // check canLift() here!
				if (eventSlave.belly >= 5000) {
					r.push(`carefully`);
				}
				r.push(`lift ${him} up from ${his} low position beneath you and carry ${him} to bed, laying the flushed`);
				if (eventSlave.physicalAge <= 3) {
					r.push(`little ${girl}`);
				} else if (eventSlave.physicalAge < 13) {
					r.push(`${girl}`);
				} else if (eventSlave.physicalAge < 18) {
					r.push(`teen`);
				} else {
					r.push(`young lady`);
				}
				r.push(`down on the sheets before gently positioning yourself on top of ${him}.`);
			}
			r.push(`Together, the two of you make fiercely intimate love, while you whisper romantic reassurances into ${his} ear, nip at ${his} neck,`);
			if (eventSlave.bellyPreg >= 300000) {
				r.push(`run your hands across ${his} squirming brood,`);
			} else if (eventSlave.preg > eventSlave.pregData.normalBirth / 2) {
				r.push(`stroke ${his} pregnant belly,`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`caress the curve of ${his} ${belly} belly,`);
			}
			r.push(`and bring ${him} to climax again and again. After a final frantic orgasm together in ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy`);
			} else {
				r.push(`anus`);
			}
			r.push(`${he}`);
			if (canSee(eventSlave)) {
				r.push(`looks`);
			} else {
				r.push(`gazes sightlessly`);
			}
			r.push(`up at you with <span class="devotion inc">adoration</span> and a new <span class="trust inc">trust</span> in ${his} aged ${getWrittenTitle(eventSlave)}.`);
			eventSlave.devotion += 4;
			eventSlave.trust += 4;
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function torment() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`As you close in on ${eventSlave.slaveName} predatorily, ${his} face blanches with visible regret at ${his} prior candidness. By the time you have ${him} bent over`);
			if (eventSlave.belly >= 300000) {
				r.push(`${his} ${belly} belly`);
			} else {
				r.push(`your desk`);
			}
			r.push(`and begun spanking ${his}`);
			if (eventSlave.butt > 12) {
				r.push(`absurd ass,`);
			} else if (eventSlave.butt > 6) {
				r.push(`massive behind,`);
			} else if (eventSlave.butt > 3) {
				r.push(`bountiful bottom,`);
			} else {
				r.push(`cute ass,`);
			}
			r.push(`${he} seems almost resigned to accept any of the standard punishments you've been known to dole out. When your lips lightly brush`);
			if (eventSlave.earShape !== "none" && eventSlave.earT !== "none") {
				r.push(`one of ${his} ears,`);
			} else {
				r.push(`where ${his} ear used to be,`);
			}
			r.push(`${he} flinches harder at the gentle touch than any of your harsh, disciplinary spanks. When you start whispering wicked reminders about ${his} sexual submission and subservience to so old a ${getWrittenTitle(eventSlave)}, ${he} begins to sob quietly`);
			if (eventSlave.belly >= 300000) {
				if (eventSlave.boobs > 600) {
					r.push(`into ${his} breasts.`);
				} else if (!hasAnyArms(eventSlave)) {
					r.push(`with no means to hide it.`);
				} else {
					r.push(`into ${his} hands.`);
				}
			} else {
				r.push(`against the hard surface of your desk.`);
			}
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`By the time you deign to`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`mount ${his} ass, ${he} seems catatonic at the revelation that ${his} body is owned by so cruel an old ${Master}. Even when you accompany each brutal thrust with a harsh spank and a harsh jab at the dearth in years between the two of you, ${he} merely winces at the`);
			if (canDoVaginal(eventSlave)) {
				r.push(`force`);
			} else {
				r.push(`anal pain`);
			}
			r.push(`of your coupling. Judging by the`);
			if (!canSee(eventSlave)) {
				r.push(`exceptionally`);
			}
			r.push(`empty look in ${his} eyes that persists past ${his} dismissal from your office, ${he} might not feel any better about the age difference but you've definitely fucked ${him} into compliance.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 4;
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function afternoon() {
			const frag = document.createDocumentFragment();
			App.Events.addParagraph(frag, [`You direct ${V.assistant.name} to clear ${eventSlave.slaveName}'s schedule and to find a local retirement community willing to 'host' a ${girl} of ${his} age. Perhaps a group of venerable graybeards running a train on ${eventSlave.slaveName} might accustom ${him} to older sexual partners. When ${eventSlave.slaveName} leaves the penthouse, ${he}'s dressed up to look like an old world school${girl} and is clearly skeptical about your age-play therapy.`]);

			r = [];
			r.push(`${eventSlave.slaveName} returns to the penthouse naked, disheveled, and absolutely covered in a thick coating of drying cum. Despite ${his} appearance, however, ${he} is practically beaming with happiness. It seems a good fucking from experienced older men agrees with ${him}, and by the state of ${his}`);
			if (eventSlave.mpreg === 1) {
				r.push(`cum-drenched asshole`);
			} else {
				r.push(`messy pussy`);
			}
			r.push(`${his} aged partners particularly enjoyed filling ${him} with their still potent seed. Unsurprisingly, at a routine check up later that week, ${eventSlave.slaveName} joyfully discovers that ${he} was impregnated during ${his} excursion. It seems that being bred by a bunch of horny old men has eliminated ${his} prior worries about the importance of age and also caused ${him} to fetishize impregnation. ${He} has become more submissive to you for giving ${him} the means to broaden ${his} sexual horizons.`);
			eventSlave.devotion += 4;
			eventSlave.preg = 1;
			eventSlave.pregWeek = 1;
			eventSlave.pregKnown = 1;
			eventSlave.pregType = setPregType(eventSlave);
			WombImpregnate(eventSlave, eventSlave.pregType, 0, 1);
			eventSlave.fetish = "pregnancy";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 5;
			if (eventSlave.mpreg === 1) {
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (eventSlave.anus === 0) {
					eventSlave.anus++;
				}
			} else {
				seX(eventSlave, "vaginal", "public", "penetrative", 10);
				if (eventSlave.vagina === 0) {
					eventSlave.vagina++;
				}
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSAgeDifferenceYoungPC = class RESSAgeDifferenceYoungPC extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.PC.actualAge < 25,
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canWalk,
				canTalk,
				canHear,
				s => s.devotion > 20,
				s => s.trust > 20,
				s => s.actualAge > 35,
				s => (canDoAnal(s) || canDoVaginal(s)),
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, mother, woman
		} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const PC = V.PC;

		V.nextLink = "Next Week";

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

		let r = [];
		r.push(`As another long week draws to a close,`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), ","));
		r.push(`happens to`);
		if (eventSlave.belly >= 10000) {
			r.push("waddle");
		} else {
			r.push("walk");
		}
		r.push(`past your office toward bed. There's nothing inherently abnormal about ${his} actions, but you do notice as ${he} steps past the doorway that an expression of worry and concern adorns ${his} ${eventSlave.skin} face. When you call ${him} into your office, ${his} face visibly brightens up in an attempt to conceal ${his} obvious distress as ${he} comes before you. Notably, although ${he} stands still and patiently awaits further orders, you notice ${he}`);
		if (canSee(eventSlave)) {
			r.push(`never manages to meet your eyes.`);
		} else {
			r.push(`keeps ${his} sightless eyes downcast.`);
		}
		r.push(`When you ask ${him} what's troubling ${him}, ${his} face plainly falls.`);
		App.Events.addParagraph(node, r);
		r = [];

		if (!isParentP(PC, eventSlave)) {
			r.push(Spoken(eventSlave, `"${Master}, you're so young,"`));
			r.push(`${he} ${say}s penitently before smiling shyly in an attempt to insert some levity into ${his} confession.`);
			r.push(Spoken(eventSlave, `"It's just that I'm old enough to be your ${mother}, ${Master}. It's a little weird, isn't it?"`));
		} else {
			r.push(Spoken(eventSlave, `"${Master}, you're so`));
			if (PC.title === 1) {
				r.push(Spoken(eventSlave, `handsome,"`));
			} else {
				r.push(`beautiful,"`);
			}r.push(`${he} ${say}s penitently before smiling shyly in an attempt to insert some levity into ${his} confession.`);
			r.push(Spoken(eventSlave, `"It's just that you've become so attractive since`));
			if (PC.mother === eventSlave.ID) {
				r.push(Spoken(eventSlave, `I gave birth to you, I just can't compete,`));
			} else {
				r.push(Spoken(eventSlave, `your mother gave birth to you, I just can't compete, and I don't even come close to her looks,`));
			}
			r.push(Spoken(eventSlave, `${Master}. It's a little weird, isn't it, for such an old ${woman} to be graced with such a lovely ${Master}?"`));
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Gently acclimate ${him} to the age difference with some lovemaking`, lovemaking, virginityWarning(false)),
			new App.Events.Result(`Cruelly torment ${him} about the age difference`, torment, virginityWarning(false)),
			isFertile(eventSlave)
				? new App.Events.Result(`Give ${him} an afternoon off for some quality time with a local Frat House`, afternoon, virginityWarning(true))
				: new App.Events.Result(),

		]);

		function virginityWarning(knockedUp){
			if (knockedUp) {
				let t = `This option will render ${eventSlave.slaveName} pregnant`;
				if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
					t += ` and take ${his} virginity`;
				} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
					t += ` and take ${his} anal virginity`;
				}
				return t;
			} else if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
				return `This option will take ${his} virginity`;
			} else if (!canDoVaginal(eventSlave) && (eventSlave.anus === 0)) {
				return `This option will take ${his} anal virginity`;
			}
		}

		function lovemaking() {
			r = [];
			r.push(`As you cross the breadth of your office to reach ${eventSlave.slaveName}, ${he} presents ${himself} for your sexual usage out of habit. However, you take ${him} by surprise by drawing ${him} into your arms, running the tips of your fingers`);
			if (eventSlave.hStyle.includes("bald") || eventSlave.bald === 1) {
				r.push(`across ${his} scalp,`);
			} else {
				r.push(`through ${his} ${eventSlave.hColor} hair,`);
			}
			r.push(`and looking into ${his} ${App.Desc.eyesColor(eventSlave)}.`);
			if (canSee(eventSlave)) {
				r.push(`${He} meets your gaze for a brief moment before blushing girlishly, as if forgetting how many years your senior ${he} is.`);
			} else {
				r.push(`${He} seems to feel the intensity of your gaze despite ${his} sightless eyes and blushes girlishly, as if forgetting how many years your senior ${he} is.`);
			}
			r.push(`In lieu of words, you lift ${his} chin with a single beckoning finger and steal ${his} breath from ${his} lips with a firm kiss. Once ${he}'s recovered ${his} wits ${he} clings to you with almost animalistic attachment. After a few moments ${he} moves to get down on ${his} knees, clearly defaulting to ${his} role as a sex slave in response to your unexpected intimacy. Instead, you`);
			if (eventSlave.belly >= 300000) {
				r.push(`help ${him} to ${his} feet and guide ${him} to bed, aiding the`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`child-laden`);
				} else {
					r.push(`tremendously swollen`);
				}
				r.push(`older ${woman} onto the sheets before gently mounting ${him}.`);
			} else { // check canLift() here!
				if (eventSlave.belly >= 5000) {
					r.push(`carefully`);
				}
				r.push(`lift ${him} up from ${his} low position beneath you and carry ${him} to bed, laying the flushed older ${woman} down on the sheets before gently positioning yourself on top of ${him}.`);
			}
			r.push(`Together, the two of you make fiercely intimate love, while you whisper romantic reassurances into ${his} ear, nip at ${his} neck,`);
			if (eventSlave.bellyPreg >= 300000) {
				r.push(`run your hands across ${his} squirming brood,`);
			} else if (eventSlave.preg > eventSlave.pregData.normalBirth / 2) {
				r.push(`stroke ${his} pregnant belly,`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`caress the curve of ${his} ${belly} belly,`);
			}
			r.push(`and bring ${him} to climax again and again. After a final frantic orgasm together in ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy`);
			} else {
				r.push(`anus`);
			}
			r.push(`${he}`);
			if (canSee(eventSlave)) {
				r.push(`looks`);
			} else {
				r.push(`gazes sightlessly`);
			}
			r.push(`up at you with <span class="devotion inc">adoration</span> and a new <span class="trust inc">trust</span> in ${his} young ${getWrittenTitle(eventSlave)}.`);
			eventSlave.devotion += 4;
			eventSlave.trust += 4;
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function torment() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`As you close in on ${eventSlave.slaveName} predatorily, ${his} face blanches with visible regret at ${his} prior candidness. By the time you have ${him} bent over`);
			if (eventSlave.belly >= 300000) {
				r.push(`${his} ${belly} belly`);
			} else {
				r.push(`your desk`);
			}
			r.push(`and begun spanking ${his}`);
			if (eventSlave.butt > 12) {
				r.push(`absurd ass,`);
			} else if (eventSlave.butt > 6) {
				r.push(`massive behind,`);
			} else if (eventSlave.butt > 3) {
				r.push(`bountiful bottom,`);
			} else {
				r.push(`cute ass,`);
			}
			r.push(`${he} seems almost resigned to accept any of the standard punishments you've been known to dole out. When your lips lightly brush`);
			if (eventSlave.earShape !== "none" && eventSlave.earT !== "none") {
				r.push(`one of ${his} ears,`);
			} else {
				r.push(`where ${his} ear used to be,`);
			}
			r.push(`${he} flinches harder at the gentle touch than any of your harsh, disciplinary spanks. When you start whispering wicked reminders about ${his} sexual submission and subservience to so young a ${getWrittenTitle(eventSlave)}, ${he} begins to sob quietly`);
			if (eventSlave.belly >= 300000) {
				if (eventSlave.boobs > 600) {
					r.push(`into ${his} breasts.`);
				} else if (!hasAnyArms(eventSlave)) {
					r.push(`with no means to hide it.`);
				} else {
					r.push(`into ${his} hands.`);
				}
			} else {
				r.push(`against the hard surface of your desk.`);
			}
			App.Events.addParagraph(frag, r);

			r = [];
			r.push(`By the time you deign to`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`mount ${his} ass, ${he} seems catatonic at the revelation that ${his} body is owned by so cruel a ${Master}, nearly half ${his} age. Even when you accompany each brutal thrust with a harsh spank and a harsh jab at the dearth in years between the two of you, ${he} merely winces at the`);
			if (canDoVaginal(eventSlave)) {
				r.push(`force`);
			} else {
				r.push(`anal pain`);
			}
			r.push(`of your coupling. Judging by the`);
			if (!canSee(eventSlave)) {
				r.push(`exceptionally`);
			}
			r.push(`empty look in ${his} eyes that persists past ${his} dismissal from your office, ${he} might not feel any better about the age difference but you've definitely fucked ${him} into compliance.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 4;
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function afternoon() {
			const frag = document.createDocumentFragment();
			App.Events.addParagraph(frag, [`You direct ${V.assistant.name} to clear ${eventSlave.slaveName}'s schedule and to find a local Frat House willing to 'host' a ${woman} of ${his} age and experience. Perhaps a group of virile college boys running a train on ${eventSlave.slaveName} might accustom ${him} to younger sexual partners. When ${eventSlave.slaveName} leaves the penthouse, ${he}'s dressed up to look like a frumpy old world ${woman === "woman" ? "MILF" : "DILF"} and is clearly skeptical about your age-play therapy.`]);

			r = [];
			r.push(`${eventSlave.slaveName} returns to the penthouse naked, disheveled, and absolutely covered in a thick coating of drying cum. Despite ${his} appearance, however, ${he} is practically beaming with happiness. It seems young cock agrees with ${him}, and by the state of ${his}`);
			if (eventSlave.mpreg === 1) {
				r.push(`cum-drenched asshole`);
			} else {
				r.push(`messy pussy`);
			}
			r.push(`${his} youthful partners particularly enjoyed filling ${him} with their potent seed. Unsurprisingly, at a routine check up later that week, ${eventSlave.slaveName} joyfully discovers that ${he} was impregnated during ${his} Frat House excursion. It seems that being bred by a bunch of horny college boys has eliminated ${his} prior worries about the importance of age and also caused ${him} to fetishize impregnation. ${He} has become more submissive to you for giving ${him} the means to broaden ${his} sexual horizons.`);
			eventSlave.devotion += 4;
			eventSlave.preg = 1;
			eventSlave.pregWeek = 1;
			eventSlave.pregKnown = 1;
			eventSlave.pregType = setPregType(eventSlave);
			WombImpregnate(eventSlave, eventSlave.pregType, 0, 1);
			eventSlave.fetish = "pregnancy";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 5;
			if (eventSlave.mpreg === 1) {
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (eventSlave.anus === 0) {
					eventSlave.anus++;
				}
			} else {
				seX(eventSlave, "vaginal", "public", "penetrative", 10);
				if (eventSlave.vagina === 0) {
					eventSlave.vagina++;
				}
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSAmpResting = class RESSAmpResting 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.REST || s.rules.rest === "mandatory"),
				isAmputee,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		V.nextLink = "Next Week";

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

		let r = [];
		r.push(`You're working at your desk late at night when the arcology's systems discreetly highlight significant movement in the slave quarters.`);
		r.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, "DOM"), "'s"));
		r.push(`limbless torso is in bed, asleep but struggling in discomfort. Without arms or legs, it seems the sheet has become wrapped around ${him}. ${He}'s dreaming of something sexual;`);
		if (eventSlave.chastityPenis === 1) {
			r.push(`${his} cock is caged, but precum is`);
			if (eventSlave.prostate > 1) {
				r.push(`flowing`);
			} else if (eventSlave.prostate > 0 ) {
				r.push(`leaking`);
			} else {
				r.push(`barely dripping`);
			}
			r.push(`out of the chastity.`);
		} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
			r.push(`${he} can't maintain an erection but ${his} limp dick`);
			if (eventSlave.prostate > 1) {
				r.push(`is soaking ${his} sheets with precum.`);
			} else if (eventSlave.prostate > 0 ) {
				r.push(`sports a drop of precum.`);
			} else {
				r.push(`sports a meager droplet of precum.`);
			}
		} else if (eventSlave.dick > 0) {
			const erection = eventSlave.dick > 4 ? "massive erection" : eventSlave.dick > 2 ? "erection" : "pathetic little erection";
			r.push(`${his} ${erection} is tenting the`);
			if (eventSlave.prostate > 1) {
				r.push(`sheet, leaving a large spot from ${his} excessive precum`);
			} else {
				r.push(`sheet.`);
			}
		} else if (eventSlave.vagina === -1) {
			r.push(`${he}'s humping the sheet as though ${he} still had genitals`);
			if (eventSlave.prostate > 1) {
				r.push(`genitals, leaving a large splotch from ${his} excessive precum.`);
			} else {
				r.push(`genitals.`);
			}
		} else {
			r.push(`${his} pussy has left a moist spot on the sheet.`);
		}
		r.push(`As you watch, ${his} sleeping body struggles against the sheet`);
		if (eventSlave.boobs >= 800) {
			r.push(r.pop() + ",");
			r.push(`${his} smothering tits`);
		}
		if (eventSlave.belly >= 10000) {
			r.push(r.pop() + ",");
			r.push(`${his} ${belly}`);
			if (eventSlave.bellyPreg >= 8000) {
				r.push(`pregnant`);
			}
			r.push(`belly`);
		}
		if (eventSlave.butt > 5) {
			r.push(r.pop() + ",");
			r.push(`${his} gigantic ass`);
		}
		r.push(`and ${his} limblessness finally leave ${him} lying naked on ${his} ${eventSlave.rules.living === "spare" ? "pad" : "bed"}. After a few moments, ${he} begins to shiver convulsively.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Check on ${him}`, check),
			new App.Events.Result(`Keep ${him} warm`, warm),
			new App.Events.Result(`Leave ${him} be`, leave),
		]);

		function check() {
			r = [];
			r.push(`Since ${he}'s limbless`);
			if (eventSlave.health.illness > 0) {
				if (eventSlave.pregKnown === 1) {
					r.push(r.pop() + ",");
				} else {
					r.push(`and`);
				}
				r.push(`ill`);
			}
			if (eventSlave.pregKnown === 1) {
				r.push(`and pregnant`);
			}
			r.push(r.pop() + ",");
			r.push(`${his} health is more fragile than most slaves'. You look in on ${him}, and when ${he} continues to shiver, you pull the sheets back around ${him}, tucking ${him} in in such a way that ${he} can lie comfortably. In the morning ${he} doesn't understand why ${he}'s so snug and well-rested, but ${his} health improves with decent sleep.`);
			improveCondition(eventSlave, 10);
			return r;
		}

		function warm() {
			r = [];
			r.push(`You spoon ${him} gently from behind, spending the night sleeping with ${his}`);
			if (eventSlave.bellyPreg >= 5000) {
				r.push(`pregnant`);
			} else {
				r.push(`limbless`);
			}
			r.push(`torso cradled in your arms. ${He} snuggles against you in ${his} sleep, enjoying the animal warmth. When ${he} wakes in the morning, ${he} is surprised to`);
			if (canSee(eventSlave)) {
				r.push(`see`);
			} else {
				r.push(`find`);
			}
			r.push(`that it's you keeping ${him} company, but after a few moments' confusion ${he} accepts the unlooked-for comfort and goes back to sleep. ${He} has become more trusting of you.`);
			eventSlave.trust += 4;
			return r;
		}

		function leave() {
			healthDamage(eventSlave, 10);
			return `In the morning, ${his} lips are blue and ${he}'s nearly unresponsive. Your other slaves get ${him} working again, but <span class="health dec">${his} health has been damaged.</span>`;
		}
	}
};


code:
App.Events.RESSArcadeSadist = class RESSArcadeSadist extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => App.Entity.facilities.arcade.established,
			() => App.Entity.facilities.arcade.hasEmployees,
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish === "sadist",
				s => s.fetishStrength > 20,
				s => s.fetishKnown === 1,
				hasAnyArms,
				canMove,
				canTalk,
				canHear,
				s => s.devotion > 50,
				s => s.trust >= -20,
				s => s.belly < 300000,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);

		V.nextLink = "Next Week";

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

		let r = [];
		r.push(`You happen to come across`);
		r.push(contextualIntro(V.PC, eventSlave, "DOM"));
		r.push(`during one of ${his} rest periods. ${He}'s lying on a couch in the slave areas,`);
		if (canSee(eventSlave)) {
			r.push(`staring at the ceiling above ${him}`);
		} else {
			r.push(`leaning back`);
		}
		r.push(`with a dreamy expression on ${his} face. ${He}'s`);
		if (eventSlave.rules.release.masturbation === 1) {
			r.push(`touching ${himself} idly.`);
		} else {
			r.push(`not allowed to touch ${himself}, but ${he}'s extremely aroused.`);
		}
		r.push(`Whatever's on ${his} mind, it's so absorbing that ${he} doesn't realize you're there until you're standing over ${him}.`);
		App.Events.addParagraph(node, r);
		r = [];

		r.push(Spoken(eventSlave, `"Sorry, ${Master},"`), `he ${say}s apologetically,`);
		if (eventSlave.belly >= 10000 || eventSlave.weight > 160) {
			r.push(`struggling`);
		} else {
			r.push(`scrambling`);
		}
		r.push(`to ${his} feet.`);
		r.push(Spoken(eventSlave, `"I didn't notice you there."`));
		if (canSee(eventSlave)) {
			r.push(`Seeing your questioning look,`);
		} else {
			r.push(`Hearing your lack of response,`);
		}
		r.push(`${he} explains ${himself} further.`);
		r.push(Spoken(eventSlave, `"I was just thinking about, um, my favorite place. I can almost get off just by thinking about it."`));
		r.push(`There's a wild, perverted gleam`);
		if (canSee(eventSlave)) {
			r.push(`in ${his} ${App.Desc.eyesColor(eventSlave)}.`);
		} else {
			r.push(`on ${his} face.`);
		}
		r.push(`${He}'s a confirmed sadist, so whatever ${his} favorite mental masturbation is probably quite strong.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Ask ${him} about ${his} fantasy`, fantasy),
			new App.Events.Result(`Just fuck ${him}`, fuck),
		]);

		function fantasy() {
			const frag = document.createDocumentFragment();
			r = [];

			const {hisU, heU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");

			r.push(`You order ${him} to explain further.`);
			r.push(Spoken(eventSlave, `"${Master},"`), `${he} ${say}s carefully,`, Spoken(eventSlave, `"it's ${V.arcadeName}. There's a specific place there, and, well, I can't describe it. It's in the service area under ${V.arcadeName}. Can I show you what I mean?"`));
			r.push(`Intrigued, you order ${him} to show you the place ${he}'s talking about, and lead ${him} to ${V.arcadeName} through the access hallway. ${He} points to the service tunnel under one of the rows of inmates, which allows trusted slaves to clean up and perform maintenance.`);
			if (eventSlave.belly >= 100000 || eventSlave.weight > 160) {
				r.push(`Once you've managed to shove the massive slut`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`Once you've helped the`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				} else {
					r.push(`bloated`);
				}
				r.push(`${girl} fit`);
			} else {
				r.push(`Once you've led ${him}`);
			}
			r.push(`in there, ${he} stops and`);
			if (canSee(eventSlave)) {
				r.push(`watches`);
			} else {
				r.push(`listens`);
			}
			if (V.PC.belly >= 100000 || V.PC.weight > 130) {
				r.push(r.pop() + `as you struggle to join ${him} in the increasingly cramped space.`);
			} else if (V.PC.belly >= 5000) {
				r.push(r.pop() + `as you gently slip your motherly body in after ${him}.`);
			} else {
				r.push(r.pop() + ".");
			}
			r.push(`Inside the industrial access corridor, above you both, is a row of bodies. The slaves' faces and hips are pressed against the apertures that present their holes to customers, but the rest of them is visible from here.`);
			App.Events.addParagraph(frag, r);
			r = [];

			r.push(`There is little noise; the slaves are closely restrained. Indeed, you have to look closely to see that they're being fucked at all. Here and there, though, there are signs. When someone fucks a slave's face, ${hisU} throat bulges, and ${heU} often gags and struggles a little within the restraints. When their`);
			if (App.Entity.facilities.arcade.employees().some(s => s.vagina > 0)) {
				r.push(`pussies`);
			} else {
				r.push(`assholes`);
			}
			r.push(`get fucked, there's also some involuntary struggling, and if the phallus being thrust into them is particularly large, a rhythmic bulging of their abdomens can be discerned.`);
			if (V.arcadeUpgradeInjectors === 1) {
				r.push(`The bodies frequently jerk as electrostimulation is applied to force them to tighten their holes.`);
			} else if (V.arcadeUpgradeInjectors === 2) {
				r.push(`The quiet hissing of the drug injectors adds a menacing undertone, and the bodies frequently jerk as electrostimulation is applied to force them to tighten their holes.`);
			}
			if (V.arcadeUpgradeCollectors === 1) {
				r.push(`The pumping collectors attached to the slaves' breasts`);
				if (App.Entity.facilities.arcade.employees().some(s => s.dick > 0)) {
					r.push(`and cocks`);
				}
				r.push(`carry the white fluid away to be processed elsewhere.`);
			}
			r.push(`The overall effect is subtle, but powerful. There's a sense of total servitude, overlaid with a certain feeling, or perhaps even a scent, of mindless despair. There's no wonder ${eventSlave.slaveName} likes it; there's an infinite supply of uncomplicated human anguish here.`);

			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, [ // TODO: Why the fuck are you crawling around random access shafts?
				(V.PC.belly < 5000 && eventSlave.belly < 5000)
					? new App.Events.Result(`Fuck ${him} here`, here)
					: new App.Events.Result(null, null, `Fucking ${him} here would be interesting; unfortunately, there just isn't enough room for two mothers-to-be.`),
				new App.Events.Result(`Teach ${him} about true sadism`, truShit),
			]);
			return frag;

			function here() {
				r = [];

				r.push(`You reach out for ${eventSlave.slaveName}, not taking your eyes off the mesmerizing sight above. ${He}'s enjoying the spectacle too, and is so aroused that your rough handling of ${his} breasts almost brings ${him} to an immediate orgasm.`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`Pinching`);
				} else {
					r.push(`Hooking`);
				}
				r.push(`${his} ${eventSlave.nipples} nipples to stop ${him} from getting off too soon, you`);
				if (V.PC.dick === 0) {
					r.push(`hug ${him} to your chest and start playing with ${his}`);
					if (canDoVaginal(eventSlave)) {
						r.push(`pussy,`);
						seX(eventSlave, "vaginal", V.PC, "penetrative");
					} else if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0) {
						r.push(`dick,`);
					} else {
						r.push(`body,`);
					}
					r.push(`commanding ${him} to reach around and do the same for you.`);
					seX(V.PC, "vaginal", eventSlave, "penetrative");
				} else if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					r.push(`pull ${him} up to the right height and slide your dick inside ${him}, keeping both of you on your feet so you can take ${him} standing.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					r.push(`shove your cock roughly up ${his} asshole, letting ${him} struggle a little as ${he} finds the right angle to take standing anal here.`);
					r.push(VCheck.Anal(eventSlave, 1));
				} else {
					r.push(`slide your stiff prick up between the virgin's thighs for some intercrural sex.`);
				}
				if (eventSlave.belly >= 5000 || V.PC.belly >= 5000 || V.PC.weight > 160 || V.PC.boobs > 40000 || V.PC.butt > 10 || eventSlave.weight > 160 || eventSlave.boobs > 40000 || eventSlave.butt > 10) {
					r.push(`As you fuck in the cramped corridor, ${his}`);
				} else {
					r.push(`As you fuck, ${his}`);
				}
				if (canSee(eventSlave)) {
					r.push(`gaze flicks up and down along the row`);
				} else {
					r.push(`ears perk up at the subtle sounds`);
				}
				r.push(`of suffering bodies. ${He} climaxes again and again, shuddering at each new subtle sign that another one of the slaves here is being degraded by yet another cock inserted into yet another of ${hisU} defenseless holes. By the time you're satisfied, ${he}'s so exhausted that ${his} legs are trembling uncontrollably as ${he} struggles to remain standing with you. You drop ${him}, leaving ${him} to find ${his} own way out of this place. You look back from the entrance, seeing that ${he}'s`);
				if (canWalk(eventSlave)) {
					r.push(`following you on shaky legs,`);
				} else {
					r.push(`steadily pushing ${himself} along,`);
				}
				if (canSee(eventSlave)) {
					r.push(`staring at`);
				} else {
					r.push(`facing`);
				}
				r.push(`you with a profound look of mixed <span class="trust inc">trust for your understanding of ${his} horrible sadism,</span> and deep unease that this is what truly gets ${him} off.`);
				eventSlave.trust += 5;
				return r;
			}

			function truShit() {
				r = [];
				const randomArcadeSlave = App.Entity.facilities.arcade.employees().random();
				const {he2, His2, his2} = getPronouns(randomArcadeSlave).appendSuffix("2");
				// replace slave art
				$(artDiv).empty();
				App.Events.drawEventArt(artDiv, [eventSlave, randomArcadeSlave], [eventSlave.clothes, "no clothing"]);

				r.push(`${He} seems to be focusing on the purely physical aspects of the degradation here. The true meaning of this place is so much more, and you decide to share it with ${him}. You call ${his} name, tearing ${his} attention away from the spectacle mere`);
				if (V.showInches === 2) {
					r.push(`inches`);
				} else {
					r.push(`centimeters`);
				}
				r.push(`over your heads, and`);
				if (canSee(eventSlave)) {
					r.push(`point`);
				} else {
					r.push(`direct ${him}`);
				}
				r.push(`to a particular slave. You tell ${eventSlave.slaveName} that this particular Arcade inmate's name is ${SlaveFullName(randomArcadeSlave)}.`);
				if (randomArcadeSlave.career !== 0) {
					r.push(`You tell ${him} that ${he2} is ${randomArcadeSlave.actualAge} years old, that ${he2} is ${randomArcadeSlave.nationality}, and that ${he2} was once ${convertCareer(randomArcadeSlave)}.`);
				} else {
					r.push(`You tell ${him} that ${he2} is ${randomArcadeSlave.actualAge} years old and ${randomArcadeSlave.nationality}.`);
				}
				r.push(`You list more details of ${his2} life before ${he2} was placed here to be fucked endlessly. ${eventSlave.slaveName}'s eyes widen as you recite the details of the prior life of this piece of human sexual equipment and the sheer weight of the intellectual sadism smashes into ${him}. Then the slave above you both jerks a little.`);
				if (eventSlave.dick === 0) {
					r.push(`There's no visible sign ${his2} pussy's being fucked, so it must be`);
				} else {
					r.push(`${His2} cock hardens involuntarily, indicating that it's`);
				}
				r.push(`going into ${his2} ass. You resume, mentioning that ${he2}'s been buttfucked ${randomArcadeSlave.counter.anal} times.`);
				r.push(`${eventSlave.slaveName} jerks suddenly,`);
				if (canAchieveErection(eventSlave)) {
					r.push(`shooting ${his} cum onto the floor.`);
				} else if (eventSlave.dick > 0) {
					r.push(`dribbling a little.`);
				} else if (eventSlave.vaginaLube > 0 || eventSlave.balls > 0) {
					r.push(`squirting onto the floor.`);
				} else {
					r.push(`orgasming.`);
				}
				r.push(`${He} came without being touched. ${He}`);
				if (canSee(eventSlave)) {
					r.push(`stares at`);
				} else {
					r.push(`faces`);
				}
				r.push(`the mess ${he} made just by being in the presence of the arcology's undisputed preeminent sadist; ${he} shudders at the sheer gothic glory of it. ${He} has a new moment to think of when ${he} feels like indulging ${his} own sadism.`);
				eventSlave.devotion += 5;
				eventSlave.fetishStrength = Math.clamp(eventSlave.fetishStrength + 10, 0, 100);
				return r;
			}
		}

		function fuck() {
			r = [];

			r.push(`You're not particularly interested in what ${he} dreams about when ${he} gets the chance, and you tell ${him} so. Whatever sadistic little fantasies ${he} keeps locked away to bring out when ${he}'s got a moment to satiate ${his} perversions is less interesting to you than the prospect of`);
			if (V.PC.dick === 0) {
				r.push(`${his} mouth on your cunt. So, you shove ${him} down to sit on the couch and straddle ${his} face, cutting off any further whimsies by pressing your wet pussy against ${his} lips. ${He} eats you out obediently, accepting`);
				seX(eventSlave, "oral", V.PC, "vaginal");
			} else if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0)) {
				r.push(`giving it to ${him}. So, you shove ${him} down to sit on the couch, nudge ${his} legs apart, kneel between them, and pound ${his} pussy. You fuck ${him} so hard that ${he} doesn't have the attention for further whimsies, and ${he} accepts`);
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && (eventSlave.anus > 0)) {
				r.push(`fucking ${his} butt. So, you shove ${him} down to`);
				if (hasAnyLegs(eventSlave)) {
					r.push(`kneel`);
				} else {
					r.push(`get`);
				}
				r.push(`on the couch facing away from you, and ram your cock up ${his} asshole. You assfuck ${him} so hard that ${he} doesn't have the attention for further whimsies, and ${he} accepts`);
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				r.push(`${him} sucking your dick. So, you shove ${him} down to sit on the couch and give ${him} your cock to keep ${his} mouth occupied, cutting off any further whimsies. ${He} blows you obediently, accepting`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			r.push(`the implicit message that <span class="devotion inc">${he}'s your slut</span> in the real world, whatever thoughts ${he} may find appealing in the privacy of ${his} own mind.`);
			eventSlave.devotion += 3;
			return r;
		}
	}
};