code:
App.Events.REShowerPunishment = class REShowerPunishment extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.HeadGirlID !== 0,
		];
	}

	actorPrerequisites() {
		return [[
			(s) => s.devotion <= 50,
			(s) => s.anus !== 0,
			(s) => s.fetish !== Fetish.MINDBROKEN,
			canDoAnal,
			hasAnyLegs,
			hasAnyArms,
			canTalk,
		]];
	}

	execute(node) {
		const r = new SpacedTextAccumulator(node);
		const slave = getSlave(this.actors[0]);

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

		const {title: Master} = getEnunciation(slave);

		const {
			He2, His2,
			he2, his2, him2, woman2, girl2
		} = getPronouns(S.HeadGirl).appendSuffix("2");

		App.Events.drawEventArt(node, [slave, S.HeadGirl], "no clothing");

		if (V.HGSuite === 1) {
			r.push(`Looking in on your Head Girl in ${his2} suite, you hear ${his2} private shower running and head that way. Through the thick steam the shower makes on its hottest setting, you see`);
		} else {
			r.push(`Passing by the showers, you see, through the steam of a very hot shower,`);
		}
		r.push(`a`);
		if (slave.height > 180) {
			r.push(`tall,`);
		} else if (slave.height < 150) {
			r.push(`tiny,`);
		}
		r.push(
			`${slave.skin} form moving busily around a ${S.HeadGirl.skin} figure, which is standing confidently in the middle of the warm, moist space. As you draw nearer, you identify the stationary slave as your Head Girl,`,
			App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(S.HeadGirl), "."),
			`${His2} attendant is`,
			App.UI.DOM.combineNodes(contextualIntro(S.HeadGirl, slave, true), `,`),
			`and ${he}'s washing ${his} superior with a big sponge.`,
		);

		if (V.HGSeverity > 0) {
			r.push(`By virtue of not being rape, this is an unusually mild punishment by your Head Girl, if indeed that's what it is. But perhaps ${he2}'s saving that for later. And to go by the cringing, frightened mien of the busy little bath bitch, that's probably it.`);
		} else if (V.HGSeverity === 0) {
			r.push(`Your Head Girl does ${his2} best to fit the punishment to the crime, so ${slave.slaveName}'s failure was likely minor. With ${S.HeadGirl.slaveName}'s penchant for poetic justice, probably some little deficiency of personal cleanliness.`);
		} else {
			r.push(`This is the sort of mild punishment that your regime of respect and dignity requires ${him2} to use for all but the most egregious fault. Thus restricted, ${he2} does ${his2} best to come up with novel little degradations to keep ${his2} charges on their toes.`);
		}
		r.toParagraph();
		r.push(`${slave.slaveName} is being very thorough. When you first appeared, ${he} was working ${his} way up ${S.HeadGirl.slaveName}'s `);
		if (S.HeadGirl.muscles > 30) {
			r.push(`muscle-corded`);
		} else if (S.HeadGirl.weight > 10) {
			r.push(`soft`);
		} else if (S.HeadGirl.vagina > -1) {
			r.push(`feminine`);
		} else {
			r.push(`pretty`);
		}
		r.push(`thighs, having obviously started at the bottom. ${He} skips over ${S.HeadGirl.slaveName}'s crotch, probably under instructions to leave it for last. It's late in your Head Girl's busy day, and you hear ${his2} groan of relaxation over the running water when the stiff sponge begins to scrub back and forth across ${his2}`);
		if (S.HeadGirl.belly >= 60000) {
			r.push(`enormously`);
			if (S.HeadGirl.preg > 0) {
				r.push(`pregnant`);
			} else {
				r.push(`rounded`);
			}
			r.push(`belly.`);
		} else if (S.HeadGirl.weight > 190) {
			r.push(`massively fat gut.`);
		} else if (S.HeadGirl.belly >= 10000) {
			r.push(`hugely`);
			if (S.HeadGirl.preg > 0) {
				r.push(`pregnant`);
			} else {
				r.push(`rounded`);
			}
			r.push(`belly.`);
		} else if (S.HeadGirl.weight > 95) {
			r.push(`big soft belly.`);
		} else if (S.HeadGirl.belly >= 5000) {
			if (S.HeadGirl.preg > 0) {
				r.push(`pregnant`);
			} else {
				r.push(`round`);
			}
			r.push(`belly.`);
		} else if (S.HeadGirl.weight > 30) {
			r.push(`soft belly.`);
		} else if (S.HeadGirl.belly >= 1500) {
			r.push(`bloated belly.`);
		} else if (S.HeadGirl.muscles > 30) {
			r.push(`shredded abs.`);
		} else if (S.HeadGirl.weight > 10) {
			r.push(`plush belly.`);
		} else if (S.HeadGirl.piercing.navel.weight > 0) {
			r.push(`pierced belly button.`);
		} else if (S.HeadGirl.waist < -10) {
			if (S.HeadGirl.waist < -95) {
				r.push(`absurdly`);
			}
			r.push(`narrow waist.`);
		} else {
			r.push(`belly.`);
		}
		r.toParagraph();

		const choices = [];
		choices.push(new App.Events.Result(`Just spectate`, spectate));
		choices.push(new App.Events.Result(`Get a scrub down too`, scrub));
		choices.push(new App.Events.Result(`Focus on your Head Girl`, HG));
		App.Events.addResponses(node, choices);

		function spectate() {
			const r = new SpacedTextAccumulator();
			r.push(`You could strip off your suit, walk into the steam, and enjoy your slaves' ministrations, but sometimes the artistry of tastefully nude bodies is a welcome change of pace. You lean against the wall, far enough away that they remain unaware of your presence, and take in the sight. ${S.HeadGirl.slaveName} makes the penitent ${girl} do the job with Brahmanical thoroughness, cleaning ${his} superior's ${S.HeadGirl.race} body down to its very last pore. As ${slave.slaveName} circles the Head Girl laboriously, doing ${his} best to ingratiate ${himself} by diligence, the pair of naked`);
			if (girl === girl2) {
				r.push(`${women}`);
			} else {
				r.push(`slaves`);
			}
			r.push(`present a fascinating contrast. They are unclothed alike, the water streaming off their bodies without any distinction, but even an old world fool could not mistake the immense gulf between them.`);
			r.toParagraph();
			r.push(`When ${slave.slaveName} is finally done, ${S.HeadGirl.slaveName}'s`);
			if (V.HGSeverity > 0) {
				r.push(`hands seize ${him} by the ears and pull ${his} head in for a kiss that is dominance distilled into the form of a loving gesture. Then ${he2} pokes ${his2} bitch in the side, forcing the slave to collapse in just the right way.`);
			} else if (V.HGSeverity === 0) {
				r.push(`arms encircle ${him} in an embrace that is simultaneously controlling, comforting, and sexually insistent. The slave does not resist, allowing the Head Girl to run ${his2} hands over the warm, wet sex slave.`);
			} else {
				r.push(`arousal is obvious. Though the respectful regime you require secures ${him} from the fear of being used, ${slave.slaveName} nonverbally offers ${his} superior oral, out of obvious gratitude that whatever ${he} did is being treated so leniently, and perhaps out of a desire to be in ${S.HeadGirl.slaveName}'s good graces.`);
			}
			r.push(`In no time at all, ${slave.slaveName}'s ${slave.hColor} head descends to obscure ${S.HeadGirl.slaveName}'s groin. The`);
			if (S.HeadGirl.face > 95) {
				r.push(`heartrendingly gorgeous`);
			} else if (S.HeadGirl.face <= 95) {
				r.push(`wonderfully pretty`);
			} else if (S.HeadGirl.face <= 40) {
				r.push(`approachably lovely`);
			} else if (S.HeadGirl.face <= 10) {
				r.push(`not unattractive`);
			} else {
				r.push(`homely`);
			}
			if (S.HeadGirl.physicalAge > 25) {
				r.push(`${woman2}'s`);
			} else {
				r.push(`${girl2}'s`);
			}
			r.push(`head cranes back with orgasm before long; that diligent scrub must have been quite stimulating.`);
			r.toParagraph();
			r.push(`${slave.slaveName} stays in the shower to clean ${himself}, so ${S.HeadGirl.slaveName} exits to see you watching the denouement. ${He2} smiles, murmuring a greeting, and hurries over to give you a peck on the cheek, leaning in as best ${he2} can to keep ${his2} moist body away from your suit. "This is the life, ${Master}," ${he2} whispers.`);
			seX(slave, "oral", S.HeadGirl, "penetrative");
			S.HeadGirl.devotion += 4;
			r.toParagraph();

			return r.container();
		}

		function scrub() {
			const r = new SpacedTextAccumulator();
			r.push(`You strip off your suit and enter the shower. By the time you get in, ${S.HeadGirl.slaveName}'s sponge scrub is almost done. ${He2} turns to greet you with half-lidded eyes, well pleased with ${his2} thorough scrubbing. ${His2} ${S.HeadGirl.skin} skin shines with wet cleanliness, and ${his2} ${S.HeadGirl.nipples} nipples begin to`);
			if (S.HeadGirl.nipples === "fuckable") {
				r.push(`swell with arousal`);
			} else {
				r.push(`stiffen`);
			}
			r.push(`as ${he2} sees your gaze take in ${his2} nude body. ${He2} brusquely orders ${slave.slaveName} to scrub you, too, anticipating your intention. The rough, exfoliating sensation of the sponge is indeed delightful, and you close your eyes to savor the feeling as the slave rubs it up and down your calves and then the backs of your knees.`);
			r.toParagraph();
			if (V.HGSeverity > 0) {
				r.push(`You detect tremors of fear in the`);
				if (hasAnyArms(slave)) {
					r.push(`slave's ${hasBothArms(slave) ? "hands" : "hand"};`);
				} else {
					r.push(`slave;`);
				}
				r.push(`${he} knows that ${he} hasn't extirpated ${his} misbehavior, whatever it was, just yet. You let your Head Girl manage that, however, and ${he2} does. When ${slave.slaveName} is stuck in one position for a short time by the need to wash your thighs, you hear a gasp and open your eyes to the sight of your Head Girl crouched behind ${him}, giving ${him} an anal fingerfuck. When ${slave.slaveName} is done washing you, your Head Girl holds the slave's head to your`);
			} else {
				r.push(`When the washing reaches your shoulders, it becomes clumsier, and ${slave.slaveName}'s wet body begins to bump gently against your torso. Opening your eyes, you see that your Head Girl is taking ${him} as ${he} finishes your bath. ${slave.slaveName} is doing ${his} best to do a good job as ${he}'s fucked, and ${he} manages it reasonably well. When ${he}'s done, ${S.HeadGirl.slaveName} pushes ${his} head down towards your`);
			}
			if (V.PC.dick !== 0) {
				r.push(`groin so ${he} can suck you off${(V.PC.vagina !== -1) ? "and stroke your cunt" : ""}.`);
			} else {
				r.push(`cunt so ${he} can eat you out.`);
			}
			r.push(`${slave.slaveName} complies, and afterward, ${he} seems to feel that <span class="trust inc">${he} came off reasonably well;</span> it could have been worse.`);
			seX(slave, "anal", S.HeadGirl, "penetrative");
			seX(slave, "oral", V.PC, "penetrative");
			r.push(knockMeUp(slave, 10, 1, V.HeadGirlID));
			slave.trust += 4;
			r.toParagraph();
			return r.container();
		}

		function HG() {
			const r = new SpacedTextAccumulator();
			const {hersP} = getPronouns(V.PC).appendSuffix("P");
			r.push(`You strip off your suit and walk into the steam, producing a surprised but welcoming greeting from your Head Girl and a muffled, submissive noise from ${slave.slaveName}. ${S.HeadGirl.slaveName} is held more or less stationary by the slave ${he2}'s straddling, so you step in, hook a dominant arm around ${his2} waist, and kiss ${him2}. There's precisely one person in this arcology who's allowed to treat ${him2} as ${hersP}, and it's you. ${He2} relaxes into you with gratitude as you shoulder the burden of being the leader in this little area of your empire, lifting it from ${his2} shoulders for now.`);
			r.toParagraph();
			r.push(`You run a hand up the side of ${his2} neck, bringing it to rest with your fingers cupping ${him2} under the ear and your thumb running up along ${his2} temple. ${He2} shivers, unable to concentrate despite all ${his2} poise, the ongoing oral service blending into your intense closeness. Right now, ${he2}'s the`);
			if (S.HeadGirl.physicalAge > 25) {
				r.push(`${woman2}`);
			} else {
				r.push(`${girl2}`);
			}
			r.push(`for you, so you snap your fingers next to the ear of the slave`);
			if (S.HeadGirl.vagina > -1) {
				r.push(`eating ${him2} out,`);
			} else {
				r.push(`blowing ${him2},`);
			}
			r.push(`point at the dropped sponge, and then point at yourself. The oral stops as ${slave.slaveName} hurries to scrub you, starting at your feet, but your Head Girl doesn't care. You're kissing ${him2}.`);
			r.toParagraph();
			r.push(`${He2} gently strokes your `);
			if (V.PC.dick !== 0) {
				r.push(`rapidly hardening member, smiling into your mouth at the speed with which it stiffens${(V.PC.vagina !== -1) ? ", and teases your pussylips with mischievous fingers" : ""}.`);
			} else {
				r.push(`flushed cunt, smiling into your mouth at the moisture that instantly coats ${his2} fingertips.`);
			}
			r.push(`You reach out in turn,`);
			if (S.HeadGirl.vagina > -1) {
				r.push(`caressing ${his2} pussylips before slowly inserting a digit inside ${his2} warmth while nuzzling ${his2} clit with the knuckle of your thumb. At the first real brush against ${his2} clitoris, the overstimulated ${S.HeadGirl.slaveName} climaxes, pulling ${his2} mouth away from you to shout your name and then sobbing thanks into your ear.`);
			} else {
				r.push(`hooking your fingers up underneath ${his2} taint to grope ${his2} anus. After teasing ${his2} asspussy for a moment you bring your hand slowly across ${his2} perineum${(S.HeadGirl.scrotum > 0) ? `until ${his2} ballsack rests against your wrist` : ""}. The overstimulated ${S.HeadGirl.slaveName} cums the instant the butt of your hand touches the base of ${his2} cock. ${He2} screams your name.`);
			}
			r.toParagraph();
			r.push(`${He2} isn't terribly affected by loving shower sex with you; after all, it isn't exactly novel for ${him2}. ${slave.slaveName} was there to bear witness, though, scrubbing your back as ${S.HeadGirl.slaveName} clung to it with orgasm. ${He} can't help but be impressed. Maybe, just maybe, that could be ${him} someday. ${He} seems distinctly uncomfortable.`);

			seX(slave, "oral", S.HeadGirl, "oral");

			slave.devotion += 4;

			r.toParagraph();
			return r.container();
		}
	}
};


