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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => s.dick > 8,
				s => s.balls > 0,
				s => s.energy > 60,
				s => s.devotion > 50,
				s => s.trust > 50,
				s => canDoAnal(s) || canDoVaginal(s),
				s => s.belly < 100000,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

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

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

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

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

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


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

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

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

		App.Events.drawEventArt(node, eventSlave);

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

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

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

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

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

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

repo_name: Arkerthan/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				s => s.devotion <= 50,
				s => s.trust >= -50,
				s => (s.behavioralFlaw === "gluttonous" || s.geneMods.livestock === 1),
				s => s.diet === "restricted",
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

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

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

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

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

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

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

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

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


code:
App.Events.RESSEliteBreederPlease = class RESSEliteBreederPlease extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => FutureSocieties.isActive('FSRestart'),
			() => !!V.propOutcome,
		];
	}

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

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

		App.Events.drawEventArt(node, eventSlave);

		const r = new SpacedTextAccumulator(node);

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

		r.toParagraph();

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

		return r.container();

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

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

			r.toParagraph();

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

			return r.container();
		}

		function refuse() {
			const r = [];

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

			return r;
		}
	}
};


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

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

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

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

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

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

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

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

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


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				canHear,
				s => s.fetish === "humiliation" || s.energy > 95,
				s => s.devotion <= 50,
				s => s.devotion >= -20,
				s => canDoAnal(s) || canDoVaginal(s),
				s => s.anus !== 0,
				s => s.vagina !== 0,
				s => s.fetishKnown === 1,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		App.Events.addParagraph(node, [
			`Even if ${he} isn't yet a truly devoted sex slave,`,
			contextualIntro(V.PC, eventSlave, true),
			`generally obeys orders. ${He} blushes furiously when given any sexual command, but ${his} true feelings about humiliation become clear when ${he} is ordered to serve in front of others, even other slaves. It sometimes seems the number of people watching ${him} get fondled, used, or fucked directly reduces the distance between ${him} and ${his} next blushing or even sobbing orgasm.`
		]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Publicly prove the depths of ${his} humiliation to ${him}`, prove),
			new App.Events.Result(`Use a bait and switch tactic on ${him}, before public use`, tactic),
		]);

		function prove() {
			let r = [];
			r.push(`You drag a fearful, embarrassed,`);
			if (eventSlave.belly >= 1500) {
				if (eventSlave.bellyPreg >= 0) {
					r.push(`pregnant`);
				} else {
					r.push(`swollen`);
				}
			}
			r.push(`and totally naked ${eventSlave.slaveName} out into a public hall. A small knot of passersby gather around grinning, enjoying the sight of ${his} nakedness and anticipating a show. To ${his} surprise, you order ${him} to take a few minutes to recount ${his} life story. ${He}'s hesitant at first, but obeys, only realizing as ${he} nears the present day what an abject story of degradation and humiliation ${his} life truly is. ${He} continues shakily, describing in brief ${his} current life, crying a little and trembling with arousal. At a whispered command from you, ${he} concludes`);
			if (!canTalk(eventSlave)) {
				r.push(`in embarrassed gestures, "and now my ${getWrittenTitle(eventSlave)} is going to fuck my worthless body in public."`); // not spoken!
			} else {
				r.push(Spoken(eventSlave, `"and now my ${Master} is going to fuck my worthless body in public."`));
			}
			r.push(`You take ${him} standing there, as ${he} cries with mixed shame and sexual pleasure.`);
			if (!canDoVaginal(eventSlave)) {
				r.push(`${He}`);
				if (eventSlave.dick > 0) {
					r.push(`cums even though ${he}'s soft`);
				} else {
					r.push(`climaxes even though ${he}'s filled`);
				}
				r.push(`with the shame,`);
				if (V.PC.dick === 0) {
					r.push(`${his} anus clenching around the strap-on you're pumping in and out of it.`);
				} else {
					r.push(`adding a sad little dribble to the load dripping out of ${his} asshole.`);
				}
			} else {
				if (V.PC.dick === 0) {
					r.push(`You make ${him} clean ${his} pussyjuice off your strap-on with ${his} bitch mouth before you take it off.`);
				} else {
					r.push(`As you pull out of ${his} clenching pussy, cum runs down ${his} quavering thighs.`);
				}
			}
			r.push(`<span class="devotion inc">${He} has become more submissive to you,</span> and <span class="reputation inc">your reputation has increased.</span>`);
			eventSlave.devotion += 4;
			repX(500, "event", eventSlave);
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			return r;
		}

		function tactic() {
			let r = []; // TODO: redo art with "nicest clothing"
			r.push(`You instruct ${him} to get cleaned up and get dressed in ${his} nicest clothing. ${He} obeys, mystified, and is further puzzled to find that you're taking ${him} out for a nice evening at a small bar. You share a`);
			if (canTaste(eventSlave)) {
				r.push(`tasty`);
			} else {
				r.push(`fancy`);
			}
			r.push(`meal and listen to good music played on the little stage by an older slave. As the set concludes, you lean over and give ${eventSlave.slaveName} ${his} real orders for the evening. ${He} freezes in terror but eventually makes ${his} way up to the stage, strips in front of all the patrons, and says`);
			if (!canTalk(eventSlave)) {
				r.push(
					`in embarrassed gestures,`,
					Spoken(eventSlave, `"Please use me, I'm cheap."`)
				);
			} else {
				r.push(Spoken(eventSlave, `"One credit per fuck, if you'll do my worthless body on stage."`));
			}
			r.push(`By the end of the night, ${he}'s been fucked by almost everyone in the bar, and ${his} itch for humiliation has been well and truly scratched. As you collect ${his} earnings from the thoroughly pleased bartender, ${he} lies quiescent in a puddle of cum and exhaustion. You've collected a decent fee, and your reputation has increased.`);
			repX(500, "event", eventSlave);
			cashX(100, "event", eventSlave);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative", 10);
				seX(eventSlave, "anal", "public", "penetrative", 10);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 25, 2, -2));
				}
			} else if (canDoVaginal(eventSlave)) {
				seX(eventSlave, "vaginal", "public", "penetrative", 20);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 50, 0, -2));
				}
			} else {
				seX(eventSlave, "anal", "public", "penetrative", 20);
				if (eventSlave.eggType === "human" && canGetPregnant(eventSlave)) {
					r.push(knockMeUp(eventSlave, 50, 1, -2));
				}
			}
			return r;
		}
	}
};