code:
App.Events.RESiblingPlease = class RESiblingPlease extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seePreg !== 0,
			() => V.seeIncest !== 0, // daughter participates in sex scenes
			() => isFullyPotent(V.PC), // natural impregnation of slave's mother by potent PC; other paths are potentially possible but not written
			() => !FutureSocieties.isActive('FSRestart') // in a Eugenics arcology this event would require extra checks and special dialog that hasn't been written
		];
	}

	actorPrerequisites() {
		return [
			[ // requesting slave (daughter) is devoted, trusting, and relatively independent
				canTalk,
				canHear,
				canMove,
				s => s.fetish !== Fetish.MINDBROKEN,
				s => s.devotion > 50,
				s => s.trust > 50,
				hasAnyEyes, // for winking
			],
			[ // and her mother, who has only the one child, but is capable of bearing another for the PC
				s => s.ID === getSlave(this.actors[0]).mother,
				s => s.daughters === 1, // note that the requesting slave CAN have half-sisters on her *father's* side, so a male PC's children are eligible to ask for a full sibling
				this.impregCheck,
				s => s.womb.length === 0 // and not already expecting another child...no begging for superfet babies in this event
			]
		];
	}

	/** @param {FC.SlaveState} slave */
	impregCheck(slave) {
		// we can't just ask for canGetPregnant here, because of contraceptives and chastity devices, which the PC can remove
		return isFertile(slave, !fertKnown(slave)) && !isMenstruating(slave) && ((slave.ovaries === 1 && slave.vagina >= 0) || slave.mpreg === 1) && canBreed(slave, V.PC);
	}

	execute(node) {
		const [dau, mom] = this.actors.map(a => getSlave(a));

		const {He, His, he, him, his, himself, daughter} = getPronouns(dau);
		const {He2, he2, him2, his2, himself2} = getPronouns(mom).appendSuffix('2');
		const {title: Master} = getEnunciation(dau);

		App.Events.drawEventArt(node, [dau, mom]);

		const t = new SpacedTextAccumulator(node);
		t.push(`After you complete your weekly inspection of`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, dau, true), `, your instincts tell you that the ${SlaveTitle(dau)} has something more on ${his} mind.`));
		t.push(`You take a moment to look at ${him}, ${canStand(dau) ? "standing" : "sitting"} there in front of your desk. ${He}'s devoted to you, willing to please you for the sake of pleasing you, rather than to avoid punishment or to make ${his} own life easier, and ${he} trusts you implicitly. With that in mind, you ask what's bothering ${him}.`);
		t.toParagraph();

		t.push(Spoken(dau, `"I... I was thinking about family, and mom. Can... can I have a little sister, ${Master}? We could do all sorts of things together!"`));
		t.push(`${He} winks seductively at you, and suddenly you're thinking about all the fun things you could do with them. And with a bit of patience it's definitely workable;`, contextualIntro(dau, mom, true), `could bear ${mom.counter.births > 0 ? `another` : `a`} child for you, without a doubt.`);
		t.toParagraph();

		App.Events.addResponses(node, [
			new App.Events.Result(`Bring ${mom.slaveName} up and impregnate ${him2} now`, impregMom, virginityCheck(mom)),
			this.impregCheck(dau) ? new App.Events.Result(`Give ${him} a daughter, instead of a sister`, impregDau, virginityCheck(dau)) : new App.Events.Result(),
			this.impregCheck(dau) ? new App.Events.Result(`Get them both pregnant, for extra family fun`, impregBoth, virginityCheck(mom, dau)) : new App.Events.Result(),
			new App.Events.Result(`${He}'s fine as an only child`, decline)
		]);

		/** @param {FC.SlaveState[]} slaves */
		function virginityCheck(...slaves) {
			const vir = [];
			for (const slave of slaves) {
				if (canDoVaginal(slave) && slave.vagina === 0) {
					vir.push(`${slave.slaveName}'s virginity`);
				} else if (slave.mpreg === 1 && canDoAnal(slave) && slave.anus === 0) {
					vir.push(`${slave.slaveName}'s anal virginity`);
				}
			}
			if (vir.length > 0) {
				return `This option will take ${toSentence(vir)}.`;
			}
		}

		/** Prepare and actually fuck the mom
		 * @param {SpacedTextAccumulator} t
		 * @param {boolean} disobedient
		 */
		function fuckMom(t, disobedient) {
			const mobile = canMove(mom);
			if (!mobile) {
				t.push(`You have ${mom.slaveName} brought up to your office, stripped, and placed on the couch.`);
			} else {
				t.push(`You order ${mom.slaveName} to come up to your office immediately. ${He2} presents ${himself2} in a suitably short time, and strips when ordered, perhaps expecting a surprise inspection.`);
			}
			t.push(`You explain the situation briefly; upon`);
			if (canHear(mom)) {
				t.push(`hearing`);
			} else {
				t.push(`learning`);
			}
			t.push(`that you intend to impregnate ${him2}, ${he2}`);
			if (disobedient) {
				t.push(`starts to struggle.`);
				if (mobile) {
					t.push(`You throw ${him2} down on the couch, and at`);
				} else {
					 t.push(`At`);
				}
				t.push(`your word, ${dau.slaveName} holds ${him2} down so you can rape ${him2}. ${mom.slaveName}'s face registers shock at ${his2} ${daughter}'s betrayal, and replaces ${his2} struggling with sobbing.`);
			} else if (mom.fetish === "pregnancy") {
				t.push(`smiles broadly and begins to shed tears of joy as ${dau.slaveName} embraces ${him2}`);
				if (mobile) {
					t.push(`before guiding ${him2} to lay down on the couch`);
				}
				t.addToLast('.');
			} else if (mom.devotion > 50) {
				t.push(`seems eager to use ${his2} body to make you another slave, and ${dau.slaveName} a new sibling.`);
				if (mobile) {
					t.push(`${He2} lays on the couch, presenting ${his2} ${mom.mpreg ? 'ass' : 'vagina'} to you.`);
				}
			} else {
				if (mobile) {
					t.push(`compliantly lays on the couch awaiting the inevitable.`);
				} else {
					t.push(`indicates ${his2} compliance.`);
				}
			}

			t.toParagraph();

			if (!mom.mpreg && mom.chastityVagina) {
				mom.chastityVagina = 0;
				t.push(`You remove ${mom.slaveName}'s chastity belt and set it aside; it won't do to have it in the way right now.`);
			} else if (mom.mpreg && mom.chastityAnus) {
				mom.chastityAnus = 0;
				t.push(`You remove ${mom.slaveName}'s anal chastity device and set it aside; it won't do to have it in the way right now.`);
			}

			if (mom.vaginaLube === 2 && !mom.mpreg) {
				t.push(`Even though ${mom.slaveName}'s sopping cunt is already dripping on the couch, you order ${dau.slaveName} to use ${his} mouth to get ${him2} ready for you, and ${he} dives in eagerly.`);
				seX(dau, "oral", mom, "vaginal", 1);
			} else if (mom.mpreg) {
				t.push(`As you had directed, ${dau.slaveName} uses ${his} mouth and tongue to clean and lubricate the entrance to ${his} mother's anal womb as preparation.`);
				seX(dau, "oral", mom, "anal", 1);
			} else {
				t.push(`As you had directed, ${dau.slaveName} eagerly goes down on ${his} mother's cunt, to get ${him2} good and ready for your cock.`);
				seX(dau, "oral", mom, "vaginal", 1);
			}
			if (mom.devotion > 50) {
				t.push(`Knowing just how receptive ${his} mother is, ${dau.slaveName} straddles ${mom.slaveName}'s face and allows ${him2} to return the favor.`);
			}
			t.toParagraph();

			t.push(`You move over to the couch to do your part of the work knocking up ${mom.slaveName}.`);
			if (!mom.mpreg) {
				const vCheckText = VCheck.Vaginal(mom, 7);
				if (vCheckText) {
					t.push(vCheckText);
				} else {
					t.push(`You push yourself into ${his}`);
					if (mom.vagina > 2) {
						t.push("gaping");
					} else if (mom.vagina === 1) {
						t.push("tight");
					}
					t.push(`pussy, working away at ${him} vigorously.`);
				}
			} else { // mpreg
				const vCheckText = VCheck.Anal(mom, 7);
				if (vCheckText) {
					t.push(vCheckText);
				} else {
					t.push(`You push yourself into ${his}`);
					if (mom.anus > 2) {
						t.push("gaping");
					} else if (mom.anus === 1) {
						t.push("tight");
					}
					t.push(`anus, working away at ${him} vigorously.`);
				}
			}
			if (disobedient) {
				t.push(`Meanwhile, ${dau.slaveName} watches transfixed as ${he} holds ${mom.slaveName} in place.`);
			} else {
				const helping = [];
				if (V.PC.scrotum > 1 && V.PC.balls > 1) {
					helping.push("sucking your balls");
				}
				if (V.PC.boobs >= 300) {
					helping.push("massaging your breasts");
				}
				if (mom.dick > 0) {
					helping.push(`sliding ${his} hand up and down ${mom.slaveName}'s dick`);
				} else if (mom.clit > 0) {
					helping.push(`rubbing ${mom.slaveName}'s clit`);
				}
				helping.push("licking your nipples");
				if (helping.length < 2) {
					helping.push("so on");
				}
				t.push(`Meanwhile, ${dau.slaveName} "helps" any way ${he} can... running ${his} hands over both your bodies, ${toSentence(helping)}.`);
			}
			t.push(`Eventually, you come deep inside ${him2}, filling ${his2}${mom.mpreg ? ` anal` : ``} womb with your seed.`);
			t.toParagraph();
		}

		/** Actually fuck the daughter
		 * @param {SpacedTextAccumulator} t
		 */
		function fuckDau(t) {
			t.push(`You move over to a convenient leather chair and sit down, signalling to ${dau.slaveName} that ${he} should climb on top`);
			if (!dau.mpreg && dau.chastityVagina) {
				t.push(`after removing ${his} chastity belt, which you've unlocked`);
				dau.chastityVagina = 0;
			} else if (dau.mpreg && dau.chastityAnus) {
				t.push(`after removing ${his} anal chastity belt, which you've unlocked`);
				dau.chastityAnus = 0;
			}
			t.addToLast(`.`);
			t.push(`${He} rushes to obey, almost jumping on you in ${his} eagerness.`);
			if (!dau.mpreg) {
				const vCheckText = VCheck.Vaginal(dau, 7);
				if (vCheckText) {
					t.push(vCheckText);
				} else {
					t.push(`${He} faces you, sliding ${himself} down over your turgid cock, and gradually building up a rhythm.`);
				}
			} else { // mpreg
				const vCheckText = VCheck.Anal(dau, 7);
				if (vCheckText) {
					t.push(vCheckText);
				} else {
					t.push(`${He} faces away from you,`);
					if (dau.anus > 2) {
						t.push(`sliding ${his} gaping`);
					} else if (dau.anus === 1) {
						t.push(`forcing ${his} tight`);
					} else {
						t.push(`pushing ${his} practiced`);
					}
					t.push(`butt down over your turgid cock, and gradually building up a rhythm.`);
				}
			}
			t.push(`It doesn't take long before you explode within ${him}. ${He} kisses you before climbing off, your seed dripping down ${his} leg.`);
			t.toParagraph();
		}

		function impregMom() {
			const t = new SpacedTextAccumulator();

			t.push(`You explain to ${dau.slaveName} that you'll want ${his} help, and ${he} agrees eagerly.`);
			t.toParagraph();

			const disobedient = (disobedience(mom) > random(0, 100));
			fuckMom(t, disobedient);

			if (mom.preg === -1) {
				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his2} contraceptive regimen, and you'll be repeating this ritual all week.`);
				if (fertKnown(mom)) {
					t.push(`${He2}'s <span class="pregnant">bound to end up pregnant.</span>`);
				} else {
					t.push(`${He2}'s probably going to end up pregnant.`);
				}
			} else {
				t.push(`You won't know if it's taken right away, but you'll be repeating this ritual all week,`);
				if (fertKnown(mom)) {
					t.push(`so ${he2}'s <span class="pregnant">going to end up pregnant.</span>`);
				} else {
					t.push(`so ${he2}'s likely going to end up pregnant.`);
				}
			}
			if (isFertile(mom)) {
				knockMeUp(mom, 100, 2, -1);
			}

			t.toParagraph();

			dau.devotion += 2;
			dau.trust += 5;
			t.push(`${dau.slaveName} is excited to${fertKnown(mom) ? `` : ` potentially`} have a sibling on the way and grateful that you fulfilled ${his} request,`);
			if (disobedient) {
				mom.devotion -= 4;
				mom.trust -= 4;
				t.push(`but ${mom.slaveName} <span class="devotion dec">hates that ${fertKnown(mom) ? `it's yours` : `${he2} might be carrying your child`} </span> and is <span class="trust dec">terrified</span> of your control over ${his2} body.`);
			} else if (mom.devotion > 50 || mom.fetish === "pregnancy") {
				mom.devotion += 4;
				t.push(`and ${mom.slaveName} is <span class="devotion inc">even more excited</span> that ${he2} gets to carry it.`);
			} else {
				mom.devotion += 1;
				mom.trust -= 1;
				t.push(`and while ${mom.slaveName} fears your arbitrary control of ${his2} body, ${he2} feels closer to you because ${he2}'s${fertKnown(mom) ? `` : ` potentially`} carrying the child that ${dau.slaveName} wanted so badly.`);
			}
			t.toParagraph();

			return t.container();
		}

		function impregDau() {
			const t = new SpacedTextAccumulator();

			t.push(`You pause for a moment. You could, of course, grant ${his} request, but you have a better idea. You inform ${him} that ${he}'ll soon have a daughter of ${his} own, so ${he} won't be needing a baby sister.`);
			if (dau.intelligence + dau.intelligenceImplant > 50) {
				t.push(`${He}'s a sharp slave, and immediately grasps your meaning. ${He}`);
			} else {
				t.push(`It takes ${him} a couple of seconds before ${he} grasps your meaning. When ${he} does, ${he}`);
			}
			t.push(`grins and ${hasBothArms(dau) ? `clasps ${his} hands in front of ${himself}, bouncing` : `bounces`} eagerly.`);
			t.push(Spoken(dau, `"Oh, that's even better, ${Master}! Can we do it now?"`));
			t.toParagraph();

			fuckDau(t);

			if (dau.preg === -1) {
				t.push(`You know it probably won't take today, but you've already ordered ${V.assistant.name} to discontinue ${his} contraceptive regimen, and you'll be repeating this ritual all week.`);
				if (fertKnown(dau)) {
					t.push(`${He}'s <span class="pregnant">bound to end up pregnant.</span>`);
				} else {
					t.push(`${He}'s probably going to end up pregnant.`);
				}
			} else {
				t.push(`You won't know if it's taken right away, but you'll be repeating this ritual all week,`);
				if (fertKnown(dau)) {
					t.push(`so ${he}'s <span class="pregnant">going to end up pregnant.</span>`);
				} else {
					t.push(`so ${he}'s likely going to end up pregnant.`);
				}
			}
			t.toParagraph();

			if (isFertile(dau)) {
				knockMeUp(dau, 100, 2, -1);
			}
			dau.devotion += 5;
			dau.trust += 5;
			t.push(`${dau.slaveName} is overjoyed to be${fertKnown(dau) ? `` : ` potentially`} carrying a child, and grateful that you understood the heart of ${his} request, even if you didn't fulfil it exactly the way ${he} was originally hoping.`);
			if (dau.fetish === "pregnancy") {
				if (!dau.fetishKnown) {
					t.push(`In fact, ${he}'s <em>so</em> excited that you've begun to understand ${his} sexuality better; ${he}'s a <span class="fetish gain">pregnancy fetishist!</span>`);
					dau.fetishKnown = 1;
					if (dau.fetishStrength < 90) {
						dau.fetishStrength += 10;
					}
				} else if (dau.fetishStrength < 90) {
					t.push(`${His} pregnancy fetish has strengthened since you${fertKnown(dau) ? `` : ` tried`} put a new baby in ${him}.`);
					dau.fetishStrength += 10;
				}
			} else if (fetishChangeChance(dau) > jsRandom(0, 100)) {
				t.push(`This week has a lasting impact on ${dau.slaveName}; ${he} starts to develop an ongoing <span class="fetish gain">pregnancy fetish.</span>`);
				dau.fetish = "pregnancy";
				dau.fetishKnown = 1;
				dau.fetishStrength = 20;
			}
			t.toParagraph();

			return t.container();
		}

		function impregBoth() {
			const t = new SpacedTextAccumulator();

			/* Por qué no los dos? */

			t.push(`You explain to ${dau.slaveName} that you're more than willing to get ${mom.slaveName} pregnant, but you want ${him} to carry a child for you as well. ${He} grins and ${hasBothArms(dau) ? `clasps ${his} hands in front of ${himself}, bouncing` : `bounces`} eagerly.`);
			t.push(Spoken(dau, `"When can we start, ${Master}?"`));
			t.push(`You spend a few moments letting ${him} know what you expect from ${him} during the upcoming session; ${he} knows what's coming, but ${his} mother doesn't yet.`);
			t.toParagraph();

			const disobedient = (disobedience(mom) > random(0, 100));
			fuckMom(t, disobedient);

			if (!disobedient) {
				t.push(`You decide to let ${mom.slaveName} watch while you impregnate ${his2} ${daughter}.`);
				if (mom.devotion > 50 || mom.energy > 80) {
					t.push(`${He2} sits up a bit, beginning to lazily masturbate as you get to work.`);
				}
			} else {
				t.push(`You order ${mom.slaveName} to stay and watch while you impregnate ${his2} ${daughter}.`);
			}
			t.toParagraph();

			if (isFertile(mom)) {
				knockMeUp(mom, 100, 2, -1);
			}

			fuckDau(t);

			if (dau.preg === -1 || mom.preg === -1) {
				t.push(`You've already ordered ${V.assistant.name} to discontinue their contraceptive regimens, and you're`);
			} else {
				t.push(`You won't know if they've taken right away, but you're`);
			}
			if (fertKnown(dau) && fertKnown(mom)) {
				t.push(`sure that repeating this ritual all week will result in <span class="pregnant">both of them getting pregnant</span> with your children.`);
			} else {
				t.push(`hopeful that repeating this ritual all week will result in both of them getting pregnant with your children.`);
			}

			t.toParagraph();

			if (isFertile(dau)) {
				knockMeUp(dau, 100, 2, -1);
			}

			dau.devotion += 2;
			dau.trust += 5;
			t.push(`${dau.slaveName} is excited to${fertKnown(dau) && fertKnown(mom) ? `` : ` potentially`} have both a sibling and a child on the way and grateful that you fulfilled ${his} request,`);
			if (disobedient) {
				mom.devotion -= 5;
				mom.trust -= 8;
				t.push(`but ${mom.slaveName} hates that you're the father of both${fertKnown(dau) && fertKnown(mom) ? `` : ` possible`} children and is terrified of your control over ${his2} and ${his2} ${daughter}'s bodies.`);
			} else if (mom.devotion > 50 || mom.fetish === "pregnancy") {
				mom.devotion += 4;
				mom.trust += 2;
				t.push(`while ${mom.slaveName} is just as excited about ${his2} upcoming child and grandchild, and hopes and trusts you'll allow ${him2} to provide good advice for ${his2}${fertKnown(dau) ? `` : ` potentially`} pregnant ${daughter}.`);
			} else {
				mom.trust -= 4;
				t.push(`but ${mom.slaveName} <span class="trust dec">fears your arbitrary control</span> of ${his2} and ${his2} ${daughter}'s bodies.`);
			}
			t.toParagraph();

			return t.container();
		}

		function decline() {
			dau.trust += 2;
			return [`You tell ${dau.slaveName} that you're satisfied with ${his} service for you as an only child, and you aren't going to knock up ${mom.slaveName}${dau.father === SID.PC ? " again" : ""} just to make a sibling for ${him}. Like the good slave ${he} is, ${he} accepts your decision and appreciates your attention.`];
		}
	}
};

repo_name: Nithhogg/fc

license: mit


code:
App.Events.RESlaveMarriage = class RESlaveMarriage extends App.Events.BaseEvent {
	actorPrerequisites() {
		return [[
			(s) => s.fetish !== Fetish.MINDBROKEN,
			hasAnyArms,
			canMove,
			(s) => s.relationship === 4,
			(s) => s.devotion > 20,
			(s) => s.trust > 20,
		]];
	}

	execute(node) {
		const r = [];

		const groomSlave = getSlave(this.actors[0]);
		const brideSlave = getSlave(groomSlave.relationshipTarget);

		const {
			He, His,
			he, his, him
		} = getPronouns(groomSlave);
		const {title: Master} = getEnunciation(groomSlave);

		const {
			He2, His2,
			he2, his2, him2
		} = getPronouns(brideSlave).appendSuffix("2");

		App.Events.drawEventArt(node, [groomSlave, brideSlave]);

		r.push(
			App.UI.DOM.slaveDescriptionDialog(groomSlave),
			`and`,
			App.UI.DOM.slaveDescriptionDialog(brideSlave),
			`come into your office`
		);
		if (hasAnyArms(groomSlave) && hasAnyArms(brideSlave)) {
			r.push(`holding hands.`);
		} else {
			r.push(`doing their best to stay close to one another despite their physical limitations.`);
		}
		r.push(`${brideSlave.slaveName} looks at ${groomSlave.slaveName} expectantly, but ${he}'s terribly nervous and makes several false starts before beginning. Finally ${groomSlave.slaveName} musters ${his} courage and`);
		if (canTalk(groomSlave)) {
			r.push(
				`asks with ${his} voice cracking,`,
				Spoken(groomSlave, `"${Master}, would you please grant us a slave marriage?"`)
			);
		} else {
			r.push(`asks you with simple gestures to grant the two of them a slave marriage.`);
		}

		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Of course`, yes));
		choices.push(new App.Events.Result(`No`, no));
		App.Events.addResponses(node, choices);

		/** @returns {DocumentFragment} */
		function yes() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You inquire as to whether they understand the Free Cities slave marriage ceremony, and they nod, not trusting themselves to do anything more. You give them a few minutes to get dressed in special outfits you make available. When they come back, they're wearing lacy lingerie designed to resemble old world wedding dresses, but without concealing anything.`);

			App.Events.addParagraph(frag, r);
			r = [];
			if (groomSlave.vagina === 0) {
				r.push(`${groomSlave.slaveName} is a virgin, so ${he}'s wearing white`);
			} else if (groomSlave.pregKnown === 1) {
				r.push(`${groomSlave.slaveName} is pregnant, so ${he}'s wearing light pink`);
			} else if (groomSlave.vagina < 0) {
				r.push(`${groomSlave.slaveName} is a sissy slave, so ${he}'s wearing light blue`);
			} else {
				r.push(`${groomSlave.slaveName} is an experienced sex slave, so ${he}'s wearing light pink`);
			}
			r.push(`against ${his} ${groomSlave.skin} skin.`);
			if (groomSlave.chastityPenis) {
				r.push(`${He} has a little bow on ${his} chastity cage.`);
			} else if (canAchieveErection(groomSlave)) {
				r.push(`The`);
				if (canSee(groomSlave)) {
					r.push(`sight of ${brideSlave.slaveName}`);
				} else {
					r.push(`anticipation`);
				}
				r.push(`has ${him} stiffly erect, and ${he}'s wearing a little bow around ${his} cockhead.`);
			} else if (groomSlave.dick > 0) {
				r.push(`${He}'s impotent, but ${he}'s wearing a little bow around ${his} useless cockhead.`);
			} else if (groomSlave.clit > 0) {
				r.push(`${His} prominent clit is engorged, and ${he}'s wearing a tiny bow on it.`);
			} else {
				r.push(`${He}'s wearing a demure little bow just over ${his} pussy.`);
			}
			if (groomSlave.anus > 1) {
				r.push(`${His} lacy panties are designed to spread ${his} buttocks a little and display ${his} big butthole.`);
			} else if (groomSlave.anus === 0) {
				r.push(`${His} lacy panties cover ${his} virgin anus, for once.`);
			}
			if (groomSlave.boobs > 1000) {
				r.push(`The bra makes no attempt to cover or even support ${his} huge breasts, simply letting them through holes in the lace to jut proudly out.`);
			} else if (groomSlave.boobs > 500) {
				r.push(`The bra supports and presents ${his} big breasts, leaving ${his} stiffening nipples bare.`);
			} else {
				r.push(`The bra supports and presents ${his} breasts, giving ${him} more cleavage than ${he} usually displays.`);
			}
			if (groomSlave.belly >= 1500) {
				r.push(`${His}`);
				if (groomSlave.preg > 0) {
					r.push(`growing pregnancy`);
				} else {
					r.push(`rounded middle`);
				}
				r.push(`prominently bulges from the gap between ${his} lingerie.`);
			}

			App.Events.addParagraph(frag, r);
			r = [];
			if (brideSlave.vagina === 0) {
				r.push(`${brideSlave.slaveName} is a virgin, so ${he2}'s wearing white`);
			} else if (brideSlave.pregKnown === 1) {
				r.push(`${brideSlave.slaveName} is pregnant, so ${he2}'s wearing light pink`);
			} else if (brideSlave.vagina < 0) {
				r.push(`${brideSlave.slaveName} is a sissy slave, so ${he2}'s wearing light blue`);
			} else {
				r.push(`${brideSlave.slaveName} is an experienced sex slave, so ${he2}'s wearing light pink`);
			}
			r.push(`against ${his2} ${brideSlave.skin} skin.`);
			if (brideSlave.chastityPenis) {
				r.push(`${He2} has a little bow on ${his2} chastity cage.`);
			} else if (canAchieveErection(brideSlave)) {
				r.push(`The`);
				if (canSee(brideSlave)) {
					r.push(`sight of ${groomSlave.slaveName}`);
				} else {
					r.push(`anticipation`);
				}
				r.push(`has ${him2} stiffly erect, and ${he2}'s wearing a little bow around ${his2} cockhead.`);
			} else if (brideSlave.dick > 0) {
				r.push(`${He}'s impotent, but ${he2}'s wearing a little bow around ${his2} useless cockhead.`);
			} else if (brideSlave.clit > 0) {
				r.push(`${His2} prominent clit is engorged, and ${he2}'s wearing a tiny bow on it.`);
			} else {
				r.push(`${He2}'s wearing a demure little bow just over ${his2} pussy.`);
			}
			if (brideSlave.anus > 1) {
				r.push(`${His2} lacy panties are designed to spread ${his2} buttocks a little and display ${his2} big butthole.`);
			} else if (brideSlave.anus === 0) {
				r.push(`${His2} lacy panties cover ${his2} virgin anus, for once.`);
			}
			if (brideSlave.boobs > 1000) {
				r.push(`The bra makes no attempt to cover or even support ${his2} huge breasts, simply letting them through holes in the lace to jut proudly out.`);
			} else if (brideSlave.boobs > 500) {
				r.push(`The bra supports and presents ${his2} big breasts, leaving ${his2} stiffening nipples bare.`);
			} else {
				r.push(`The bra supports and presents ${his2} breasts, giving ${him2} more cleavage than ${he2} usually displays.`);
			}
			if (brideSlave.belly >= 1500) {
				r.push(`${His2}`);
				if (brideSlave.preg > 0) {
					r.push(`growing pregnancy`);
				} else {
					r.push(`rounded middle`);
				}
				r.push(`prominently bulges from the gap between ${his2} lingerie.`);
			}

			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`The procedure is simple. The two of them prostrate themselves on the ground and beg your indulgence. You state that you grant it, and hand each of them a simple gold band to be worn on the little finger in advertisement of the inferiority of their union. In turn, each of them gives the other their ring, and they kiss. You pronounce them slave spouses, and offer them the couch for their honeymoon; they thank you profusely through their building tears. It's always touching to see`);
			if (groomSlave.bellyPreg >= 5000 && brideSlave.bellyPreg >= 5000) {
				r.push(`two pregnant slaves`);
				if (hasAnyArms(brideSlave) && hasAnyArms(groomSlave)) {
					r.push(`fingering`);
				} else {
					r.push(`fucking`);
				}
				r.push(`each other`);
			} else {
				r.push(`a 69`);
			}
			r.push(`in which both participants are <span class="devotion inc">softly crying with happiness.</span>`);
			if (groomSlave.pregSource === brideSlave.ID && brideSlave.pregSource === groomSlave.ID) {
				r.push(`When ${groomSlave.slaveName} and ${brideSlave.slaveName} tire, they rest, shoulder to shoulder, with a hand upon each other's bulging belly. Gently, they caress their growing pregnancies, knowing that they carry the other's love child.`);
			} else if (brideSlave.pregSource === groomSlave.ID) {
				r.push(`When they tire, ${groomSlave.slaveName} rests ${his} head upon ${brideSlave.slaveName}'s lap and gently kisses ${his} lover's belly, knowing the child of their love is growing within.`);
			} else if (groomSlave.pregSource === brideSlave.ID) {
				r.push(`When they tire, ${brideSlave.slaveName} rests ${his2} head upon ${groomSlave.slaveName}'s lap and gently kisses ${his2} lover's belly, knowing the child of their love is growing within.`);
			}
			SimpleSexAct.Slaves(groomSlave, brideSlave);
			SimpleSexAct.Slaves(brideSlave, groomSlave);
			groomSlave.devotion += 4;
			brideSlave.devotion += 4;
			groomSlave.trust += 4;
			brideSlave.trust += 4;
			groomSlave.relationship = 5;
			brideSlave.relationship = 5;

			App.Events.refreshEventArt([groomSlave, brideSlave], "attractive lingerie");

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

		/** @returns {string} */
		function no() {
			return `You decline gently, telling them that their relationship is acceptable to you as it is. They are disappointed, but not surprised, and accept your will without a murmur. They leave as they entered, holding hands.`;
		}
	}
};