code:
App.Events.RESSFirstPeriod = class RESSFirstPeriod extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeAge === 1,
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				(s) => s.fetish !== Fetish.MINDBROKEN,
				hasAnyArms,
				hasAnyLegs,
				(s) => s.actualAge < 18,
				(s) => s.devotion > 20,
				(s) => s.ovaries === 1,
				(s) => s.pubertyXX === 0,
				(s) => s.preg === 0,
				(s) => s.physicalAge + s.birthWeek / 52 >= s.pubertyAgeXX - 0.5,
			]
		];
	}

	get weight() {
		return 10;
	}

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

		App.Events.drawEventArt(node, slave);

		r.push(
			App.UI.DOM.slaveDescriptionDialog(slave),
			`appears in the door of your office, uncertain if ${he} should disturb you. ${He} stumbles through the doorway, hands on ${his}`
		);
		if (slave.weight >= 95) {
			r.push(`fat belly,`);
		} else if (slave.belly >= 2000) {
			r.push(`bloated belly,`);
		} else if (slave.weight >= 30) {
			r.push(`chubby belly,`);
		} else {
			r.push(`flat belly,`);
		}
		r.push(`before stepping forward to stand in front of your desk. ${His} chest is rising and falling with panicked hyperventilation. The poor ${girl} is terrified for some reason.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`You press ${him} on why ${he} is acting this way.`);
		if (canTalk(slave)) {
			r.push(
				Spoken(slave, `"My belly, ${Master},"`),
				`${he} ${say}s apologetically.`,
				Spoken(slave, `"It hurts and I don't know why. It just started recently."`)
			);
		} else {
			r.push(`${He} uses gestures to point to ${his} stomach, and explains that ${he} is feeling an unusual pain.`);
		}
		r.push(`You check ${his} records and discover ${he} has very likely just become a woman.`);
		slave.pubertyXX = 1;
		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Explain ${he}'s just becoming a woman`, justWoman));
		if (V.PC.dick !== 0 && slave.eggType === "human") {
			choices.push(new App.Events.Result(`Demonstrate what this means`, demonstrate, (slave.vagina === 0) ? `This option will take ${his} virginity` : null));
		}
		choices.push(new App.Events.Result(`Tell ${him} ${he}'ll just be taking it up the ass more`, ass, (slave.anus === 0) ? `This option will take ${his} anal virginity` : null));

		App.Events.addResponses(node, choices);

		function justWoman() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell ${him} that ${he} is just undergoing ${his} first period, and that the pain ${he} is feeling is perfectly natural.`);
			if (canTalk(slave)) {
				r.push(
					Spoken(slave, `"I-I'm a woman now? ${capFirstChar(Master)}, that m-means, I can get pregnant now."`),
					`${He} trails off.`
				);
			} else {
				r.push(`${He} brings ${his} hands back to ${his} stomach, an elated look on ${his} face. ${He} makes a gesture resembling a rounded belly.`);
			}
			r.push(`Whether or not ${he} gets pregnant is for you to decide, but for now you tell ${him} what ${he} should expect to change, both in and to ${his} body. ${slave.slaveName} appreciates you taking the time to explain ${his} developing body.`);
			slave.trust += 5;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function demonstrate() {
			const frag = new DocumentFragment();
			let r = [];
			let restoreChastity = false;
			if (slave.chastityVagina === 1) {
				r.push(`You unlock ${his} chastity belt and set it aside, ${his} ${canSee(slave) ? `eyes widening as ${he} watches` : `body stiffening as ${he} feels`} your movements.`);
				slave.chastityVagina = 0;
				restoreChastity = true;
			}
			r.push(`You tell ${him} that ${he} is just becoming a woman, and to celebrate, you are going to put a child in ${him}.`);
			if (canTalk(slave)) {
				r.push(Spoken(slave, `"But I'm still a child myself, ${Master}, I can't get pregnant yet!"`));
				r.push(`You tell ${him} that prior to this week, that would have been true. However, now that ${he} has become fertile, it's time that ${he} learned what ${his} body was made for.`);
			} else {
				r.push(`${He} gasps and rubs a hand across ${his} stomach.`);
				r.push(`You tell ${him} that ${he} has become fertile, and it's now time that ${he} learned what ${his} body was made for.`);
			}
			r.push(`You guide ${him} to the couch and tell ${him} to lie on ${his} back so that you may take ${him}. ${He} breaks down when ${he} feels your cock enter ${his}`);
			if (slave.vagina === 0) {
				r.push(`delightfully tight, virgin`);
			} else if (slave.vagina === 1) {
				r.push(`deliciously tight`);
			} else if (slave.vagina === 2) {
				r.push(`well experienced`);
			} else {
				r.push(`fucked-out`);
			}
			r.push(`cunt. ${His} new urges cause ${him} to reach up to hug ${himself} close to you,`);
			if (slave.boobs < 600) {
				r.push(`${his} modest breasts let ${him} snuggle close to you, face-to-face, as you take ${him}.`);
			} else if (slave.boobs < 10000) {
				r.push(`${his} big tits form a soft cushion between you as you take ${him}.`);
			} else {
				r.push(`${his} massive tits stop ${him} from bringing ${himself} too close to you as you take ${him}.`);
			}
			r.push(`${He} enjoys ${himself} immensely, but ${he} loses it again when ${he} feels your seed in ${him}, realizing that ${he} will find ${himself} swelling with your child over the coming months. ${He} has become more submissive to your will now that ${his} very first egg has been fertilized by ${his} ${getWrittenTitle(slave)}.`);
			slave.devotion += 5;
			slave.preg = 1;
			slave.pregWeek = 1;
			slave.pregKnown = 1;
			slave.pregSource = -1;
			slave.pregType = setPregType(slave);
			WombImpregnate(slave, slave.pregType, -1, 1);
			r.push(VCheck.Vaginal(slave, 1));

			if (restoreChastity) {
				r.push(`The deed done, you return ${his} chastity belt to its accustomed place before allowing ${him} to leave your office.`);
				slave.chastityVagina = 1;
			}

			App.Events.addParagraph(frag, r);
			return frag;
		}

		function ass() {
			const frag = new DocumentFragment();
			let r = [];
			if (slave.chastityAnus === 1 && slave.chastityVagina === 1) { // double chastity, remove anal
				r.push(`In one swift motion, you unlock and detach ${his} anal chastity belt. ${He} gasps at the sudden feeling of freedom at ${his} back door.`);
			} else if (slave.chastityAnus === 1) { // anal chastity, swap for vaginal
				r.push(`In a few swift motions, you remove ${his} anal chastity belt and replace it with one encasing ${his} vagina. ${He} gasps as ${he} feels it hug close to ${his} pussy.`);
			} else if (slave.chastityVagina === 1) { // vaginal chastity, don't remove
				r.push(`You bring your hand to ${his} chastity belt, feigning dramatically that you might remove it, before 'reconsidering' and pulling your hand away.`);
			} else { // no chastity, give vaginal
				r.push(`In one swift motion, you pull out a chastity belt and lock it onto ${him}. ${He} gasps as ${he} feels it hug close to ${his} pussy.`);
			}
			r.push(`You explain that ${he} has just become a woman, and thus, will be taking it up the ass until you decide it's time for ${him} to become pregnant.`);
			if (canTalk(slave)) {
				r.push(Spoken(slave, `"You don't want me to get pregnant, ${Master}?"`));
			} else {
				r.push(`${He} rubs a hand across ${his} stomach.`);
			}
			r.push(`You bring ${him} over to the couch, set ${him} on your lap, and teasingly call ${him} a buttslut. Every so often you graze a finger around ${his} chastity belt, noting how much ${his} body wants you in ${him}, but you only make it the center of attention once the poor over-aroused slave`);
			if (canTalk(slave)) {
				r.push(
					`${say}s,`,
					Spoken(slave, `"I can't take it any more, ${Master}! Please fuck me pregnant!"`)
				);
			} else {
				r.push(`begins to use piteous gestures to beg you abjectly to penetrate ${him}.`);
			}
			r.push(`You snicker, but remind ${him} that no matter how much ${he} wants to be knocked up, ${his} belt will direct all the dicks ${he} takes into ${his} rear. You line up and insert your`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`cock`);
			}
			r.push(`with ${his} ass and begin fucking ${him}, all the while reminding ${him} that ${he} will not be getting pregnant. When ${he} finally orgasms,`);
			if (V.PC.dick === 0) {
				r.push(`${his} unabashed enjoyment`);
			} else {
				r.push(`the strength of ${his} spasming sphincter`);
			}
			r.push(`sends you over as well. ${He}'s left in a confused haze; ${his} body tells ${him} to get pregnant, but you tell ${him} to take it anally. ${He} sides with your decision and vows to be an anal whore for you.`);
			if (slave.fetish === Fetish.NONE) { // TODO: text and the original "coral" color suggests fetish loss here, perhaps pregnancy.
				r.push(`<span class="fetish loss">Overcoming ${his} urges to become a mother via anal causes ${him} to become a buttslut.</span>`);
				slave.fetish = "buttslut";
				slave.fetishStrength = 10;
			}
			slave.devotion += 5;
			slave.chastityVagina = 1;
			slave.chastityAnus = 0;
			r.push(VCheck.Anal(slave, 1));

			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.RESSFucktoyTribbing = class RESSFucktoyTribbing extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => fuckSlavesLength() > 2,
			() => V.PC.vagina > -1,
		]; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== Fetish.MINDBROKEN,
				canTalk,
				s => [Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment),
				s => s.devotion > 20,
				s => s.trust >= -20,
				s => canDoAnal(s) || canDoVaginal(s),
				canDoVaginal,
				s => s.dick === 0,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, hers, girl, woman
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const {hisU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");

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

		const r = new SpacedTextAccumulator(node);
		r.push(`With a mind as busy as yours, you sometimes wake up in the middle of the night for no reason that you can remember.`);
		if (V.PC.actualAge >= 50) {
			r.push(`These incidents have become more common as you age; merely one of time's little mutilations.`);
		}
		r.push(`Naturally, waking up in the middle of the night feels much different than it did back before you owned an arcology. Now you have your choice from a virtual buffet of sleeping slaves if you don't feel like going back to sleep right away.`);
		r.toParagraph();

		r.push(`The slave on your left is sleeping on ${hisU} back, and is touching you lightly at the hip and shoulder. The slave on your right, though, is nestled in close, ${his} shoulder under your arm and ${his} head resting gently on your`);
		if (V.PC.boobs >= 1400) {
			r.push(`enormous`);
			if (V.PC.boobsImplant > 0) {
				r.push(`firm`);
			} else {
				r.push(`pillowy`);
			}
			r.push(`breast.`);
		} else if (V.PC.boobs >= 1200) {
			r.push(`huge`);
			if (V.PC.boobsImplant > 0) {
				r.push(`firm`);
			} else {
				r.push(`pillowy`);
			}
			r.push(`breast.`);
		} else if (V.PC.boobs >= 1000) {
			r.push(`big`);
			if (V.PC.boobsImplant > 0) {
				r.push(`firm`);
			} else {
				r.push(`soft`);
			}
			r.push(`breast.`);
		} else if (V.PC.boobs >= 300) {
			r.push(`bare breast.`);
		} else if (V.PC.title === 0) {
			r.push(`flat chest.`);
		} else {
			r.push(`toned chest.`);
		}
		r.push(`${He}'s straddling your leg on that side, and as your waking consciousness coalesces, you become more and more aware`);
		if (eventSlave.belly >= 10000) {
			r.push(`of the weight of ${his} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnancy`);
			} else {
				r.push(`stomach`);
			}
			r.push(`on your`);
			if (V.PC.belly >= 5000) {
				r.push(`own gravid`);
			}
			r.push(`middle and`);
		}
		r.push(`that ${his} mons is pressed against your thigh. ${He} has one leg thrown over yours in ${his} sleeping embrace, placing ${his} own`);
		if (eventSlave.muscles > 30) {
			r.push(`muscular`);
		} else if (eventSlave.weight > 10) {
			r.push(`plush`);
		} else {
			r.push(`feminine`);
		}
		r.push(
			`thigh against your womanhood in turn. It's`,
			contextualIntro(V.PC, eventSlave, true)
		);
		r.addToLast(`, and you feel yourself begin to grow wet as you gaze at ${him} in the dim light and feel ${his} slumbering heat.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Make love to ${him}`, love),
			new App.Events.Result(`Fuck ${him}`, fuck),
		]);

		function love() {
			const r = new SpacedTextAccumulator();
			r.push(`You crane your neck down and kiss ${him} on the lips. ${He} awakens slowly, gently, ${his} ${App.Desc.eyesColor(eventSlave)} fluttering open, looking black in the nighttime gloom. ${He} smiles into your mouth, and you feel ${his} pulse quicken through the extensive contact down your bodies. You interlace your fingers between ${hers} and turn, pressing ${him} back down into the soft sheets. ${He} opens ${himself} for you, spreading ${his} legs wide and embracing you with them, making sure to run ${his} heels up the backs of your calves in a way that sends a shiver up your spine. Feeling this through your kissing mouths, ${he} smiles into you, a pleased expression ${he} maintains as you`);
			if (eventSlave.belly >= 300000 && V.PC.belly >= 5000) {
				r.push(`struggle to find a position to handle both your pregnancy and ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`${belly} gravid middle`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			} else if (eventSlave.belly >= 300000) {
				r.push(`struggle to find a position to handle ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			} else if (eventSlave.belly >= 5000 && V.PC.belly >= 5000) {
				r.push(`shift into a position to better accommodate both your pregnancy and ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`${belly} gravid middle`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			} else if (V.PC.belly >= 5000) {
				r.push(`shift into a position to better accommodate your pregnancy and`);
			} else if (eventSlave.belly >= 5000) {
				r.push(`shift into a position to better accommodate ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`${belly} belly`);
				}
				r.push(`and`);
			}
			r.push(`begin to gently press your womanhood against ${hers}.`);
			r.toParagraph();

			if (eventSlave.fetishKnown === 0) {
				r.push(`Knowing little about ${his} sexual peccadilloes, but confident that ${he}'ll do ${his} best to enjoy your lovemaking, you continue this shockingly intimate intercourse until ${he} climaxes.`);
			} else if (eventSlave.fetish === Fetish.NONE) {
				r.push(`Knowing ${him} to be quite endearingly vanilla, you continue this shockingly intimate intercourse until ${he} climaxes, kissing ${him} all the way through your soft missionary lovemaking.`);
			} else if (eventSlave.fetish === "buttslut") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you slide a hand around behind and under ${him} so you can tease ${his} ass. ${He} gives ${his} butt a little wiggle of thanks, and orgasms promptly.`);
				seX(eventSlave, "anal", V.PC, "penetrative");
			} else if (eventSlave.fetish === "cumslut") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you slide your tongue into ${his} mouth, making your kisses so frankly sexual and penetrative that you're practically making oral love at the same time as you do it missionary style.`);
			} else if (eventSlave.fetish === "sadist") {
				r.push(`You know ${his} tastes, but by the act of this intimate missionary lovemaking, you wordlessly command ${him} to join you for more conventional pleasures, if only for the moment. ${He} complies with pleasure, climaxing with surprising speed; perhaps ${he} appreciates the change.`);
			} else if (eventSlave.fetish === "masochist") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you nip ${his} lower lip in your teeth with each kiss, and rake your nails across ${his} flanks just hard enough to hurt a little. ${He} climaxes quickly to the mixed pain and missionary intimacy.`);
			} else if (eventSlave.fetish === "dom") {
				r.push(`You know ${his} tastes, but by the act of this intimate missionary lovemaking, you wordlessly command ${him} to join you for more equal pleasures, if only for the moment. ${He} complies with something like relief, climaxing with surprising speed; perhaps ${he} appreciates a turn on the bottom.`);
			} else if (eventSlave.fetish === Fetish.SUBMISSIVE) {
				r.push(`Being on the bottom for some missionary lovemaking is very much to ${his} tastes, and ${he} rises to the point of climax with almost indecent speed. You slow your pace to nothing more than a gentle pressure now and then, and keep ${him} on the edge of orgasm for a long time.`);
			} else if (eventSlave.fetish === "boobs") {
				r.push(`Knowing ${his} tastes and wanting the intimacy of mutual pleasure, you make sure your nipples line up`);
				if (eventSlave.nipples === "fuckable") {
					r.push(`and interlock`);
				}
				r.push(`with ${hers} as best you can. You note the buck of pleasure this produces each time you get it perfectly right as you make love to ${him}.`);
			} else if (eventSlave.fetish === "pregnancy" && eventSlave.pregKnown === 1) {
				r.push(`Being on the bottom for some missionary lovemaking is very much to ${his} tastes, even though ${he} is already pregnant. ${He} builds to orgasm slowly, reveling in the feeling of being your ${woman}.`);
			} else if (eventSlave.fetish === "pregnancy") {
				r.push(`Being on the bottom for some missionary lovemaking is very much to ${his} tastes, even though the encounter isn't particularly likely to get ${him} pregnant. ${He} builds to orgasm slowly, reveling in the feeling of being your ${woman}.`);
			}
			if (canFemImpreg(V.PC, eventSlave)) {
				r.push(knockMeUp(V.PC, 5, 0, eventSlave.ID));
			}
			r.push(`As you made love to ${him}, the gentle motions, feminine sighs, and delicate aroma of pleasure woke the other slaves in bed with you, and they began their own intimacy with each other. As you go back to sleep, you're surrounded with something very like Sapphic paradise. ${eventSlave.slaveName} nestles up to you once more, embracing you with trust born of love.`);
			eventSlave.trust += 4;
			seX(eventSlave, "vaginal", V.PC, "penetrative");
			r.toParagraph();
			return r.container();
		}

		function fuck() {
			const r = new SpacedTextAccumulator();
			r.push(`You feel your libido building, building, building within you, an endless cycle that mounts rapidly to an inevitable explosion. It comes, and you perform a catlike glide around until your head is at ${his} feet. As you did, you infiltrated one of your legs between ${hers} from its convenient starting point. ${He} wakes suddenly to the feeling of being manhandled, and then comes fully awake to the shockingly intimate sensation of your pussies pressed together as closely as physically possible.`);
			r.toParagraph();

			r.push(`Holding ${his} upper thighs with your hands to pull ${him} against you, you grind into ${him}, fucking ${him} about as comprehensively as it's possible for someone without a cock to fuck a ${woman}. ${He}'s most definitely up for it, and you see ${his} eyes fly wide in the gloom as the full weight of the pleasure crashes into ${him}. It's not exactly a position for lovemaking, since your faces are about as far apart as they can possibly be during sex, but kissing be damned, you're here to fuck. Naturally, this evolution wakes everyone else up too, and before long, there's a regular lesbian orgy going on. When it's over, ${eventSlave.slaveName} finds ${himself} returning exhaustedly to sleep, one of your arms curled`);
			if (eventSlave.belly >= 5000) {
				r.push(`under ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy`);
				} else {
					r.push(`belly`);
				}
			} else {
				r.push(`around ${his} middle`);
			}
			r.push(`to cup ${his} pussy possessively. ${He} finds that <span class="devotion inc">${he} doesn't mind.</span> ${He}'s your ${girl}.`);
			eventSlave.devotion += 4;
			seX(eventSlave, "vaginal", V.PC, "penetrative");
			if (canFemImpreg(V.PC, eventSlave)) {
				r.push(knockMeUp(V.PC, 5, 0, eventSlave.ID));
			}
			r.toParagraph();
			return r.container();
		}
	}
};