code:
App.Events.RESnatchAndGrabFollowup = class RESnatchAndGrabFollowup extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.eventResults.snatch === 2,
			() => V.geneticMappingUpgrade === 3,
			() => V.cash > V.surgeryCost * 4
		];
	}

	actorPrerequisites() {
		return [[
			(s) => s.origin === "$He is your share of a raid on an illegal laboratory by your mercenaries.",
			(s) => s.newGamePlus === 0,
			(s) => s.health.condition > 25,
			(s) => s.devotion > 50,
			(s) => s.fetish !== Fetish.MINDBROKEN
		]];
	}

	get weight() { /* only one slave ever qualifies, so give it a bit more weight */
		return 3;
	}

	execute(node) {
		let r = [];

		V.eventResults.snatch = 3;

		const snatched = getSlave(this.actors[0]);
		const {
			He,
			he, his, him
		} = getPronouns(snatched);
		App.Events.drawEventArt(node, snatched, "no clothing");

		r.push(
			App.UI.DOM.slaveDescriptionDialog(snatched),
			`is next on your inspection schedule this morning, and you've finished with the previous slave more quickly than expected, so you find yourself thinking about the circumstances of ${his} acquisition.`
		);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`The laboratory ${he} was recovered from was performing illegal genetic experiments... something with which you now also have some personal experience. It occurs to you that there might be something interesting left unexplored in ${his} genome, so when ${he} arrives, you inform ${him} that you're going to the surgery together.`);
		if (snatched.trust < 50) {
			r.push(`Worried, ${he}`);
			if (!canTalk(snatched)) {
				r.push(`wordlessly`);
			}
			r.push(`asks whether something is wrong, and you fill ${him} in on your thoughts.`);
		} else {
			r.push(`Although ${he} immediately and unquestioningly complies, you occupy a few free moments to fill ${him} in on your thoughts.`);
		}
		if (snatched.behavioralFlaw === "odd") {
			r.push(`${He} has always acted a bit odd, and today ${he} is pretending to play an air harmonica as you`);
			if (canWalk(snatched)) {
				r.push(`walk`);
			} else {
				r.push(`travel`);
			}
			r.push(`together.`);
		} else if (snatched.behavioralQuirk === "funny") {
			r.push(`${He} acted quite odd when you first acquired ${him}, but`);
			if (canWalk(snatched)) {
				r.push(`walking`);
			} else {
				r.push(`traveling`);
			}
			r.push(`with ${him} now, you find that ${he}'s actually very funny.`);
		} else {
			r.push(`${He} acted quite odd when you first acquired ${him}, but you note with some pride that ${he} has learned to behave more normally during ${his} time with you.`);
		}
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`After spending some time prowling around ${his} genome in your genetic sequencer, you find one particularly interesting sequence. ${He} has a unique sequence of genes in a chromosomal region which significantly increases ${his} cognitive ability, but it's only partially activated. You could, with a little bit of time, either completely activate it, or deactivate it entirely, with corresponding dramatic effects on ${his} intelligence. However, such therapy is not free, and the remote surgery software warns that rapid changes to cognition may cause significant changes in behavior.`);
		App.Events.addParagraph(node, r);

		const surgeryCost = V.surgeryCost * 4;
		const choices = [];
		choices.push(new App.Events.Result(`Finish activating the sequence`, finish, `This will cost ${cashFormat(surgeryCost)}`));
		choices.push(new App.Events.Result(`Completely deactivate the sequence`, deactivate, `This will cost ${cashFormat(surgeryCost)}`));
		choices.push(new App.Events.Result(`Let it be`, ignore));
		App.Events.addResponses(node, choices);

		function flawBreak() {
			if (snatched.behavioralQuirk === "none") {
				if (snatched.behavioralFlaw === "odd") {
					snatched.behavioralFlaw = "none";
				}
				snatched.behavioralQuirk = "funny";
				return `Over the next few weeks, you also begin to notice some significant changes in behavior. ${snatched.slaveName} is now <span class="flaw break">funny.</span>`;
			} else if (snatched.sexualQuirk === "none") {
				if (snatched.sexualFlaw === "repressed") {
					snatched.sexualFlaw = "none";
				}
				snatched.sexualQuirk = "perverted";
				return `Over the next few weeks, you also begin to notice some significant changes in behavior. Although ${snatched.slaveName} has always been remarkably horny, ${he} has become much more perverted.`;
			}
		}

		function finish() {
			const r = new SpacedTextAccumulator();
			cashX(forceNeg(surgeryCost), "slaveSurgery", snatched);
			surgeryDamage(snatched, 40);
			snatched.chem += 100;
			snatched.intelligence += Math.min(25, 100 - snatched.intelligence);
			r.push(`The procedure spans the week, with ${him} spending every other day in the surgery room for a series of four sets of injections. A few hours after each session, ${he} feels terribly ill. The process involves`);
			if (V.PC.skill.medicine >= 100) {
				r.push(`you`);
			} else {
				r.push(`the remote surgeon`);
			}
			r.push(`injecting the serum across ${his} entire body, every few`);
			if (V.showInches === 2) {
				r.push(`inches,`);
			} else {
				r.push(`centimeters,`);
			}
			r.push(`leaving small needle marks that fade out within minutes. Despite not leaving lasting evidence, the process is very invasive work, and leaves ${him} feeling weak and tired. Gradually, though, you begin to notice a marked increase in ${his} cognitive function.`);
			r.toParagraph();

			const broken = flawBreak();
			if (broken) {
				r.push(broken);
				r.toParagraph();
			}

			return r.container();
		}

		function deactivate() {
			const r = new SpacedTextAccumulator();
			cashX(forceNeg(V.surgeryCost * 4), "slaveSurgery", snatched);
			surgeryDamage(snatched, 40);
			snatched.chem += 100;
			snatched.intelligence -= Math.min(25, 100 + snatched.intelligence);
			r.push(`The procedure spans the week, with ${him} spending every other day in the surgery room for a series of four sets of injections. A few hours after each session, ${he} feels terribly ill. The process involves`);
			if (V.PC.skill.medicine >= 100) {
				r.push(`you`);
			} else {
				r.push(`the remote surgeon`);
			}
			r.push(`injecting the serum across ${his} entire body, every few`);
			if (V.showInches === 2) {
				r.push(`inches,`);
			} else {
				r.push(`centimeters,`);
			}
			r.push(`leaving small needle marks that fade out within minutes. Despite not leaving lasting evidence, the process is very invasive work, and leaves ${him} feeling weak and tired. Gradually, though, you begin to notice a marked decline in ${his} cognitive function.`);
			r.toParagraph();

			const broken = flawBreak();
			if (broken) {
				r.push(broken);
				r.toParagraph();
			}

			return r.container();
		}

		function ignore() {
			return `You file your findings, and within a few days, both you and ${snatched.slaveName} have forgotten all about them.`;
		}
	}
};


code:
App.Events.REStaffedMorning = class REStaffedMorning extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => fuckSlavesLength() >= 4,
		];
	}

	actorPrerequisites() {
		const req = [
			s => s.devotion > 50,
			s => s.fuckdoll === 0,
			s => ["please you", "serve in the master suite", "be your Concubine"].includes(s.assignment),
			s => s.rules.release.master === 1,
			canMove,
			hasAllLimbs,
		];

		return [
			req,
			req,
			req,
			req,
		];
	}

	/**
	 * @param {Node} node
	 */
	execute(node) {
		let bedSlaves = this.actors.map(getSlave);

		const {
			He, he, his, him, girl
		} = getPronouns(bedSlaves[0]);

		const {
			He2, his2, him2, girl2
		} = getPronouns(bedSlaves[1]).appendSuffix('2');

		const {
			He3, he3, his3, him3, girl3
		} = getPronouns(bedSlaves[2]).appendSuffix('3');

		const {
			He4, his4, him4, himself4
		} = getPronouns(bedSlaves[3]).appendSuffix('4');
		let playerPronouns = getPronouns(V.PC);

		App.Events.drawEventArt(node, bedSlaves.slice(0, 2), "no clothing");

		let t = new SpacedTextAccumulator();

		t.push(
			`Sleep leaves you quickly one morning to the sensation of two of your fucktoys performing human alarm clock duty.`,
			`You open your eyes and look down: it's`,
			App.UI.DOM.slaveDescriptionDialog(bedSlaves[0]),
			`and`,
			contextualIntro(bedSlaves[0], bedSlaves[1], true),
			`today.`
		);

		if (V.PC.dick !== 0) {
			t.push(`${bedSlaves[0].slaveName} is ${(bedSlaves[0].fetish === "cumslut") ? "rapturously" : "industriously"} sucking your dick as it rapidly hardens in ${his} `);
			if (V.PC.vagina !== -1) {
				t.push(`mouth, occasionally letting it pop free so ${he} can run ${his} tongue up and down your cunt.`);
			} else {
				t.push(`mouth.`);
			}
			t.push(`Meanwhile, ${bedSlaves[1].slaveName} is ${(bedSlaves[1].fetish === "cumslut") ? "hungrily" : "gently"} sucking your nuts.`);
			t.push(`The two slaves have crowded close together, and not just so they can both have access to your cock and balls. They're`);
			if (((canAchieveErection(bedSlaves[0]) && bedSlaves[0].chastityPenis === 0) || bedSlaves[0].clit > 3) && ((canAchieveErection(bedSlaves[1]) && bedSlaves[1].chastityPenis === 0) || bedSlaves[1].clit > 3)) {
				t.push(`jerking each other off`);
			} else {
				t.push(`manually stimulating each other`);
			}
			t.push(`as they work.`);
		} else {
			t.push(`An absolutely wonderful mélange of sensations rises to meet you. Each slave is gently sucking one of your hardening nipples, and one hand from each slave is moving delicately across your womanhood, kindling a fire in your lower `);
			if (V.PC.preg > 0 && V.PC.pregData.normalBirth / 1.75) {
				t.push(`belly and exciting the occupant${V.PC.pregType > 1 ? "s" : ""} in your womb.`);
			} else {
				t.push(`belly.`);
			}
			t.push(`They're cuddled up closely under your arms, with a warm body pressed against each side of you. You can feel`);
			if (bedSlaves[0].belly + bedSlaves[1].belly >= 10000 && bedSlaves[0].belly > 4000) {
				t.push(`their swollen middles`);
				if (bedSlaves[0].belly + bedSlaves[1].belly >= 1000000) {
					t.push(`pushing against each other upon you`);
				} else if (bedSlaves[0].belly + bedSlaves[1].belly >= 100000) {
					t.push(`resting against you`);
				} else {
					t.push(`against your ribcage`);
				}
			} else if (bedSlaves[0].belly >= 10000) {
				t.push(`${bedSlaves[0].slaveName}'s ${bellyAdjective(bedSlaves[0])} belly`);
				if (bedSlaves[0].belly >= 100000) {
					t.push(`resting heavily on you`);
				} else {
					t.push(`against your ribcage`);
				}
			} else if (bedSlaves[1].belly >= 10000) {
				t.push(`${bedSlaves[1].slaveName}'s ${bellyAdjective(bedSlaves[1])} belly`);
				if (bedSlaves[1].belly >= 100000) {
					t.push(`resting heavily on you`);
				} else {
					t.push(`against your ribcage`);
				}
			} else if (bedSlaves[0].boobs > 300 && bedSlaves[1].boobs > 300) {
				t.push(`their`);
				if (bedSlaves[0].boobsImplant / bedSlaves[0].boobs >= .60 && bedSlaves[1].boobsImplant / bedSlaves[1].boobs >= .60) {
					t.push(`firm`);
				} else {
					t.push(`soft`);
				}
				t.push(`breasts`);
			} else {
				t.push(`steady breathing`);
			}
			if (canAchieveErection(bedSlaves[0]) && bedSlaves[0].chastityPenis === 0 && canAchieveErection(bedSlaves[1]) && bedSlaves[1].chastityPenis === 0) {
				t.push(`and the twin erections resting against your thighs.`);
			} else {
				t.push(`and the heat between their legs against your thighs.`);
			}
			t.push(`You feel absolutely buried in attentive slave.`);
		}

		t.push(
			`The bathroom door is open and the shower is running.`,
			`Though the steam is beginning to fill the glass-walled shower, you can see a pair of naked bodies in there; that would be`,
			App.UI.DOM.slaveDescriptionDialog(bedSlaves[2]),
			`and`,
			contextualIntro(bedSlaves[2], bedSlaves[3], true),
			`, ready to attend you as you bathe.`
		);

		t.toParagraph();
		node.appendChild(t.container());

		App.Events.addResponses(node, [
			new App.Events.Result("Leave them satisfied", satisfied),
			new App.Events.Result("Leave them exhausted", exhausted)
		]);

		function satisfied() {
			const frag = document.createDocumentFragment();
			let sexTarget = "";
			t = new SpacedTextAccumulator();

			if (V.PC.dick !== 0) {
				t.push(`You begin to thrust gently into ${bedSlaves[0].slaveName}'s mouth. ${girl === girl2 ? `The ${girl}` : "Your bedmate"}s moan and giggle into you at the signal that you're not going to get up right this instant, and`);
				if (((canAchieveErection(bedSlaves[0]) && bedSlaves[0].chastityPenis === 0) || bedSlaves[0].clit > 3) && ((canAchieveErection(bedSlaves[1]) && bedSlaves[1].chastityPenis === 0) || bedSlaves[1].clit > 3)) {
					t.push(`start jerking each other off harder, making lewd noises and humping each other's hands.`);
				} else {
					t.push(`start really exploring each other's body, jerking around lewdly as their arousal builds.`);
				}
				if (V.PC.vagina !== -1) {
					t.push(`They always spare at least one hand for your cunt, despite your thrusting.`);
				}
				t.push(`When you climax, they do, too, one after the other. They quickly switch mouth positions and suck you back to full mast so you can enjoy your shower.`);
				seX(bedSlaves[0], "oral", V.PC, "penetrative");
				seX(bedSlaves[1], "oral", V.PC, "penetrative");
			} else {
				t.push(`You reach down and run a possessive hand across each slave's scalp, neck, and back, eliciting shivers. Then, you gently hook them under the armpits and pull them up a bit, without breaking their lip locks with your nipples, or forcing them to stop playing with your cunt. Each slave ends curled up, mostly face-down, with their mouths still sucking on your ${V.PC.boobs >= 300 ? "boobs" : "chest"} and their free hands trapped between their legs. They get the message and begin to look after themselves, too; their resultant moaning against your nipples grows when you reach down and start teasing their butts. The three of you climax more or less together, and you bounce up with undiminished arousal to enjoy your shower.`);
				seX(bedSlaves[0], "oral", V.PC, "vaginal");
				seX(bedSlaves[1], "oral", V.PC, "vaginal");
			}

			t.toParagraph();

			App.Events.refreshEventArt(bedSlaves, "no clothing");

			t.push(`By now, the shower is an impenetrable fog of steam. The wet, soapy bodies inside are easy to find, though. ${bedSlaves[2].slaveName} happens to be closest, so you kiss ${his3} laughing mouth`);
			if (V.PC.dick !== 0) {
				if ((canDoVaginal(bedSlaves[2]) && bedSlaves[2].vagina > 0) || (canDoAnal(bedSlaves[2]) && bedSlaves[2].anus > 0)) {
					t.push(`hard and fuck ${him3}`);
					if (bedSlaves[2].belly < 30000) {
						t.push(`with ${his3} back against the shower`);
						if (bedSlaves[2].boobs > 10000) {
							t.push(`wall, ${his3} giant soapy tits wobbling around you deliciously.`);
						} else if (bedSlaves[2].boobs > 2000) {
							t.push(`wall, ${his3} huge soapy tits sliding around deliciously.`);
						} else if (bedSlaves[2].weight > 95) {
							t.push(`wall, ${his3} plush belly sliding around delightfully against you.`);
						} else if (canAchieveErection(bedSlaves[2]) && bedSlaves[2].chastityPenis === 0) {
							t.push(`wall, ${his3} lathered up erection rubbing lasciviously between you.`);
						} else {
							t.push(`wall.`);
						}
					} else {
						t.push(`with ${his3} expansive flank against the shower`);
						if (bedSlaves[2].boobs > 2000) {
							t.push(`wall, ${his3} huge soapy tits flopping around deliciously.`);
						} else if (bedSlaves[2].weight > 95) {
							t.push(`wall, ${his3} plush belly wobbling around delightfully beneath ${him3}.`);
						} else {
							t.push(`wall.`);
						}
					}
					if (canDoVaginal(bedSlaves[2]) && bedSlaves[2].vagina > 0) {
						t.push(VCheck.Vaginal(bedSlaves[2], 1));
					} else {
						t.push(VCheck.Anal(bedSlaves[2], 1));
					}
				} else if (bedSlaves[2].weight > 95 && bedSlaves[2].belly < 1500) {
					t.push(`hard, sandwich your dick with ${his3} soft belly, and fuck ${his3} soapy, jiggly body against the shower wall.`);
					seX(bedSlaves[2], "mammary", V.PC, "penetrative");
				} else {
					t.push(`hard and, not finding anything to stick your erection into, guide ${his3} hand down to your wanting dick.`);
					seX(bedSlaves[2], "oral", V.PC, "penetrative");
				}
				t.push(`${He3} does ${his3} best to soap your front while ${he3}`);
				if ((canDoVaginal(bedSlaves[2]) && bedSlaves[2].vagina > 0) || (canDoAnal(bedSlaves[2]) && bedSlaves[2].anus > 0)) {
					t.push(`takes`);
				} else {
					t.push(`rubs`);
				}
				t.push(`cock, and ${bedSlaves[3].slaveName} washes your back${V.PC.vagina !== -1 ? ", reaching under your butt to tease your pussy" : ""}. After a short while, you let ${him3} down and seize ${bedSlaves[3].slaveName}, sliding your cock`);
				if (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])) {
					t.push(`into ${his4} willing pussy,`);
				} else if (bedSlaves[3].anus > 0 && canDoAnal(bedSlaves[3])) {
					t.push(`${bedSlaves[3].butt > 4 ? `between ${his4} huge buttocks and` : ""} up ${his4} willing ass,`);
				} else if (bedSlaves[3].butt > 4) {
					t.push(`between ${his4} huge buttocks,`);
				} else {
					t.push(`between ${his4} thighs,`);
				}
				if (canDoVaginal(bedSlaves[3]) && bedSlaves[3].vagina > 0) {
					t.push(VCheck.Vaginal(bedSlaves[3], 1));
				} else {
					t.push(VCheck.Anal(bedSlaves[3], 1));
				}
				t.push(`taking ${him4} from behind while ${bedSlaves[2].slaveName} does ${his3} best to get ${his3} wits back and take over washing duty. They towel you together, and you head back out of the bathroom.`);
			} else {
				if ((bedSlaves[2].toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(bedSlaves[2]) && (V.PC.vagina > 0 || V.PC.anus > 0) && bedSlaves[2].belly + V.PC.belly < 30000) {
					sexTarget = "penetrative";
					if (V.PC.vagina > 0 && getPCPreferredHole() === "vagina") {
						t.push(`hard, slip ${his2} dick into your pussy, and ride ${him3}`);
						seX(bedSlaves[2], "penetrative", V.PC, "vaginal");
						if (canImpreg(V.PC, bedSlaves[2])) {
							knockMeUp(V.PC, 5, 0, 0);
						}
					} else {
						t.push(`hard, slip ${his2} dick up your ass, and ride ${him3}`);
						seX(bedSlaves[2], "penetrative", V.PC, "anal");
						if (canImpreg(V.PC, bedSlaves[2])) {
							knockMeUp(V.PC, 5, 1, 0);
						}
					}
					t.push(`with ${his3} back against the shower`);
					if (bedSlaves[2].boobs > 10000) {
						t.push(`wall, ${his3} giant soapy tits wobbling around you deliciously.`);
					} else if (bedSlaves[2].boobs > 2000) {
						t.push(`wall, ${his3} huge soapy tits sliding around deliciously.`);
					} else if (bedSlaves[2].weight > 95) {
						t.push(`wall, ${his3} plush belly sliding around delightfully against you.`);
					} else {
						t.push(`wall.`);
					}
				} else if (canDoVaginal(bedSlaves[2])) {
					t.push(`hard and trib ${him3}`);
					if (bedSlaves[2].belly < 30000) {
						t.push(`with ${his3} back against the shower`);
						if (bedSlaves[2].boobs > 10000) {
							t.push(`wall, ${his3} giant soapy tits wobbling around you deliciously.`);
						} else if (bedSlaves[2].boobs > 2000) {
							t.push(`wall, ${his3} huge soapy tits sliding around deliciously.`);
						} else if (bedSlaves[2].weight > 95) {
							t.push(`wall, ${his3} plush belly sliding around delightfully against you.`);
						} else if (canAchieveErection(bedSlaves[2]) && bedSlaves[2].chastityPenis === 0) {
							t.push(`wall, ${his3} lathered up erection rubbing lasciviously between you.`);
						} else {
							t.push(`wall.`);
						}
					} else {
						t.push(`with ${his3} expansive flank against the shower`);
						if (bedSlaves[2].boobs > 2000) {
							t.push(`wall, ${his3} huge soapy tits flopping around deliciously.`);
						} else if (bedSlaves[2].weight > 95) {
							t.push(`wall, ${his3} plush belly wobbling around delightfully beneath ${him3}.`);
						} else {
							t.push(`wall.`);
						}
					}
					seX(bedSlaves[2], "vaginal", V.PC, "vaginal");
				} else {
					t.push(`hard and guide ${his3} hand down to your wanting pussy.`);
					seX(bedSlaves[2], "oral", V.PC, "vaginal");
				}
				t.push(`${He3} does ${his3} best to soap your front while`);
				if (sexTarget === "penetrative") {
					t.push(`fucking you`);
				} else if (canDoVaginal(bedSlaves[2])) {
					t.push(`you hump ${his3} thigh${bedSlaves[2].vagina > 0 ? " and pussy" : ""},`);
				} else {
					t.push(`teasing your pussy`);
				}
				t.push(`and ${bedSlaves[3].slaveName} washes your back. After a short while,`);
				if (sexTarget === "penetrative") {
					t.push(`${he3} comes inside you and slides out so you may`);
				} else if (canDoVaginal(bedSlaves[2])) {
					t.push(`you let ${him3} down and`);
				} else {
					t.push(`you let ${him3} stop and`);
				}
				t.push(`seize ${bedSlaves[3].slaveName}, pushing ${his4} face against the wall and`);
				if (canDoVaginal(bedSlaves[3]) || canDoAnal(bedSlaves[3])) {
					t.push(`sliding your fingers inside ${him4} while you`);
				}
				t.push(`straddle one of ${his4} legs. ${bedSlaves[2].slaveName} does ${his3} best to get ${his3} wits back and take over washing duty. They towel you together, and you head back out of the bathroom.`);
			}

			t.toParagraph();

			t.push(`Your clothes have been laid out, ready for ${bedSlaves[0].slaveName} and ${bedSlaves[1].slaveName} to dress you, but`);
			if (V.PC.dick !== 0) {
				t.push(`next to the neat stack of clothes, the two slaves are bent over the bed with their buttocks spread. You select ${bedSlaves[1].slaveName}`);
				if (bedSlaves[1].vagina > 0 && canDoVaginal(bedSlaves[1])) {
					t.push(`and slide your dick into ${his2} ${bedSlaves[1].vagina > 2 ? "loose pussy" : (bedSlaves[1].vagina > 1 ? "inviting pussy" : "tight pussy")}, fucking ${him2}`);
					t.push(VCheck.Vaginal(bedSlaves[1], 1));
				} else if (bedSlaves[1].anus > 0 && canDoAnal(bedSlaves[1])) {
					t.push(`and slide your dick up ${his2} ${bedSlaves[1].anus > 2 ? "welcoming asspussy" : (bedSlaves[1].anus > 1 ? "soft butthole" : "tight anus")}, sodomizing ${him2}`);
					t.push(VCheck.Anal(bedSlaves[1], 1));
				} else {
					t.push(`and turn ${him2} around before sliding your dick into ${his2} welcoming mouth`);
					seX(bedSlaves[1], "oral", V.PC, "penetrative");
				}
				t.push(`while ${bedSlaves[0].slaveName} buttons your shirt. When it's done, you push ${him} down next to ${bedSlaves[1].slaveName} and switch partners, letting ${bedSlaves[1].slaveName} up to do ${his2} best to help you into your trousers in the meantime. ${He2} gets them on and fastens everything, except the fly, of course.`);
				SimpleSexAct.Player(bedSlaves[0]);
			} else {
				t.push(`next to the neat stack of clothes, the two slaves are kneeling on the floor and looking at you with mock innocence. You select ${bedSlaves[1].slaveName} and straddle ${his2} face, letting ${him2}`);
				if (bedSlaves[1].lips > 40) {
					t.push(`use ${his2} big soft lips to`);
				}
				t.push(`eat you out while ${bedSlaves[0].slaveName}`);
				if (V.PC.career === "servant") {
					t.push(`helps you into your dress. Once ${he} straightens out your apron,`);
				} else if (V.PC.career === "escort") {
					if (V.PC.boobs >= 1400) {
						t.push(`gropes your huge breasts in a losing battle to get them to stay in your barely-there top. Once they've stopped popping out,`);
					} else if (V.PC.boobs >= 1200) {
						t.push(`spends an invigoratingly long time wrestling your big tits into your way too small top. Once they're content to stay put,`);
					} else if (V.PC.boobs >= 1000) {
						t.push(`struggles to shove your breasts into your too small top. Once they're content to stay put,`);
					} else if (V.PC.boobs >= 300) {
						t.push(`wrangles your breasts into your revealing top. Once they're situated perfectly,`);
					} else {
						t.push(`ties your skimpy top over your flat chest. Once it's situated perfectly,`);
					}
				} else {
					t.push(`helps you into your top. When you're buttoned,`);
				}
				t.push(`you take ${his} face in your hands and kiss ${him} deeply, favoring ${him} with the sensation of kissing ${his} ${getWrittenTitle(bedSlaves[0])} while ${playerPronouns.he} orgasms. You keep making out with ${him} while ${bedSlaves[1].slaveName}`);
				if (V.PC.career === "servant") {
					t.push(`slips out from beneath your skirt.`);
				} else if (V.PC.career === "escort") {
					t.push(`tries to find the perfect balance between your extra short skirt showing either your pussy or butthole.`);
				} else {
					t.push(`dresses your lower half.`);
				}
				seX(bedSlaves[1], "oral", V.PC, "vaginal");
			}

			t.push(`When you finally leave the suite, ${bedSlaves[0].slaveName} and ${bedSlaves[1].slaveName} head into the shower for their turn, while ${bedSlaves[2].slaveName} and ${bedSlaves[3].slaveName} have finished drying each other off so they can`);
			if (App.Utils.sexAllowed(bedSlaves[2], bedSlaves[3])) {
				t.push(`have sex`);
				SimpleSexAct.Slaves(bedSlaves[2], bedSlaves[3]);
			} else {
				t.push(`nap together in the afterglow`);
			}
			t.push(`on the bed without getting the sheets wet. They pause for a moment to wave at you as you go, though. <span class="trust inc">Your fucktoys are very satisfied with their morning routine.</span>`);
			if (App.Utils.sexAllowed(bedSlaves[0], bedSlaves[1])) {
				SimpleSexAct.Slaves(bedSlaves[0], bedSlaves[1]);
			}

			t.toParagraph();

			frag.appendChild(t.container());

			bedSlaves.forEach(s => (s.trust += 4));

			return frag;
		}

		function exhausted() {
			const frag = document.createDocumentFragment();
			let noShowerSex = 0;
			t = new SpacedTextAccumulator();

			if (V.PC.dick !== 0) {
				t.push(`${bedSlaves[0].slaveName} feels a hand snake behind ${his} head and relaxes ${his} throat, knowing what's coming. You fuck the bitch's mouth hard, and since the pounding pulls your balls out of ${bedSlaves[1].slaveName}'s mouth,`);
				t.push(`you yank ${him2} up towards you so you can`); // strength check
				if (bedSlaves[1].boobs > 300) {
					t.push(`maul ${his2} breasts. The compliant slave thrusts out ${his2} chest, presenting ${his2} tits`);
				} else {
					t.push(`torment ${his2} flat breasts. The compliant slave thrusts out ${his2} chest, presenting ${his2} nipples`);
				}
				t.push(`for use as toys, and then gasps as you pinch, squeeze, and twist. You blow your load ${canPenetrateThroat(V.PC) ? `down ${bedSlaves[0].slaveName}'s throat` : `into ${bedSlaves[0].slaveName}'s mouth`}`);
				seX(bedSlaves[0], "oral", V.PC, "penetrative");
			} else {
				t.push(`You shove ${bedSlaves[0].slaveName} down towards your pussy and grab`);
				if (bedSlaves[0].hLength > 10) {
					t.push(`${his} hair.`);
				} else if (bedSlaves[0].bald === 1) {
					t.push(`${his} bald head.`);
				} else {
					t.push(`the back of ${his} head.`);
				}
				t.push(`${He} takes a deep breath, knowing what's coming. You grind your cunt against the bitch's mouth hard, and since there's no room for ${bedSlaves[1].slaveName}'s hand there any more,`);
				t.push(`you yank ${him2} up towards you so you can`); // strength check
				if (bedSlaves[1].boobs > 300) {
					t.push(`maul ${his2} breasts. The compliant slave thrusts out ${his2} chest, presenting ${his2} tits`);
				} else {
					t.push(`torment ${his2} flat breasts. The compliant slave thrusts out ${his2} chest, presenting ${his2} nipples`);
				}
				t.push(`for use as toys, and then gasps as you pinch, squeeze, and twist. You climax against ${bedSlaves[0].slaveName}'s face`);
				seX(bedSlaves[0], "oral", V.PC, "vaginal");
			}
			t.push(`and bounce up to fuck bitches in the shower, knocking ${bedSlaves[0].slaveName} aside and sending ${bedSlaves[1].slaveName} sprawling. As you go, you tell them they've got ten minutes to get your clothes laid out and their bodies ready for more. They nod furiously and scramble.`);

			t.toParagraph();

			App.Events.refreshEventArt(bedSlaves, "no clothing");

			t.push(`By now, the shower is an impenetrable fog of steam. The wet, soapy bodies inside are easy to find, though. ${bedSlaves[2].slaveName} happens to be closest, so you`);
			t.push(`grab ${him3} and shove ${him3} into a corner of the`); // strength
			if (bedSlaves[2].belly >= 10000) {
				t.push(`shower, ${his3} ${bellyAdjective(bedSlaves[2])} soapy belly pushing uncomfortably against the glass.`);
			} else if (bedSlaves[2].boobs > 2000) {
				t.push(`shower, ${his3} huge soapy tits slapping painfully against the glass.`);
			} else if (bedSlaves[2].weight > 95) {
				t.push(`${his3} fat soapy gut slapping painfully against the glass.`);
			} else {
				t.push(`shower.`);
			}
			if (V.PC.dick !== 0) {
				t.push(`${He3} does ${his3} best to angle ${his3} hips for you as you push your cock`);
				if (bedSlaves[2].vagina > 0 && canDoVaginal(bedSlaves[2])) {
					t.push(`into ${his3} pussy to give ${him3} a good hard fuck.`);
					t.push(VCheck.Vaginal(bedSlaves[2], 1));
				} else if (bedSlaves[2].anus > 0 && canDoAnal(bedSlaves[2])) {
					t.push(`up ${his3} ass and give ${him3} a good hard reaming.`);
					t.push(VCheck.Anal(bedSlaves[2], 1));
				} else {
					t.push(`between ${his4} thighs and go to town.`);
					seX(bedSlaves[2], "anal", V.PC, "penetrative", );
				}
				t.push(`${bedSlaves[3].slaveName} does ${his4} best to wash your`);
				if (V.PC.vagina > -1) {
					t.push(`back and give your pussy some manual attention,`);
				} else {
					t.push(`back,`);
				}
				t.push(`but finds ${himself4} taking ${bedSlaves[2].slaveName}'s place soon enough, smashed into the corner with your dick pistoning`);
				if (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])) {
					t.push(`in and out of ${his4} holes.`);
					t.push(VCheck.Vaginal(bedSlaves[3], 1));
				} else if (bedSlaves[3].anus > 0 && canDoAnal(bedSlaves[3])) {
					t.push(`in and out of ${his4} holes.`);
					t.push(VCheck.Anal(bedSlaves[3], 1));
				} else {
					t.push(`between ${his4} legs.`);
					seX(bedSlaves[3], "anal", V.PC, "penetrative");
				}
			} else {
				t.push(`${He3} does ${his3} best to angle ${his3} hips for you as you`);
				if (canDoVaginal(bedSlaves[2])) {
					t.push(`fingerfuck ${him3},`);
					seX(bedSlaves[2], "vaginal", V.PC, "penetrative");
				} else if (canDoAnal(bedSlaves[2])) {
					t.push(`fingerfuck ${him3},`);
					seX(bedSlaves[2], "anal", V.PC, "penetrative");
				} else {
					t.push(`molest ${him3},`);
					noShowerSex++;
				}
				t.push(`forcing complete submission out of the compliant ${girl3}. ${bedSlaves[3].slaveName} does ${his4} best to wash your back, but finds ${himself4} taking ${bedSlaves[2].slaveName}'s place soon enough, smashed into the corner with your fingers`);
				if (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])) {
					t.push(`pistoning in and out of ${his4} holes.`);
					seX(bedSlaves[3], "vaginal", V.PC, "penetrative");
				} else if (bedSlaves[3].anus > 0 && canDoAnal(bedSlaves[3])) {
					t.push(`pistoning in and out of ${his4} holes.`);
					seX(bedSlaves[3], "anal", V.PC, "penetrative");
				} else {
					t.push(`running across every ${V.showInches === 2 ? "inch" : "centimeter"} of ${his4} body.`);
					noShowerSex++;
				}
			}
			t.push(`You're in a hurry, but it'll be a sad day when you aren't able to ${noShowerSex > 1 ? "push" : "fuck"} a slave into total submission in five minutes. You release ${bedSlaves[3].slaveName} to drop to the shower floor and let ${bedSlaves[2].slaveName} towel you off.`);
			if (V.PC.dick === 0 && ((bedSlaves[3].anus > 0 && canDoAnal(bedSlaves[3])) || (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])))) {
				t.push(`${bedSlaves[3].slaveName}`);
				if (canStand(bedSlaves[3])) {
					t.push(`gets to ${his4} feet`);
				} else {
					t.push(`hoists ${himself4} upright`);
				}
				t.push(`and helpfully holds up a strap-on questioningly; you shake your head and point to another, larger one. ${He4} helps you into it, and you ram it up ${his4}`);
				if (bedSlaves[3].vagina > 0 && canDoVaginal(bedSlaves[3])) {
					t.push(`loosened pussy`);
					seX(bedSlaves[3], "vaginal", V.PC, "penetrative");
				} else {
					t.push(`loosened ass`);
					seX(bedSlaves[3], "anal", V.PC, "penetrative");
				}
				t.push(`experimentally, nodding in satisfaction when the big phallus forces a pained gasp out of ${him4}.`);
			}

			t.toParagraph();

			t.push(`Back in the bedroom, your clothes have been laid out, ready for ${bedSlaves[0].slaveName} and ${bedSlaves[1].slaveName} to dress you.`);

			let dick = V.PC.dick !== 0 ? "dick" : "strap-on";

			t.push(`Next to the neat stack of clothes, the two slaves are bent over the bed with their buttocks spread. They're perfectly still, awaiting your pleasure. You select ${bedSlaves[1].slaveName} and`);
			if (bedSlaves[1].vagina > 0 && canDoVaginal(bedSlaves[1])) {
				t.push(`push your ${dick} up ${his2} ${bedSlaves[1].vagina > 2 ? "loose pussy" : (bedSlaves[1].vagina > 1 ? "inviting pussy" : "tight pussy")}, raping ${him2} without mercy`);
				t.push(VCheck.Vaginal(bedSlaves[1], 1));
			} else if (bedSlaves[1].anus > 0 && canDoAnal(bedSlaves[1])) {
				t.push(`ram your ${dick} up ${his2} ${bedSlaves[1].anus > 2 ? "welcoming asspussy" : (bedSlaves[1].anus > 1 ? "soft butthole" : "tight anus")}, assraping ${him2} without mercy`);
				t.push(VCheck.Anal(bedSlaves[1], 1));
			} else {
				t.push(`spin ${him2} around, then push your ${dick} ${canPenetrateThroat(V.PC) ? `down ${his2} throat` : `into ${his2} mouth`}, facefucking ${him2} without mercy`);
				seX(bedSlaves[1], "oral", V.PC, "penetrative");
			}
			t.push(`while ${bedSlaves[0].slaveName}`);
			if (V.PC.dick !== 0) {
				t.push(`buttons your shirt.`);
			} else if (V.PC.career === "servant") {
				t.push(`helps you into your dress.`);
			} else if (V.PC.career === "escort") {
				if (V.PC.boobs >= 1400) {
					t.push(`faces a losing battle to get your huge breasts to stay in your barely-there top.`);
				} else if (V.PC.boobs >= 1200) {
					t.push(`wrestles your big tits into your way too small top.`);
				} else if (V.PC.boobs >= 1000) {
					t.push(`struggles to shove your breasts into your too small top.`);
				} else if (V.PC.boobs >= 300) {
					t.push(`wrangles your breasts into your revealing top.`);
				} else {
					t.push(`ties your skimpy top over your flat chest.`);
				}
			} else {
				t.push(`helps you into your top.`);
			}
			t.push(`When it's done, you push ${him} down next to ${bedSlaves[1].slaveName} and switch partners, letting ${bedSlaves[1].slaveName} up to do ${his2} best to`);
			if (V.PC.dick !== 0) {
				t.push(`help you into your trousers in the meantime. ${He2} gets them on and fastens everything, except the fly, of course.`);
			} else if (V.PC.career === "servant") {
				t.push(`tie your apron and keep it out of the way.`);
			} else if (V.PC.career === "escort") {
				t.push(`dress your lower half. ${He2} gets your skimpy bottom on, thong not included of course, quickly enough.`);
			} else {
				t.push(`dress your lower half.`);
			}
			t.push(`When ${bedSlaves[0].slaveName} has been fucked into helplessness, you throw ${him} away like the human sex toy ${he} is and pound ${bedSlaves[1].slaveName} and then the dried-off ${bedSlaves[3].slaveName} and ${bedSlaves[2].slaveName} senseless, careful to frequently pull far enough out that the slaves have to take the pain of initial penetration again.`);
			SimpleSexAct.Player(bedSlaves[0]);
			SimpleSexAct.Player(bedSlaves[1]);
			SimpleSexAct.Player(bedSlaves[2]);
			SimpleSexAct.Player(bedSlaves[3]);
			t.push(`When you finally leave the suite, all four slaves are lying like discarded tissues on the bed, face-down and spread-eagled, carefully avoiding resting on any sensitive parts. <span class="devotion inc">Your fucktoys are reminded of who you are.</span>`);

			t.toParagraph();

			frag.appendChild(t.container());

			bedSlaves.forEach(s => (s.devotion += 4));

			return frag;
		}
	}
};