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

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

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`finishes ${his} morning shower and sleepily turns to dry off. ${He} slips a little on the moist bathroom floor, trips over ${his} own feet, and starts to stumble. ${His} fall is immediately arrested as ${he}'s caught by a pair of strong`,
		);
		if (PC.title === 0) {
			r.push(`yet feminine`);
		}
		r.push(`arms. Coming to rest against`);
		if (PC.boobs >= 1400 && PC.belly >= 10000) {
			r.push(`a pair of enormous`);
			if (PC.boobsImplant > 0) {
				r.push(`air bags`);
			} else {
				r.push(`pillowlike breasts`);
			}
			r.push(`and a hugely pregnant belly,`);
		} else if (PC.belly >= 10000) {
			r.push(`a hugely pregnant middle,`);
		} else if (PC.boobs >= 300) {
			r.push(`a pair of`);
			if (PC.boobsImplant === 0) {
				r.push(`soft`);
			} else {
				r.push(`firm`);
			}
			r.push(`breasts,`);
		} else if (PC.title === 0) {
			r.push(`a flat chest,`);
		} else {
			r.push(`a well-muscled chest,`);
		}
		r.push(`${he}`);
		if (canSee(eventSlave)) {
			r.push(`looks up to find ${himself} gazing into your eyes.`);
		} else {
			r.push(`feels ${his} savior and recognizes these features as yours.`);
		}
		if (!canTalk(eventSlave)) {
			r.push(`${He} mouths a surprised but genuine thank you.`);
		} else {
			r.push(
				Spoken(eventSlave, `"Thanks, ${Master},"`),
				`${he} murmurs, getting over ${his} surprise and relief.`
			);
		}

		r.toParagraph();

		r.push(`Opportunities for gallantry didn't use to fall into your lap like this, but with a harem of busy sex slaves living and working in close proximity, they're common. For ${his} part, ${eventSlave.slaveName} doesn't seem to mind acting out bad romantic comedy. ${He} shows no sign of getting back to ${his} own feet, and nuzzles ${his} ${eventSlave.skin} cheek against your`);
		if (PC.belly >= 10000) {
			r.push(`taut middle,`);
		} else if (PC.boobs >= 300) {
			r.push(`boob,`);
		} else if (PC.title === 0) {
			r.push(`cute nipple,`);
		} else {
			r.push(`chest,`);
		}
		if (canSee(eventSlave)) {
			r.push(`staring`);
		} else {
			r.push(`looking`);
		}
		r.push(`up at you coquettishly. Apparently worrying that ${his} sexual availability isn't obvious enough, ${he} catches ${his}`);
		if (eventSlave.lips > 40) {
			r.push(`enormous`);
		} else if (eventSlave.lips > 20) {
			r.push(`plush`);
		} else {
			r.push(`soft`);
		}
		r.push(`lower lip behind ${his} teeth and bats ${his} eyes at you.`);
		if (eventSlave.teeth === "straightening braces" || eventSlave.teeth === "cosmetic braces") {
			r.push(`${His} braces make the flirty gesture look amusingly innocent`);
			if (eventSlave.visualAge > 35) {
				r.push(`for such a mature ${woman}`);
			}
			r.addToLast(`.`);
		} else if (eventSlave.teeth === "pointy") {
			r.push(`Somehow ${he} manages to make this look cute despite ${his} carnivorously pointed teeth.`);
		} else if (eventSlave.teeth === "fangs") {
			r.push(`Somehow ${he} manages to make this look cute despite ${his} fangs.`);
		} else if (eventSlave.teeth === "fang") {
			r.push(`${His} lone fang makes the look more mischievous then ${he} intends.`);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Carry ${him} to where ${he} needs to go`, carry),
			((canDoAnal(eventSlave) || canDoVaginal(eventSlave)) && eventSlave.belly < 15000)
				? new App.Events.Result(`Scoop ${him} up and fuck ${him}`, scoop, virginityWarning())
				: new App.Events.Result(),
		]);

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

		function carry() {
			let wasCarried = true;
			const r = new SpacedTextAccumulator();
			r.push(`You scoop ${him} up into a bridal carry. ${He}`);
			if (eventSlave.voice === 0) {
				r.push(`gasps, since ${he} can't squeal,`);
			} else {
				r.push(`squeals cutely,`);
			}
			r.push(`holding on for dear life, and keeps ${his} face nestled against ${his} ${getWrittenTitle(eventSlave)}.`);
			if (eventSlave.belly >= 300000) {
				if (eventSlave.bellyPreg > 3000) {
					r.push(`${His} ${belly} pregnancy`);
				} else {
					r.push(`${His} ${belly} belly`);
				}
				r.push(`makes holding ${him} extremely difficult, not including just how much it weighs, so you're forced to quickly return ${him} to ${his} feet.`);
				wasCarried = false;
			} else if (eventSlave.boobs > 40000) {
				r.push(`${His} expansive tits not only weigh ${him} down, but also keep you from holding ${him} up for long.`);
				wasCarried = false;
			} else if (eventSlave.weight > 160) {
				r.push(`${He}'s certainly an armful and a little too fat for you to hold for long.`);
				wasCarried = false;
			} else if (eventSlave.balls > 200) {
				r.push(`${His} tremendous balls serve as an imposing anchor, quickly forcing you to lower ${him} back to the ground.`);
				wasCarried = false;
			} else if (eventSlave.dick > 30) {
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, preventing you from really carrying ${him} very far.`);
					wasCarried = false;
				}
			} else if (eventSlave.belly >= 100000) {
				if (eventSlave.bellyPreg > 3000) {
					if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
						r.push(`${His} pregnancy is truly gigantic, but you're ${strong} enough to carry ${him} some distance.`);
					} else {
						r.push(`${His} pregnancy is truly gigantic and a little too big for you to safely carry without the risk of dropping, quickly forcing you to lower ${him}.`);
						wasCarried = false;
					}
				} else {
					if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
						r.push(`${His} ${belly} belly is truly gigantic, but you're ${strong} enough to carry ${him} some distance.`);
					} else {
						r.push(`${His} ${belly} belly is truly an armful and a little to heavy for you to carry, quickly forcing you to lower ${him}.`);
						wasCarried = false;
					}
				}
			} else if (eventSlave.boobs > 25000) {
				r.push(`${His} enormous boobs`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and are awkward to manage, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`add tremendously to ${his} weight and are awkward to manage, quickly forcing you to lower ${him}.`);
					wasCarried = false;
				}
			} else if (eventSlave.weight > 130) {
				r.push(`${He}'s a`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`fatty, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`fatty and a little too big and heavy for you to hold for long.`);
					wasCarried = false;
				}
			} else if (eventSlave.balls > 100) {
				r.push(`${His} enormous balls`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and dangle ponderously, but you're ${strong} enough to carry ${him} some distance, even though you have to step awkwardly to avoid kneeing ${his} sensitive sack.`);
				} else {
					r.push(`add tremendously to ${his} weight and dangle ponderously, quickly forcing you to lower ${him} or risk accidentally kneeing the sensitive sack.`);
					wasCarried = false;
				}
			} else if (eventSlave.dick > 20) {
				r.push(`${His} dangling cock adds tremendously to ${his} weight and is awkward to walk with, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.butt > 18) {
				r.push(`${His} expansive ass`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, but you're ${strong} enough to carry ${him} some distance.`);
				} else {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, quickly forcing you to lower ${him}.`);
					wasCarried = false;
				}
			} else if (eventSlave.boobs > 8000) {
				r.push(`${His} boobs add tremendously to ${his} weight, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.weight > 95) {
				r.push(`${He}'s got some extra weight on ${him}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.height > 180) {
				r.push(`${He}'s a big ${girl}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.weight > 30) {
				r.push(`${He}'s a chubby ${girl}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.bellyPreg >= 10000) {
				r.push(`${He}'s heavily pregnant, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.bellyImplant >= 10000) {
				r.push(`${His} belly is greatly laden with inert filler, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.bellyFluid >= 10000) {
				r.push(`${His} belly is greatly laden with ${eventSlave.inflationType}, but you're ${strong} enough to carry ${him} some distance.`);
			} else if (eventSlave.height > 160) {
				r.push(`${He}'s no little ${girl}, but you're ${strong} enough to carry ${him}.`);
			} else if (eventSlave.weight > 10) {
				r.push(`${He}'s got a deliciously plush body, but you're ${strong} enough to carry ${him}.`);
			} else {
				r.push(`You could carry the little slave like this as long as you like.`);
			}
			if (wasCarried) {
				r.push(`Knowing that ${he}'ll need to get dressed before the next part of ${his} day, you carry ${him} to`);
				if (eventSlave.rules.living === "luxurious") {
					r.push(`${his} room.`);
				} else {
					r.push(`the part of the common area with where clothes are kept.`);
				}
				r.push(`${He} remains perfectly limp, letting ${himself} be carried without a word. When you set ${him} on ${his} feet,`);
			} else {
				r.push(`Knowing that ${he}'ll need to get dressed before the next part of ${his} day, you help ${him} to`);
				if (eventSlave.rules.living === "luxurious") {
					r.push(`${his} room.`);
				} else {
					r.push(`the part of the common area with where clothes are kept.`);
				}
				r.push(`${He} lets you do most of the work, letting ${himself} be guided without a word. When you set ${him} on ${his} bed,`);
			}
			r.push(`there's a little unaccountable moisture in ${his} ${App.Desc.eyesColor(eventSlave)} <span class="trust inc">for some reason.</span> ${He} gives you a kiss and thanks you prettily.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}

		function scoop() {
			const r = new SpacedTextAccumulator();
			r.push(`You squat down, and ${he} plants ${his} feet, expecting to be given a swat on the bottom and sent on ${his} way. Instead, you run your hands down ${his}`);
			if (eventSlave.weight > 130) {
				r.push(`well-padded`);
			} else if (eventSlave.weight > 95) {
				r.push(`padded`);
			} else if (eventSlave.muscles > 30) {
				r.push(`heavily muscled`);
			} else if (eventSlave.weight > 30) {
				r.push(`chubby`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`thighs, producing a shiver from the ${SlaveTitle(eventSlave)}, and lift ${him} up against your chest, pinning ${him} there with your hands supporting the backs of ${his} knees. Giggling`);
			if (eventSlave.voice === 0) {
				r.push(`mutely`);
			}
			r.addToLast(`, ${he} finds ${himself} held in a fetal position with ${his} back pressed against your`);
			if (PC.boobs >= 300) {
				r.push(`tits.`);
			} else {
				r.push(`chest.`);
			}
			if (eventSlave.boobs > 40000) {
				r.push(`${His} expansive tits not only weigh ${him} down, but also force you to push ${him} against the shower wall for added support.`);
			} else if (eventSlave.weight > 160) {
				r.push(`${He}'s certainly an armful and a little too fat, forcing you to push ${him} against the shower wall for added support.`);
			} else if (eventSlave.balls > 200) {
				r.push(`${His} tremendous balls serve as an imposing anchor, quickly forcing you to push ${him} against the shower wall for added support.`);
			} else if (eventSlave.dick > 30) {
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`${His} hanging dick adds tremendously to ${his} weight and touches the floor, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.boobs > 25000) {
				r.push(`${His} enormous boobs`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and are awkward to manage, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`add tremendously to ${his} weight and are awkward to manage, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.weight > 130) {
				r.push(`${He}'s a`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`fatty, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`fatty and a little too big and heavy, quickly forcing you to push ${him} against the shower wall with a wet slap.`);
				}
			} else if (eventSlave.balls > 100) {
				r.push(`${His} enormous balls`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`add tremendously to ${his} weight and dangle ponderously, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`add tremendously to ${his} weight and dangle ponderously, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.dick > 20) {
				r.push(`${His} dangling cock adds tremendously to ${his} weight and dangles heavily, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.butt > 18) {
				r.push(`${His} expansive ass`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, but you're ${strong} enough to lift ${him}.`);
				} else {
					r.push(`adds tremendously to ${his} weight and is awkward to handle, quickly forcing you to push ${him} against the shower wall for added support.`);
				}
			} else if (eventSlave.boobs > 8000) {
				r.push(`${His} boobs add tremendously to ${his} weight, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.weight > 95) {
				r.push(`${He}'s got some extra weight on ${him}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.height > 180) {
				r.push(`${He}'s a big ${girl}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.weight > 30) {
				r.push(`${He}'s a chubby ${girl}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.bellyPreg >= 10000) {
				r.push(`${He}'s heavily pregnant, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.bellyImplant >= 10000) {
				r.push(`${His} belly is greatly laden with inert filler, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.bellyFluid >= 10000) {
				r.push(`${His} belly is greatly laden with ${eventSlave.inflationType}, but you're ${strong} enough to lift ${him}.`);
			} else if (eventSlave.height > 160) {
				r.push(`${He}'s no little ${girl}, but you're ${strong} enough to lift ${him} with ease.`);
			} else if (eventSlave.weight > 10) {
				r.push(`${He}'s got a deliciously plush body, but you're ${strong} enough to lift ${him} with ease.`);
			} else {
				r.push(`You can hold the little slave like this as long as you like.`);
			}
			r.push(`You shift your grip to hold ${him} with one hand so you can`);
			if (PC.dick !== 0) {
				r.push(`maneuver your cock inside ${him}, and then resume your original hold so you can slide ${him} up and down your shaft.`);
				if (PC.vagina !== -1) {
					r.push(`You make sure ${he}'s really hilted at the height of each stroke, putting some nice pressure on your pussy.`);
				}
			} else {
				r.push(`slide your fingers inside ${his}`);
				if (canDoVaginal(eventSlave)) {
					r.push(`pussy,`);
				} else {
					r.push(`ass,`);
				}
				r.push(`since you're not putting ${him} down to get a strap-on. Knowing ${he} can't reach your cunt to return the favor like this, ${he} relaxes and lets you play with ${him}.`);
			}
			r.push(`Helpless, ${he} has nothing to do but`);
			if (canSee(eventSlave)) {
				r.push(`watch ${himself} get fucked in a full length mirror. ${He} stares, fascinated, and the sight`);
			} else {
				r.push(`let ${his} hands wander across ${his} body. Teasing ${his} nipples`);
				if (eventSlave.bellyPreg >= 5000) {
					r.push(`and pregnant belly`);
				}
			}
			r.push(`gets ${him} off quickly,`);
			if (eventSlave.dick === 0) {
				r.push(`${his} muscles tensing prettily with female orgasm.`);
			} else if (eventSlave.chastityPenis === 1) {
				r.push(`a dribble of cum flowing from the tip of ${his} chastity cage.`);
			} else if (canAchieveErection(eventSlave)) {
				r.push(`${his} stiffly waving cock jetting cum onto the floor.`);
			} else if (eventSlave.dick > 6) {
				r.push(`${his} absurd cock twitching lazily as ${his} ejaculate makes it down its length.`);
			} else if (eventSlave.balls === 0) {
				r.push(`${his} bitchclit dribbling weakly.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${his} limp dick twitching as ${he} cums.`);
			} else {
				r.push(`making ${him} shudder.`);
			}
			r.push(`When you're done, you let ${him} down, and the first thing ${he} does is spin in your embrace to give you an <span class="devotion inc">earnest kiss.</span>`);
			r.push(VCheck.Simple(eventSlave, 1));
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.rules.release.masturbation === 1,
				s => s.dick > 4,
				hasAnyArms,
				canAchieveErection,
				s => s.belly < 10000,
				s => s.chastityPenis !== 1,
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`The showers your slaves use are well vented and transparent walled so that you can see their occupants clearly, even from your desk. Working late at night, you see`,
			contextualIntro(PC, eventSlave, true),
			`sitting hunched under the water in one of the showers, with ${his} back to you. You tell your desk to focus on ${him}, and you are rewarded with three different angles of ${eventSlave.slaveName} giving ${himself} a blowjob. ${He} has to bend over very hard`,
		);
		if (eventSlave.belly >= 5000) {
			r.push(`and at a very awkward angle`);
		}
		r.push(`to get the tip of ${his} huge`);
		if (V.seeRace === 1) {
			r.push(eventSlave.race);
		}
		r.push(`dick`);
		if (eventSlave.belly >= 5000) {
			r.push(`around ${his}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly and`);
		}
		r.push(`into ${his} mouth, but ${he}'s obviously enjoying it all the same. It's not against the rules for ${him} to masturbate; ${he}'s just found an impressive way of doing it.`);
		if (eventSlave.scrotum > 0) {
			if (eventSlave.balls >= 10) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} inhuman balls, massaging and caressing as much of them ${he} as ${he} can with`);
				if (hasBothArms(eventSlave)) {
					r.push(`both hands.`);
				} else {
					r.push(`${his} hand.`);
				}
			} else if (eventSlave.balls > 8) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} monster balls, massaging and caressing them with`);
				if (hasBothArms(eventSlave)) {
					r.push(`both hands.`);
				} else {
					r.push(`${his} hand.`);
				}
			} else if (eventSlave.balls > 5) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} massive balls, cupping them and squeezing gently.`);
			} else if (eventSlave.balls > 3) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} big balls, rolling them around and squeezing them gently.`);
			} else if (eventSlave.balls > 1) {
				r.push(`As ${he} works ${himself}, ${he} plays with ${his} balls, massaging them with`);
				if (hasBothArms(eventSlave)) {
					r.push(`one`);
				} else {
					r.push(his);
				}
				r.push(`hand.`);
			}
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Enter the shower and take ${him}`, shower, ((eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave))) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			(PC.dick !== 0)
				? new App.Events.Result(`The only dick ${he} should suck is ${his} ${getWrittenTitle(eventSlave)}'s`, suck)
				: new App.Events.Result(),
			(eventSlave.belly < 5000) && (canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`See if ${he} can do that while you take ${him}`, take, virginityWarning())
				: new App.Events.Result(),
		]);

		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 shower() {
			const r = new SpacedTextAccumulator();
			r.push(`${He}'s so occupied that ${he} doesn't`);
			if (canHear(eventSlave)) {
				r.push(`hear`);
			} else {
				r.push(`notice`);
			}
			r.push(`you until you seize ${him} under the armpits and drag ${him} to ${his} feet. ${His} massive dickhead pops free of ${his} mouth and ${he} squeaks in surprise as you push ${his}`);
			if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				} else {
					r.push(`rounded`);
				}
				r.push(`body`);
			}
			r.push(`against the wall of the shower and stuff your`);
			if (PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`dick`);
			}
			r.push(`up ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`cunt.`);
			} else {
				r.push(`ass.`);
			}
			r.push(`${He} was already very close to orgasm, and the stimulation of ${his} dick rubbing against the warm, wet wall`);
			if (eventSlave.belly >= 1500) {
				r.push(`of the shower and ${his} belly,`);
			} else {
				r.push(`of the shower,`);
			}
			r.push(`not to mention the feeling of being`);
			if (canDoVaginal(eventSlave)) {
				r.push(`fucked,`);
			} else {
				r.push(`buttfucked,`);
			}
			r.push(`is enough that ${he} climaxes quickly.`);
			if (eventSlave.balls === 3) {
				r.push(`${His} huge load coats the shower wall with cum.`);
			}
			r.push(`You pull out and let ${him} finish by`);
			if (PC.dick === 0) {
				r.push(`giving you oral`);
			} else {
				r.push(`sucking your dick`);
				if (PC.vagina !== -1) {
					r.push(`and eating your pussy`);
				}
			}
			r.addToLast(`, since ${he} started by sucking ${himself}. <span class="devotion inc">${He} has become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0) {
					r.push(`<span class="virginity loss">This breaks in ${eventSlave.slaveName}'s virgin pussy.</span>`);
					eventSlave.vagina = 1;
					r.push(`<span class="devotion inc">${He} enjoys losing ${his} cherry to you.</span>`);
					eventSlave.devotion += 4;
				}
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				if (eventSlave.anus === 0) {
					r.push(`<span class="virginity loss">This breaks in ${eventSlave.slaveName}'s virgin ass.</span>`);
					eventSlave.anus = 1;
					r.push(`<span class="devotion inc">${He} enjoys losing ${his} butt cherry to you.</span>`);
					eventSlave.devotion += 4;
				}
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.toParagraph();
			return r.container();
		}

		function suck() {
			const r = new SpacedTextAccumulator();
			r.push(`${He}'s so occupied that ${he} doesn't`);
			if (canHear(eventSlave)) {
				r.push(`hear`);
			} else {
				r.push(`notice`);
			}
			r.push(`you until you seize ${his} hair and pull ${his} head back. ${His} massive dickhead pops free of ${his} mouth and ${he} squeaks in surprise. The noise is cut off by a gag as you ram yourself down ${his} throat. ${He} plays with your`);
			if (PC.vagina !== -1) {
				r.push(`cunt`);
			} else {
				r.push(`balls`);
			}
			r.push(`as you facefuck ${him} and jacks off with ${his} other hand. ${He} was so close when you intruded that ${he} cums long before you do. There's a lot of cum in the shower when you're through.`);
			if (eventSlave.balls === 3) {
				r.push(`${His} huge balls made an especially major contribution.`);
			}
			r.push(`<span class="devotion inc">${He} has become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			r.toParagraph();
			return r.container();
		}

		function take() {
			const r = new SpacedTextAccumulator();
			r.push(`You interrupt ${eventSlave.slaveName} and make ${him} lie on a nearby bed. After some preparatory stretching, during which ${his} frustrated erection flops forlornly around, you manage to get both ${his} ankles behind ${his} head. In this position ${he} manages to resume sucking on the head of ${his} penis as you slip into ${him}.`);
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				r.push(VCheck.Anal(eventSlave, 1));
			}
			r.push(`So contorted, ${his}`);
			if (canDoVaginal(eventSlave)) {
				r.push(`pussy`);
			} else {
				r.push(`anus`);
			}
			r.push(`is not well angled for comfortable`);
			if (canDoVaginal(eventSlave)) {
				r.push(`penetration,`);
			} else {
				r.push(`sodomy,`);
			}
			r.push(`so ${he} is soon moaning and grunting into ${his} cock as you fuck ${him}.`);
			r.push(`${He} finishes`);
			if (eventSlave.balls >= 3) {
				r.push(`${his} enormous ejaculation`);
			}
			r.push(`into ${his} own mouth and then`);
			if (PC.dick === 0) {
				r.push(`finds ${himself} giving you oral directly, since you pulled your strap-on off.`);
			} else {
				r.push(`receives your load into ${his} now-brimming throat.`);
				if (PC.vagina !== -1) {
					r.push(`${He} barely has time to swallow before you press your pussy against ${his} mouth.`);
				}
			}
			r.push(`<span class="devotion inc">${His} devotion to you has increased.</span>`);
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}
	}
};

repo_name: CloudyCoffee/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.devotion <= 20,
				s => s.devotion > -10,
				s => s.assignment !== Job.QUARTER,
				s => s.rules.living === "spare",
			]
		];
	}

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

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

		App.Events.addParagraph(node, [
			`Passing through the slave dormitory at night, you run your eyes down the row of sleeping chattel. The light here is low, but it's not dark. Slaves need to be able to find the bathroom, slaves on late assignments need to find their beds, and those permitted to do so need to be able to select slaves for sex.`,
			contextualIntro(V.PC, eventSlave, true),
			`catches your eye. The dormitory is kept at a pleasant temperature so that the slaves, who of course sleep nude, are comfortable on their bedrolls covered by a single sheet, or nothing at all. ${He} probably went to sleep with ${his} sheet pulled up to ${his} chin, which is normal behavior for slaves who aren't yet accepting of their status as compulsory sex objects, but ${he}'s shrugged it down. Half ${his} torso is bare.`
		]);
		let r = [];
		r.push(`The dim blue light plays across ${his} ${eventSlave.skin} skin.`);
		if (eventSlave.boobs > 2000) {
			r.push(`${His} massive boob on that side is slightly shifted by each breath.`);
		} else if (eventSlave.boobs > 800) {
			r.push(`${His} breast on that side rises and falls with each breath.`);
		} else {
			r.push(`That side of ${his} chest rises and falls with each breath.`);
		}
		if (eventSlave.belly >= 5000) {
			r.push(`${His} ${belly}`);
			if (eventSlave.bellyPreg >= 3000) {
				r.push(`pregnant`);
			}
			r.push(`belly is only partially covered by the sheet, leaving most of it visible.`);
		}
		r.push(`${He}'s sleeping soundly, ${his} breaths coming deep and slow. Most slaves where ${he} is mentally are troubled by bad dreams, but the poor ${girl} is evidently too tired for that.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Grope ${his} boob`, grope),
			(eventSlave.belly >= 5000 || eventSlave.weight > 30)
				? new App.Events.Result(`Rub ${his} belly`, rub)
				: new App.Events.Result(),
			(V.PC.dick !== 0)
				? new App.Events.Result(`Cum on ${his} face`, cum)
				: new App.Events.Result(`Squirt on ${his} face`, squirt),
			new App.Events.Result(`Just watch ${him} for a little while`, watch),
		]);

		function grope() {
			r = [];
			r.push(`${His} eyes fly open as ${he} feels someone groping ${him}.`);
			if ((eventSlave.boobsImplant/eventSlave.boobs) >= .60) {
				r.push(`You're mauling ${his} fake boob, squeezing it and making the skin of ${his} breast, which is already stretched rather taut by the implant, stretch a bit farther.`);
			} else if (eventSlave.boobs > 3000) {
				r.push(`You're hefting and massaging ${his} mass of breastflesh, playing with ${his}`);
				if ((eventSlave.boobsImplant/eventSlave.boobs) < .60) {
					r.push(`mostly`);
				}
				r.push(`natural boob, making ${his} huge soft udder bounce and jiggle.`);
			} else if (eventSlave.lactation > 0) {
				r.push(`You're kneading and massaging ${his} udder, and the milk begins to`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`bead at`);
				} else {
					r.push(`leak from`);
				}
				r.push(`the cow's nipple.`);
			} else if (eventSlave.boobs > 300) {
				r.push(`You've got ${his} whole tit in your hands, jiggling and squeezing the entire thing.`);
			} else {
				r.push(`You're massaging and squeezing ${his} flat chest.`);
			}
			r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
			if (!canSee(eventSlave)) {
				r.push(`recognizes your familiar`);
				if (canSmell(eventSlave)) {
					r.push(`smell`);
				} else {
					r.push(`touch`);
				}
				r.push(`and`);
			}
			r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
				r.push(`Though ${he}'s smart,`);
			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
				r.push(`Though ${he}'s not dumb,`);
			} else {
				r.push(`${He}'s an idiot, and`);
			}
			r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
			switch (eventSlave.nipples) {
				case "inverted":
					r.push(`painfully protruding ${his} fully inverted nipple. ${He} puts up with even that, though ${he} cries a little as it pops out.`);
					break;
				case "partially inverted":
					r.push(`painfully protruding ${his} partially inverted nipple. ${He} puts up with that, too, though ${he} winces as it pops out.`);
					break;
				case "huge":
					r.push(`rolling ${his} huge nipple between a thumb and forefinger, hard enough to hurt. ${He} accepts the mammary abuse.`);
					break;
				case "fuckable":
					r.push(`forcing your entire fist into ${his} nipple. ${He} accepts the stimulation as best ${he} can.`);
					break;
				default:
					r.push(`playing with ${his} nipple, pinching it hard enough to hurt. ${He} accepts the mammary abuse.`);
			}
			r.push(`Satisfied, you leave ${him} to get back to sleep as best ${he} can.`);
			eventSlave.devotion += 4;
			if (eventSlave.lactation > 0) {
				eventSlave.lactationDuration = 2;
				eventSlave.boobs -= eventSlave.boobsMilk;
				eventSlave.boobsMilk = 0;
			}
			return r;
		}

		function rub() {
			r = [];
			if (eventSlave.bellyPreg >= 5000) {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, life-rounded, stomach.`);
				if (eventSlave.weight > 10) {
					r.push(`You're massaging and teasing ${his} huge, soft belly.`);
				} else if (eventSlave.muscles > 5) {
					r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`);
				} else {
					r.push(`You're massaging and teasing ${his} taut belly.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
				if (eventSlave.weight > 10) {
					r.push(`sinking your hands into ${his} fat to get a good feel of the life growing within.`);
				} else {
					r.push(`feeling for the life growing within ${him}.`);
				}
				if (eventSlave.weight > 30) {
					r.push(`Though it takes some groping before you are met with a kick from ${his} unborn child.`);
				} else if (eventSlave.pregType < 3) {
					r.push(`It doesn't take long before you are met with a kick from ${his} unborn child.`);
				} else {
					r.push(`${He} is so full of children that your ministrations are met with a hail of motion.`);
				}
				if (eventSlave.pregSource === -1) {
					r.push(`Smiling at how active your children are,`);
				} else {
					r.push(`Satisfied,`);
				}
			} else if (eventSlave.bellyImplant >= 5000) {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly} stomach.`);
				if (eventSlave.weight > 10) {
					r.push(`You're massaging and teasing ${his} huge, soft belly.`);
				} else if (eventSlave.muscles > 5) {
					r.push(`You're massaging and teasing ${his} taut belly and ruined abs.`);
				} else {
					r.push(`You're massaging and teasing ${his} taut belly.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
				if (eventSlave.weight > 10) {
					r.push(`sinking your hands into ${his} fat to get a good feel of the implant hidden within.`);
				} else {
					r.push(`feeling up the implant within ${him}.`);
				}
				if (eventSlave.weight > 30) {
					r.push(`Though it takes some groping before you locate the firm sphere.`);
				} else if (eventSlave.belly < 10000) {
					r.push(`It doesn't take long for you to have a solid grip on the firm sphere.`);
				} else {
					r.push(`It's so huge it's hard to miss, but that just gives you more room to poke and prod at.`);
				}
				r.push(`Satisfied,`);
			} else if (eventSlave.bellyFluid >= 5000) {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his} ${belly}, ${eventSlave.inflationType}-filled stomach.`);
				if (eventSlave.weight > 10) {
					r.push(`You're massaging and jiggling ${his} huge, soft belly, enjoying the sounds it makes as you move it.`);
				} else if (eventSlave.muscles > 5) {
					r.push(`You're massaging and jiggling ${his} taut belly and stretched abs, enjoying the sounds it makes as you move it.`);
				} else {
					r.push(`You're massaging and jiggling ${his} taut belly, enjoying the sounds it makes as you move it.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for <span class="devotion inc">freezing submissively</span> and letting you do what you like. You test ${his} compliance by`);
				if (eventSlave.weight > 10) {
					r.push(`sinking your hands into ${his} fat to get a good grip`);
				} else {
					r.push(`wrapping your hands around the sloshing globe`);
				}
				r.push(`and vigorously shaking. As ${his} gut's groaning from the sudden shift of its contents dies down, you gently apply pressure to the bloated organ, careful to only cause ${his} discomfort and not to disgorge ${his} contents. Satisfied,`);
			} else {
				r.push(`${His} eyes fly open as soon as ${he} feels someone touching ${his}`);
				if (eventSlave.weight > 190) {
					r.push(`expansive belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and struggling to find ${his} belly button.`);
				} else if (eventSlave.weight > 160) {
					r.push(`massive, soft belly. You're massaging and jiggling ${his} obscene gut while teasing ${his} many folds and hidden belly button.`);
				} else if (eventSlave.weight > 130) {
					r.push(`huge, soft belly. You're massaging and jiggling ${his} thick gut while teasing ${his} folds and hidden belly button.`);
				} else if (eventSlave.weight > 95) {
					r.push(`big soft belly. You're massaging and jiggling ${his} gut while teasing ${his} folds and hidden belly button.`);
				} else {
					r.push(`chubby middle. You're massaging and jiggling ${his} tiny gut.`);
				}
				r.push(`${His} face contorts with surprise and then outrage, but then ${he}`);
				if (!canSee(eventSlave)) {
					r.push(`recognizes your familiar`);
					if (canSmell(eventSlave)) {
						r.push(`smell`);
					} else {
						r.push(`touch`);
					}
					r.push(`and`);
				}
				r.push(`realizes whose hand it is that's taking liberties with ${him}.`);
				if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
					r.push(`Though ${he}'s smart,`);
				} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
					r.push(`Though ${he}'s not dumb,`);
				} else {
					r.push(`${He}'s an idiot, and`);
				}
				r.push(`in ${his} drowsy state ${he} can't figure out what to do. ${He} settles for freezing submissively and letting you do what you like. You test ${his} compliance by roughly kneading ${his} pliant flesh, testing how well it can be molded into pleasurable valleys and ravines. Satisfied,`);
			}
			r.push(`you leave ${him} to get back to sleep as best ${he} can.`);
			eventSlave.devotion += 4;
			return r;
		}

		function cum() {
			r = [];
			r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You fancy yourself a bit of a marks ${womanP}, and you don't feel the need to bend over ${him} to score good hits. Your load comes in three main jets: the first hits ${him} on the nipple, the second tracks up ${his} sternum and throat, and the third splashes full across ${his} face as ${his} eyes fly open`);
			if (V.PC.vagina !== -1) {
				r.push(r.pop() + `, each of these accompanied by some less directionally perfect girlcum`);
			}
			r.push(r.pop() + `. ${He} sputters with surprise and then outrage, but`);
			if (!canSee(eventSlave)) {
				r.push(`once ${he} recognizes your`);
				if (canTaste(eventSlave)) {
					r.push(`taste`);
				} else {
					r.push(`presence`);
				}
				r.push(`and`);
			} else {
				r.push(`then ${he}`);
			}
			r.push(`realizes who it is standing over ${him}`);
			if (canSee(eventSlave)) {
				r.push(`and`);
			} else {
				r.push(`does ${he}`);
			}
			r.push(`<span class="trust dec">freezes in terror.</span>`);
			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
				r.push(`${He}'s quick, and ${he} immediately realizes`);
			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
				r.push(`${He}'s not dumb, and ${he} quickly realizes`);
			} else {
				r.push(`${He} gradually manages to calculate`);
			}
			r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`);
			if (SlaveStatsChecker.checkForLisp(eventSlave)) {
				r.push(`lisps`);
			} else {
				r.push(`mumbles`);
			}
			r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your cum.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 2;
			return r;
		}

		function squirt() {
			r = [];
			r.push(`You stand over ${him}, quietly masturbating while watching ${him} sleep. Several of ${his} fellow slaves come and go as you do so, but if they're surprised by the sight, they have the presence of mind not to show it. You're on excellent terms with your cunt, and you know just what it takes to make yourself squirt. When you feel the heat building just right, you quickly straddle ${his} face without touching ${him}, angling yourself carefully and increasing the pace of your schlicking. In no time at all, a jet of femcum splashes onto ${his} face and down across ${his} chest. ${He} sputters with surprise and then outrage, but then ${he}`);
			if (canSee(eventSlave)) {
				r.push(`realizes whose pussy ${he}'s staring straight into`);
			} else {
				r.push(`recognizes your`);
				if (canTaste(eventSlave)) {
					r.push(`flavor`);
				} else {
					r.push(`presence`);
				}
			}
			r.push(`and <span class="trust dec">freezes in terror.</span>`);
			if (eventSlave.intelligence+eventSlave.intelligenceImplant > 50) {
				r.push(`${He}'s quick, and ${he} immediately realizes`);
			} else if (eventSlave.intelligence+eventSlave.intelligenceImplant >= -15) {
				r.push(`${He}'s not dumb, and ${he} quickly realizes`);
			} else {
				r.push(`${He} gradually manages to calculate`);
			}
			r.push(`that doing anything other than thanking you would be phenomenally stupid. "Thank you, ${Master}," ${he}`);
			if (SlaveStatsChecker.checkForLisp(eventSlave)) {
				r.push(`lisps`);
			} else {
				r.push(`mumbles`);
			}
			r.push(`blearily. You leave ${him} to <span class="devotion inc">puzzle over ${his} own submissiveness,</span> covered in your pussyjuice.`);
			eventSlave.devotion += 4;
			eventSlave.trust -= 2;
			return r;
		}

		function watch() {
			const frag = document.createDocumentFragment();
			r = [];
			r.push(`You stand there for a while, watching the exhausted slave sleep. It's an oddly restful sight, and the aesthetics of ${his} slumbering little movements hold your attention for a time.`);
			if (eventSlave.preg > eventSlave.pregData.normalBirth/2) {
				r.push(`You watch the subtle movements going on within ${his} womb as well.`);
			}
			r.push(`After a while, you head to your own bed. Several of ${his} fellow slaves came and went as you watched ${him}, but if they're surprised by the sight, they have the presence of mind not to show it.`);
			App.Events.addParagraph(frag, r);
			App.Events.addParagraph(frag, [`One of them quietly lets ${him} know about the incident the next day, though, and the overall impact on ${his} mental state is surprisingly positive. In a more normal human setting, the news that someone watched ${him} sleep last night without ${his} consent or even knowledge at the time would disturb ${him} greatly. However, it's not uncommon for slaves in the dormitory to wake up to the sounds of the occupant of the bedroll next to theirs getting fucked, and without any consent, either. Perhaps you're odd, ${he}'s obviously thinking, but perhaps you won't rape ${him} while ${he} sleeps.`]);
			eventSlave.trust += 4;
			return frag;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.devotion <= 50,
				s => s.minorInjury === "sore ass",
			]
		];
	}

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

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

		let r = [];
		r.push(
			`One night, you see`,
			contextualIntro(V.PC, eventSlave, true)
		);

		if (!hasAnyLegs(eventSlave)) {
			r.push(`scooting ${himself} from side to side uncomfortably,`);
		} else if (eventSlave.heels === 1 && shoeHeelCategory(eventSlave) === 0) {
			r.push(`crawling gingerly,`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`tottering along painfully,`);
		} else {
			r.push(`walking a little funny,`);
		}
		r.push(`as though ${he} has a sore butt. You call ${him} over to inspect ${his} backdoor to see if ${he} needs care,`);
		if (!hasAnyLegs(eventSlave)) {
			r.push(`and set ${his} helpless body down, spreading ${his} buttocks to examine ${his} anus.`);
		} else {
			r.push(`and order ${him} to spread ${his} buttocks for you so you can examine ${his} anus.`);
		}
		r.push(`${His} asshole is fine, just a little sore from hard buttfucks. ${He} complies with you, but as you probe ${him} gently with a finger,`);
		if (!canTalk(eventSlave) && (!hasAnyArms(eventSlave))) {
			r.push(`${he} wriggles desperately and turns to mouth "it hurts ${getWrittenTitle(eventSlave)} please don't assrape me" at you.`);
		} else if (!canTalk(eventSlave)) {
			r.push(`${he} gestures desperately, telling you ${his} butt hurts and asking you not to assfuck ${him}.`);
		} else {
			r.push(
				`${he} bursts out,`,
				Spoken(eventSlave, `"${Master}, my butt is so sore! Please don't use my ass, ${Master}. Please."`)
			);
		}

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Punish ${his} ass for insolence`, punish),
			new App.Events.Result(`Give ${him} some care`, care),
		]);

		function punish() {
			r = [];
			r.push(`You inform ${him} sternly that you will ensure that ${he} is not permanently damaged, and that otherwise, ${he} is to take anal pain like a good buttslave. ${He} starts to beg and whine as you lean back in your chair and`);
			if (V.PC.dick === 0) {
				r.push(`hold ${him} upside down on your chest so ${he} can lick your pussy while you use a dildo on ${his} ass.`);
			} else {
				r.push(`set ${him} on your chest before reaching around to line your cock up with ${his} sore hole. ${He} shudders and writhes when you start pushing yourself inside.`);
			}
			r.push(`You use hard pinches to ${his} nipples to punish ${his} whining, forcing ${him} to take a long, painful buttfuck in silence. <span class="gold">${He} has become more afraid of you.</span>`);
			if (eventSlave.anus < 3) {
				r.push(`${His} week of tough anal experience has <span class="lime">permanently loosened ${his} anus.</span>`);
				eventSlave.anus += 1;
			}
			eventSlave.trust -= 5;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function care() {
			r = [];
			r.push(`${He}'s filled with anxiety as you`);
			if (eventSlave.belly < 1500) {
				r.push(`lay ${him} face-down on your desk,`);
			} else {
				r.push(`direct ${him} to lay on ${his} side on your desk`);
				if (eventSlave.belly >= 300000) {
					r.push(`with ${his} ${belly} belly hanging over the edge`);
				}
				r.push(r.pop() + `,`);
			}
			r.push(`but is surprised and reassured when ${he}'s penetrated not by a`);
			if (V.PC.dick === 0) {
				r.push(`strap-on`);
			} else {
				r.push(`turgid`);
				if (V.PC.vagina !== -1) {
					r.push(`futa`);
				}
				r.push(`cock`);
			}
			r.push(`but by a single gentle finger coated with something healing and cool. The mixed analgesic and anti-inflammatory takes the sharpness off the sore feeling, and will help get ${his} butt back into fucking shape. ${He} has become more accepting of anal slavery, and ${his} asshole feels better.`);
			if (eventSlave.anus > 2) {
				r.push(`Your expert care has <span class="orange">allowed ${his} loose asspussy to recover a little of its natural shape and size.</span>`);
				eventSlave.anus -= 1;
			}
			eventSlave.trust += 4;
			eventSlave.minorInjury = 0;
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.muscles > 5,
				s => s.devotion > 20,
				s => s.diet !== "slimming",
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			App.UI.DOM.slaveDescriptionDialog(eventSlave),
			`comes before you for a routine inspection. The`,
		);
		if (eventSlave.muscles > 95) {
			r.push(`heavily muscled`);
		} else if (eventSlave.muscles > 30) {
			r.push(`ripped`);
		} else {
			r.push(`toned`);
		}
		r.push(`${SlaveTitle(eventSlave)} is looking good, but as ${he} raises ${his} ${arms} over ${his} head to spin ${his} nude torso under your gaze, ${he} winces slightly.`);
		if (canSee(eventSlave)) {
			r.push(`${His} ${App.Desc.eyesColor(eventSlave)} flick up to see if you noticed, and ${his} face falls a little when ${he} sees that you did. You raise one eyebrow, and the obedient slave explains ${himself}.`);
		} else if (canHear(eventSlave)) {
			r.push(`${His} ears perk up to hear if you noticed. You clear your throat, startling ${him} and making ${him} explain ${himself}.`);
		} else {
			r.push(`${He} tries to affect a stoic expression, but when you tentatively touch one of ${his} shoulders, ${he} grimaces slightly and quickly opts to explain ${himself}.`);
		}
		if (!canTalk(eventSlave)) {
			r.push(`${He} uses gestures to beg your pardon, and explains that yesterday was arm day for ${him}, and ${he} went out a little hard. ${His} shoulders are a little sore, but ${he} gestures that ${he}'s all right.`);
		} else {
			r.push(
				Spoken(eventSlave, `"Sorry, ${Master},"`),
				`${he} ${say}s apologetically.`,
				Spoken(eventSlave, `"I'm okay. Yesterday was arm day for me, and I went out a little too hard. My shoulders are kinda sore, but I'm alright."`)
			);
		}

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Make ${him} work it out`, make, virginityWarning()),
			new App.Events.Result(`Give ${him} a massage`, give),
		]);

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

		function make() {
			const r = new SpacedTextAccumulator();
			r.push(`You tell ${him} to get ready to go into a handstand. ${He} looks puzzled, but anticipatory, and hurries to comply.`);
			if (eventSlave.boobs > 2000) {
				r.push(`${He} has to be careful doing it, since ${his} huge boobs come down and almost smother the poor slave once ${he}'s inverted.`);
			}
			if (eventSlave.belly >= 300000) {
				r.push(`${His} belly is so hugely distended, ${he}'ll practically require your assistance to stay inverted.`);
			} else if (eventSlave.weight > 130) {
				r.push(`${His} belly is so fat that ${he} has to take precautions to handle the massive shift in its mass when ${he} inverts.`);
			}
			r.push(`You get up from behind your desk,`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on,`);
			}
			r.push(`and stand behind ${him}. You grab ${him} by the ankles, and ${he} giggles self-consciously, aware that in this position, ${his}`);
			if (eventSlave.vagina > -1) {
				r.push(`holes are on display pretty much as openly as they can possibly be.`);
			} else {
				r.push(`butthole is on display pretty much as openly as it can possibly be.`);
			}
			r.push(`${He} groans with soreness as you lift ${him} by ${his} legs, pulling ${him} upward until ${he}'s in a full handstand, ${his} knees clasping you on either side to steady ${him}. Carefully, you maneuver your`);
			if (V.PC.dick === 0) {
				r.push(`phallus`);
			} else {
				r.push(`cock`);
			}
			r.push(`to line it up with ${his}`);
			if (eventSlave.vagina > -1) {
				r.push(`pussy.`);
			} else {
				r.push(`asspussy.`);
			}
			r.push(`Realizing what you intend, ${he} arches ${his} back and cocks ${his} hips,`);
			if (eventSlave.belly >= 5000) {
				r.push(`pushing ${his} already bulging stomach even further out from ${him}, all the while`);
			}
			r.push(`grunting and shivering as ${his} sore muscles stretch to support ${him} in the necessary gymnastic pose to angle ${his} hole just right.`);
			r.toParagraph();
			r.push(`With the combined pain and pleasure of the stretch already overstimulating ${him}, ${he} gives a huge sobbing gasp as you enter ${him}. You move your hands to ${his}`);
			if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.weight > 10) {
				r.push(`plush`);
			} else if (eventSlave.muscles > 30) {
				r.push(`well-muscled`);
			} else {
				r.push(`trim`);
			}
			r.push(`hips one at a time, and then begin to slowly move ${his} inverted body towards you and away from you, impaling ${him}. ${His} whole body shakes with pleasure and exertion, and when ${he} orgasms, you have to support ${him} to stop ${him} crashing to the ground`);
			if (eventSlave.belly >= 300000) {
				r.addToLast(`, a struggle thanks to ${his} excessive weight`);
			}
			r.addToLast(`. You let ${him} down onto the floor slowly`);
			if (eventSlave.vagina > -1) {
				r.addToLast(`, but tell ${him} that after a short break, ${he}'s to get back up so you can see to ${his} anus`);
			}
			r.addToLast(`. ${He}'s breathing very hard and still coming down off a terrific head rush, so ${he} just <span class="devotion inc">blows you a kiss.</span>`);
			eventSlave.devotion += 4;
			r.push(VCheck.Both(eventSlave, 1));
			r.toParagraph();
			return r.container();
		}

		function give() {
			const frag = document.createDocumentFragment();
			const r = new SpacedTextAccumulator(frag);
			r.push(`You vault your desk, fold yourself into a cross-legged pose with your back against its front,`);
			if (canSee(eventSlave)) {
				r.push(`and point to the floor in front of you.`);
				if (eventSlave.attrXX > 65 && V.PC.boobs >= 300) {
					r.push(`(As you do, ${he} watches the effects of the motion on your breasts with something like reverence`);
					if (V.PC.boobsImplant > 0) {
						r.addToLast(`, even though they don't move much thanks to your implants`);
					}
					r.addToLast(`.)`);
				} else if (eventSlave.attrXY > 65 && V.PC.boobs < 300) {
					r.push(`(As you do, ${he} takes in the powerful play of your muscles with something like reverence`);
					if (V.PC.balls >= 5) {
						r.addToLast(`. ${He} certainly notices the motion of your massive nuts too`);
					}
					r.addToLast(`.)`);
				}
			} else if (canHear(eventSlave)) {
				r.push(`and loudly tap the floor in front of you.`);
			} else {
				r.push(`and reach out to lightly tug ${him} towards you.`);
			}
			r.push(`${He} hurries over and gets down on the floor with you, conforming to your manual guidance that ${he} should sit with ${his} back to you. You place your hands on either side of ${his} neck, run them capably down ${his} spine, and then back up to explore ${his} shoulders. ${He} gasps as ${he} realizes that you intend to give ${him} a massage, impressed and a little perturbed that you would do this for ${him}. Indeed, it's unusual for a slaveowner to do something like this, but it's easily justifiable as hands-on maintenance of your property. You tell ${him} so as your fingers begin to probe ${his} muscles in more detail, eliciting a shiver`);
			if (canTalk(eventSlave)) {
				r.addToLast(`.`);
			} else {
				r.push(
					`and a tiny`,
					Spoken(eventSlave, `"Yes, ${Master}."`)
				);
			}
			r.push(`${He} begins to breathe rather hard, and you notice`);
			if (eventSlave.belly >= 120000) {
				r.push(`${him} starting to shift ${his} hips uncomfortably. ${His} ${belly} belly blocks any view of ${his} crotch in the reflective wall opposite ${him}, but you can smell the precum beginning to flow under the crotch hiding orb.`);
			} else if (eventSlave.chastityPenis === 1) {
				r.push(`${him} starting to shift ${his} hips uncomfortably, though of course you see in the reflective wall opposite ${him} that ${his} cock remains as caged as ever.`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`${him} starting to shift ${his} hips uncomfortably, though of course you see in the reflective wall opposite ${him} that ${his} cock remains as limp as ever.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${him} starting to shift ${his} hips uncomfortably. You see in the reflective wall opposite ${him} that ${his} cock is almost agonizingly hard.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`${him} starting to shift ${his} ass uncomfortably. ${He} must really want it, and of course, ${he} knows that ${his} butt is ${his} main source of stimulation now.`);
			} else {
				r.push(`the wonderful aroma of female arousal beginning to permeate the office as ${he} starts to shift ${his} hips uncomfortably.`);
			}
			eventSlave.trust += 2;

			r.toParagraph();
			App.Events.addResponses(frag, [
				new App.Events.Result(`Tell ${him} ${he}'s free to masturbate`, masturbate),
				(eventSlave.anus > 0)
					? new App.Events.Result(`Fuck ${him}`, fuck)
					: new App.Events.Result(),
			]);

			return r.container();

			function masturbate() {
				const r = new SpacedTextAccumulator();
				r.push(`You lean forward until your lips graze one of ${his} ears, and tell ${him} that ${he} can touch ${himself} if ${he} wants.`);
				if (!canTalk(eventSlave)) {
					r.push(`${He} raises a shaky hand to gesture <span class="trust inc">${his} thanks</span> as the other`);
				} else {
					r.push(`<span class="trust inc">"Thank you</span> ${Master}!" ${he} squeaks as a hand`);
				}
				r.push(`dives for ${his} crotch. ${He}`);
				if (eventSlave.vagina === -1 && eventSlave.dick === 0) {
					r.push(`rubs ${his} perineum and anus`);
				} else if (eventSlave.chastityVagina) {
					r.push(`rubs ${his} perineum`);
				} else if (eventSlave.vagina > -1) {
					r.push(`schlicks ${himself}`);
				} else if (eventSlave.chastityPenis === 1) {
					r.push(`rubs ${his} perineum and anus`);
				} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
					r.push(`rubs ${his} soft bitchclit`);
				} else {
					r.push(`jacks off`);
				}
				r.push(`shamelessly as you complete the massage, moaning with satisfaction as the competing sources of endorphins suffuse ${him}.`);
				eventSlave.trust += 2;
				r.toParagraph();
				return r.container();
			}

			function fuck() {
				const r = new SpacedTextAccumulator();
				r.push(`You gently push ${his} shoulders forward. ${He} moans as the forward lean stretches ${his} hip flexors, and then breathes deeply with relief as you pull ${his} legs back and out of their crossed position. The rush of a completed stretch crashes into ${him}, and ${he} relaxes completely. This change of position leaves ${him} with ${his}`);
				if (eventSlave.butt > 6) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 3) {
					r.push(`big butt`);
				} else {
					r.push(`rear`);
				}
				r.push(`pointed right at you, and ${he} knows what's coming next. ${His}`);
				if (eventSlave.anus > 2) {
					r.push(`loose butthole relaxes completely into a gape that positively begs to be penetrated.`);
				} else if (eventSlave.anus > 1) {
					r.push(`relaxed anus opens into a slight gape that positively begs to be penetrated.`);
				} else {
					r.push(`tight anus relaxes slightly, ${his} rosebud begging to be fucked.`);
				}
				r.push(`You rise partway to kneel behind ${him},`);
				if (V.PC.dick === 0) {
					r.push(`sliding fingers inside the slave's ass and humping your pussy against the heel of that hand`);
				} else {
					r.push(`using a hand to guide your member inside the slave's ass`);
					if (V.PC.vagina !== -1) {
						r.addToLast(`, not without teasing your own pussylips a bit`);
					}
				}
				r.addToLast(`. ${He} gasps when your other hand grabs one of ${his} shoulders and continues the massage. You quickly find that working out a knot in ${his} muscles produces reflexive reactions across ${his} whole body, notably including ${his} anal sphincter. After you've driven ${him} into a state of mindless satiation and climaxed yourself, you let ${him} slump to the floor and curl up around ${his} sweaty body.`);
				eventSlave.devotion += 2;
				r.push(VCheck.Anal(eventSlave, 1));
				r.toParagraph();
				return r.container();
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.boobs > 2000,
				s => s.devotion > 20,
				s => s.trust > 20,
				s => canDoAnal(s) || canDoVaginal(s),
			]
		];
	}

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

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

		const r = new SpacedTextAccumulator(node);
		r.push(
			`The steamy air and hot water of the spa aren't only for slaves assigned to rest there full-time. When you head in to soak the day's stress away one evening, you see the back of`,
			contextualIntro(PC, eventSlave, true)
		);
		r.addToLast(`'s head resting against the edge of the warm pool; ${he}'s clearly come in after work.`);
		if (canHear(eventSlave)) {
			r.push(`${He} doesn't hear you come in and stays fully relaxed.`);
		} else {
			r.push(`${He}'s relaxed enough to exit the state of "high alert" ${his} deafness usually forces ${him} to be in.`);
		}
		r.push(`By the time you've showered`);
		if (S.Attendant) {
			r.addToLast(`, fucked the compliant ${S.Attendant.slaveName},`);
		}
		r.push(`and gotten ready to enter the pool, ${he}'s reached such a state of blissful relaxation that ${he} slides ${his} body off the ledge around the side of the pool and floats face-up with ${his} eyes closed.`);
		r.toParagraph();
		r.push(`The sight is comical.`);
		if (eventSlave.belly >= 5000 || eventSlave.weight > 95) {
			r.push(`Four`);
		} else {
			r.push(`Three`);
		}
		r.push(`things break the surface of the water: ${his} ${eventSlave.skin} face,`);
		if (eventSlave.belly >= 5000 || eventSlave.weight > 95) {
			r.push(`${his}`);
			if (eventSlave.belly >= 5000) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				}
			} else {
				r.push(`fat`);
			}
			r.push(`belly, and two enormous breasts.`);
		} else {
			r.push(`and two enormous breasts.`);
		}
		if (eventSlave.nipples === "huge") {
			r.push(`Each is capped by a gigantic nipple, soft with relaxation and the heat of the spa, but hugely prominent.`);
		}
		if (eventSlave.areolae > 1) {
			r.push(`${His} areolae spread widely around each nipple.`);
		}
		if (eventSlave.boobsImplant/eventSlave.boobs >= .50) {
			r.push(`${His} implants keep ${his} tits shaped in exactly the same way regardless of currents in the water, betraying their fake nature.`);
		} else if (eventSlave.boobsImplant === 0) {
			r.push(`${His} all-natural boobs move gently with currents in the water.`);
		} else {
			r.push(`${His} boobs bob gently to the currents in the water with just a bit more firmness than one would expect.`);
		}
		if (eventSlave.belly >= 500000) {
			r.push(`It's amazing ${he} can manage to stay afloat with ${his} middle that hugely distended.`);
		} else if (eventSlave.weight > 95) {
			r.push(`Water soundly laps against the sides of the flabby island that is ${his} gut.`);
		}
		r.push(`In any case, ${he}'s completely lost in the warmth and comfort of the water — and the relief of having the weight taken off ${his} chest`);
		if (eventSlave.belly >= 100000) {
			r.push(`and stomach`);
		}
		r.push(`for a brief moment.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Sit against the side of the pool with ${him} in your lap`, sit, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null),
			new App.Events.Result(`Fuck ${him} under the water`, fuck, 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 sit() {
			const r = new SpacedTextAccumulator();
			r.push(`You`);
			if (V.PC.dick === 0) {
				r.push(`don a waterproof, vibrating strap-on and`);
			}
			r.push(`step into the pool and`);
			if (eventSlave.belly >= 450000) {
				r.push(`struggle to`);
			}
			r.push(`lift ${him} half-out of the water in a bridal carry, your arms behind ${his} shoulders and the backs of ${his} knees.`);
			if (canSee(eventSlave)) {
				r.push(`${His} eyes open`);
			} else {
				r.push(`${He} mumbles`);
			}
			r.push(`sleepily`);
			if (eventSlave.belly >= 1500) {
				r.push(`as ${he} rests a hand on ${his} ${belly} belly,`);
			}
			r.push(`and ${he} ${say}s`);
			if (eventSlave.lips > 70) {
				r.push(`through ${his} huge lips,`);
			} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
				r.push(`through ${his} piercings,`);
			} else {
				r.push(`quietly,`);
			}
			r.push(`"Hi, ${Master}." You sit against the side of the pool, letting ${his}`);
			if (eventSlave.butt > 8) {
				r.push(`massive`);
			} else if (eventSlave.butt > 5) {
				r.push(`huge`);
			} else if (eventSlave.butt > 2) {
				r.push(`healthy`);
			} else {
				r.push(`trim`);
			}
			r.push(`bottom sink down into your lap. ${He} shimmies ${himself} atop your`);
			if (V.PC.dick === 0) {
				r.push(`phallus,`);
			} else {
				r.push(`dick,`);
			}
			r.push(`gently seating it between ${his} buttocks, and cranes ${his} neck back to kiss the bottom of your chin. ${He} gradually comes out of ${his} heat stupor, riding ${himself} back and forth more and more until the`);
			if (eventSlave.anus > 2) {
				r.push(`slit of ${his} asspussy`);
			} else if (eventSlave.anus > 1) {
				r.push(`opening of ${his} anus`);
			} else {
				r.push(`pucker of ${his} butt`);
			}
			r.push(`rests against your`);
			if (V.PC.dick === 0) {
				r.push(`strongly vibrating strap-on.`);
			} else {
				r.push(`cock.`);
			}
			r.push(`You take ${his} hips and firmly thrust into ${his} rectum, eliciting a little whimper, but ${he} begins to bounce gently in the water, sodomizing ${himself}, ${his} gigantic breasts moving up and down and making concentric ripples spread outward. ${He}'s still very relaxed and ${his} first orgasm takes ${him} by surprise,`);
			if (eventSlave.balls > 0) {
				r.push(`${his} cum floating to the surface;`);
				if (canSee(eventSlave)) {
					r.push(`${he} points at it and giggles`);
				} else {
					r.push(`${he} feels it brush ${his} skin and giggles`);
				}
				r.push(`before getting`);
			} else {
				r.push(`making ${him} twitch and shudder with aftershocks as ${he} gets`);
			}
			r.push(`${his} feet up on the ledge to ride you harder. When you're done you let ${him} float again, but curiosity about how ${his} fucked butt feels under the water leads you to reach a hand`);
			if (hasBothLegs(eventSlave)) {
				r.push(`between ${his} legs`);
			} else {
				r.push(`underneath ${him}`);
			}
			r.push(`and grope ${his} anus. ${His} warm, relaxed`);
			if (eventSlave.anus > 2) {
				r.push(`asspussy`);
			} else if (eventSlave.anus > 1) {
				r.push(`backdoor`);
			} else {
				r.push(`tightness`);
			}
			r.push(`is so enticing you push ${him} to ${his} feet and take ${him} a second time, standing in the shoulder-depth water. By the time you're done ${he}'s so sexually exhausted that you carry ${him} to the shower.`);
			r.push(VCheck.Anal(eventSlave, 2));
			eventSlave.devotion += 4;
			r.toParagraph();
			return r.container();
		}

		function fuck() {
			const r = new SpacedTextAccumulator();
			r.push(`You gather some necessary items into a pool bag and step stealthily into the water, taking ${him} by an ankle and towing ${him} toward the deep end. "Hi, ${Master}," comes a sleepy greeting from the slave as you pull ${him} through the water, ${his} boobs making twin bow waves. ${He} manages a shocked squeal as you quickly secure a weight belt`);
			if (eventSlave.belly >= 120000) {
				r.push(`above ${his}`);
			} else {
				r.push(`around ${his}`);
			}
			if (eventSlave.belly >= 1500) {
				r.push(`${belly}`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			}
			r.push(`middle and drop ${him}, letting ${him} sink so swiftly that`);
			if (eventSlave.butt > 5) {
				r.push(`${his} massive bottom pads ${him} against a painful thump on`);
			} else if (eventSlave.butt > 2) {
				r.push(`${his} healthy bottom pads ${him} against a painful thump on`);
			} else {
				r.push(`${his} bottom receives a painful thump against`);
			}
			r.push(`the bottom of the pool. Before ${he} can panic, ${he} feels your mouth against ${his}`);
			if (eventSlave.lips > 70) {
				r.push(`dick sucking`);
			} else if (eventSlave.lips > 20) {
				r.push(`lovely`);
			}
			r.push(`lips, breathing for ${him}. You have two long, flexible snorkels designed for exactly this, but you keep ${hers} away from ${him} and breathe ${his} air into ${him} for a short time, and ${he} trusts you enough to rely on you. When you finally give ${him} ${his} snorkel ${he} laughs, bubbles rising from around the mouthpiece, and then hugs you impulsively, intentionally giving you a huge faceful of boob. You pull ${his} weight belt down and tighten it around ${his} ankles so ${he}'s pinned standing on the bottom, and then`);
			if (V.PC.vagina !== -1) {
				r.push(`spread ${his} knees so you can scissor your pussy against ${him} in the near-zero gravity, the tangle of limbs and breasts swaying gently as you grind.`);
			} else {
				r.push(`insert yourself into the`);
				if (canDoVaginal(eventSlave)) {
					if (eventSlave.vagina > 3) {
						r.push(`welcoming gape of ${his} pussy.`);
					} else if (eventSlave.vagina > 2) {
						r.push(`loose embrace of ${his} pussy.`);
					} else if (eventSlave.vagina > 1) {
						r.push(`welcoming embrace of ${his} pussy.`);
					} else {
						r.push(`tight tight embrace of ${his} pussy.`);
					}
					r.push(`${He} enjoys the sensation of such an unusual fucking, wriggling against ${his} weighted feet and moaning through ${his} snorkel as you gently take ${him} under water. ${His} enormous breasts quiver in near-zero gravity with each thrust, until you notice the delicious motion and take one in each hand.`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else {
					if (eventSlave.anus > 2) {
						r.push(`loose slit of ${his} asspussy.`);
					} else if (eventSlave.anus > 1) {
						r.push(`welcoming pucker of ${his} anus.`);
					} else {
						r.push(`tight pucker of ${his} butt.`);
					}
					r.push(`${He} exaggerates ${his} discomfort, wriggling against ${his} weighted feet and squealing through ${his} snorkel as you gently sodomize ${him} under water. ${His} enormous breasts quiver in near-zero gravity with each thrust, until you notice the delicious motion and take one in each hand.`);
					r.push(VCheck.Anal(eventSlave, 1));
				}
			}
			r.push(`The amount of air you can pull through the snorkel just isn't enough to facilitate the throes of your lovemaking, so by the time you're done, ${he}'s so exhausted ${he} can barely float to the edge of the pool. Fortunately ${his} lovely tits make for quite the flotation device, so you gently guide ${him} to the shallow end`);
			if (V.PC.dick || eventSlave.balls) {
				r.addToLast(`, leaving a trail of cum in your wake`);
			}
			r.addToLast(`.`);
			eventSlave.trust += 4;
			r.toParagraph();
			return r.container();
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canTalk,
				s => s.rules.speech !== "restrictive",
				s => s.boobsImplant > 400,
				s => s.lipsImplant >= 30,
				s => s.buttImplant > 3,
				s => s.boobs < 9000 || s.butt < 8
			]
		];
	}

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

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

		let r = [];
		r.push(`Going about your day, you see`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`sitting`);
		if (hasAnyLegs(eventSlave)) {
			if (hasBothLegs(eventSlave)) {
				r.push(`cross-legged`);
			}
			r.push(`in`);
		} else {
			r.push(`propped against the doorway of`);
		}
		r.push(`the remote surgery room,`);
		if (canSee(eventSlave)) {
			r.push(`staring intently at`);
		} else {
			r.push(`gazing longingly towards`);
		}
		r.push(`the equipment. ${He}'s not breaking any rules, but this behavior is so strange you investigate. ${He} asks`);
		if (eventSlave.lips > 70) {
			r.push(`hesitantly through ${his} huge lips,`);
		} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
			r.push(`hesitantly through ${his} piercings,`);
		} else {
			r.push(`hesitantly,`);
		}
		r.push(Spoken(eventSlave, `"${Master}, I... I have a lot of implants. A lot."`));
		if (hasAnyArms(eventSlave)) {
			r.push(`${He} touches ${his} body absentmindedly.`);
		} else {
			r.push(`${He} wriggles ${his} body, trying to indicate ${his} implants.`);
		}
		r.push(`"Can... can you give me some more?"`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`${He} asked for it; give ${him} the works`, give),
			eventSlave.bellyPreg >= 5000
				? new App.Events.Result(`Not while ${he} is so pregnant`, pregnant)
				: new App.Events.Result(),
			new App.Events.Result(`No`, no),
		]);

		function give() {
			r = [];
			r.push(`As the sterile doors of the surgical equipment hiss closed over ${him}, you whisper in ${his} ear that ${he}'s about to be cut up. ${He} looks at you with a mix of fear and wild excitement. After nearly a whole week of constant surgery and expensive drug-induced recovery,`);
			if (canSee(eventSlave)) {
				r.push(`${he} finally gets to see ${his} new body in the mirror.`);
			} else if (!hasAnyArms(eventSlave)) {
				r.push(`you finally describe all the new implants in ${his} body and how they make ${him} look.`);
			} else {
				r.push(`you finally let ${him} feel ${his} new body, even helping ${his} hands to the less obvious changes.`);
			}
			r.push(`${He} has cartoonishly huge lips, boobs, and buttocks; ${he} looks like a caricature of a bimbo. ${He} cries with gratitude`);
			if (canSee(eventSlave)) {
				r.push(`to see ${himself},`);
			} else if (!hasAnyArms(eventSlave)) {
				r.push(`to`);
				if (canHear(eventSlave)) {
					r.push(`hear`);
				} else {
					r.push(`discover`);
				}
				r.push(`how ${he} looks,`);
			} else {
				r.push(`as ${he} feels ${his} new body,`);
			}
			r.push(`and can scarcely wait to recover enough to get fucked. <span class="devotion inc">${He} has become extremely devoted to you.</span>`);
			cashX(forceNeg(Math.trunc(125*V.upgradeMultiplierMedicine)), "slaveSurgery", eventSlave);
			eventSlave.devotion += 10;
			const boobImplant = Math.clamp(20000-eventSlave.boobs, 0, 2000);
			eventSlave.boobsImplant += boobImplant;
			eventSlave.boobs += boobImplant;
			const buttImplant = Math.clamp(10-eventSlave.butt, 0, 4);
			eventSlave.buttImplant += buttImplant;
			eventSlave.butt += buttImplant;
			const lipImplant = Math.clamp(80-eventSlave.lips, 0, 20);
			eventSlave.lipsImplant += lipImplant;
			eventSlave.lips += lipImplant;
			return r;
		}

		function pregnant() {
			return [`${He}'s clearly disappointed, but ${he} accepts your will and goes about ${his} business. After the incident, you notice that ${he} definitely seems to have a kink for implants. ${He} loves it when ${his} implants are groped, but ${his} favorite is when ${he} gets to fuck another slave with fake tits. ${He} can't keep ${his}`, ...noEnding()];
		}

		function no() {
			return [`${He}'s clearly disappointed, but ${he} accepts that you are watching out for ${his} health and goes about ${his} business. After the incident, you notice that ${he} definitely seems to have a kink for implants. ${He} loves it when ${his} implants are groped, but ${his} favorite is when ${he} gets to fuck another slave with fake tits. ${He} can't keep ${his}`, ...noEnding()];
		}

		function noEnding() {
			r = [];
			if (hasBothArms(eventSlave)) {
				r.push(`hands`);
			} else if (hasAnyArms(eventSlave)) {
				r.push(`fingers`);
			} else {
				r.push(`lips`);
			}
			r.push(`off a pair of bolted-on boobs.`);
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.kindness !== undefined && s.kindness >= 100,
				s => (isSlaveAvailable(s) && canWalk(s)) || ([Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment)),
				s => s.relationship === -3,
				s => random(1, 200) < s.kindness || V.cheatMode === 1,
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		const r = new SpacedTextAccumulator(node);
		r.push(`You are awakened from a sound sleep by someone eagerly`);
		if (PC.dick !== 0) {
			r.push(`sucking your dick.`);
		} else {
			r.push(`eating you out.`);
		}
		r.push(
			`Your slaves know better than to disturb you, let alone take the initiative, but you are shocked when you pull back the sheets and reveal the smile of`,
			contextualIntro(PC, eventSlave, true)
		);
		r.addToLast(`.`);
		if (!canTalk(eventSlave)) {
			r.push(`${He} promptly stops, flashes you an appreciative smile and goes right back to pleasing you.`);
		} else {
			r.push(
				`${He} pulls off you with a frown.`,
				Spoken(eventSlave, `"I'm sorry, ${Master},"`),
				`${he} ${say}s apologetically.`,
				Spoken(eventSlave, `"It's just, you've been so nice to me. This felt like the right thing to do."`),
				`${He} lowers ${his} head back to your crotch.`
			);
		}
		r.toParagraph();
		r.push(`${He} was mindbroken, but seems to have snapped out of it due to a deep love of you.`);

		r.toParagraph();
		App.Events.addResponses(node, [
			new App.Events.Result(`Permit ${him} to continue`, permit),
			new App.Events.Result(`Embrace ${him}`, embrace),
			new App.Events.Result(`Rape ${him}`, rape, virginityWarning()),
			new App.Events.Result(`Punish ${him} for waking you`, punish),
		]);

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

		function permit() {
			const r = new SpacedTextAccumulator();
			r.push(`You can't complain, it feels really good. You don't know where this skill was lurking in ${his} broken mind, but you're glad to see it put to good use.`);
			if (PC.dick !== 0) {
				r.push(`Just as you are about to cum, ${he} takes the full length of your dick down ${his} throat, diligently taking in every drop of cum.`);
			} else {
				r.push(`Even as you buck with pleasure, ${he} diligently keeps ${his} tongue to your clit and pussy, making sure you don't go a moment without pleasure.`);
			}
			r.push(`You don't have an orgasm like that every day, and as ${he} looks at you lovingly, you prod ${him} with your still hard`);
			if (PC.dick !== 0) {
				r.push(`cock`);
			} else {
				r.push(`clit`);
			}
			r.push(`for round two.`);
			r.push(`${He} is <span class="green">no longer mindbroken</span> and for whatever twisted reasons deeply and sincerely <span class="devotion inc">loves</span> and <span class="trust inc">trusts</span> you.`);
			eventSlave.devotion = 90;
			eventSlave.oldDevotion = 90;
			eventSlave.trust = 90;
			eventSlave.oldTrust = 90;
			eventSlave.sexualQuirk = "caring";
			eventSlave.fetish = "none";
			eventSlave.fetishKnown = 1;
			const geneIndex = V.genePool.findIndex(s => s.ID === eventSlave.ID);
			eventSlave.intelligence = V.genePool[geneIndex].intelligence;
			if (V.arcologies[0].FSPaternalist !== "unset") {
				r.push(`Society <span class="reputation inc">strongly approves</span> of ${eventSlave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`);
				V.arcologies[0].FSPaternalist += 0.01*V.FSSingleSlaveRep;
				repX(10*V.FSSingleSlaveRep*(V.arcologies[0].FSPaternalist/V.FSLockinLevel), "futureSocieties");
			}
			seX(eventSlave, "oral", PC, "penetrative", 2);
			eventSlave.kindness = 0;
			r.toParagraph();
			return r.container();
		}

		function embrace() {
			const r = new SpacedTextAccumulator();
			r.push(`You gently grab ${his} face and stare deeply into ${his} ${App.Desc.eyesColor(eventSlave)}.`);
			if (canSee(eventSlave)) {
				r.push(`They are full of life as opposed to their usual dullness.`);
			} else {
				r.push(`They are as dull as always, but that isn't ${his} fault. ${His} facial expressions at the act tell you all you need to know.`);
			}
			r.push(`You pull your ${wife} into a tight embrace — ${him} coming back to you is more than enough of a gift; ${he} needn't do anything more for now. You pull the covers over the both of you and begin to doze off, smiling at the warmth cuddling ever closer to you.`);
			r.push(`${He} is <span class="green">no longer mindbroken</span> and thanks to your care deeply and sincerely <span class="devotion inc">loves</span> and <span class="trust inc">trusts</span> you.`);
			eventSlave.devotion = 100;
			eventSlave.oldDevotion = 100;
			eventSlave.trust = 100;
			eventSlave.oldTrust = 100;
			eventSlave.sexualQuirk = "romantic";
			eventSlave.fetish = "none";
			eventSlave.fetishKnown = 1;
			const geneIndex = V.genePool.findIndex(s => s.ID === eventSlave.ID);
			eventSlave.intelligence = V.genePool[geneIndex].intelligence;
			if (V.arcologies[0].FSPaternalist !== "unset") {
				r.push(`Society <span class="reputation inc">strongly approves</span> of ${eventSlave.slaveName} being restored to sanity by the power of love, which advances ideals about enlightened slaveownership.`);
				V.arcologies[0].FSPaternalist += 0.01*V.FSSingleSlaveRep;
				repX(10*V.FSSingleSlaveRep*(V.arcologies[0].FSPaternalist/V.FSLockinLevel), "futureSocieties");
			}
			eventSlave.kindness = 0;
			r.toParagraph();
			return r.container();
		}

		function rape() {
			const fuckSlaves = fuckSlavesLength();
			const r = new SpacedTextAccumulator();
			r.push(`Getting head isn't going to cut it. You easily overpower the startled ${SlaveTitle(eventSlave)} and`);
			if (canDoVaginal(eventSlave)) {
				r.push(`flip ${him} onto ${his} back.`);
				if (PC.dick !== 0) {
					r.push(`You viciously rape ${him}, forcing yourself deep into ${him} before painting ${his} insides with your seed. You leave the quivering ${girl} to leak fluids while you get comfortable again.`);
					if (eventSlave.vagina === 0) {
						r.push(`${His} once virgin pussy now <span class="lime">gapes slightly</span> after your enjoyment of it.`);
						eventSlave.vagina++;
					}
				} else {
					r.push(`You don the biggest strap-on in reach and viciously rape ${him}, roughly groping ${his} breasts while you do. Once you are satisfied with the stimulation, you thrust hard and deep one last time for good measure, only to have the dildo stay firmly lodged in ${his} cunt. You shrug, not your problem.`);
					if (eventSlave.vagina === 0) {
						r.push(`${His} once virgin pussy now is now thoroughly stretched after your enjoyment of it. You watch ${his} body struggle to force the dildo out of ${him} until it manages to do so with a wet thud.`);
						eventSlave.vagina++;
					}
				}
				r.push(`${He} doesn't move from this position and barely reacts to your prodding; it seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake.`);
				seX(eventSlave, "vaginal", PC, "penetrative");
				if (canImpreg(eventSlave, PC)) {
					knockMeUp(eventSlave, 5, 0, -1);
				}
			} else if (canDoAnal(eventSlave)) {
				r.push(`force ${his} ass into the air.`);
				if (PC.dick !== 0) {
					r.push(`You viciously assrape ${him}, cumming strongly into ${his} spasming anus while making sure to save one last spurt to paint ${his} back with.`);
					if (eventSlave.anus === 0) {
						r.push(`${His} once virgin hole now <span class="lime">gapes slightly</span> after your enjoyment of it.`);
						eventSlave.anus++;
					}
				} else {
					r.push(`You don the biggest strap-on in reach and viciously assrape ${him}, forcing ${his} face into the sheets with one hand while roughly groping ${his} breasts with the other. Once you are satisfied with the stimulation, you thrust hard and deep one last time for good measure, only to have the dildo stay firmly lodged in ${his} ass. You shrug, not your problem.`);
					if (eventSlave.anus === 0) {
						r.push(`${His} once virgin hole now is now thoroughly stretched after your enjoyment of it. You watch ${his} body struggle to force the dildo out of rear until it manages to do so with a soft thud.`);
						eventSlave.anus++;
					}
				}
				r.push(`${He} doesn't move from this position and barely reacts to your prodding; it seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake.`);
				if (canImpreg(eventSlave, PC)) {
					knockMeUp(eventSlave, 5, 1, -1);
				}
				seX(eventSlave, "anal", PC, "penetrative");
			} else {
				r.push(`slam ${his} head into your crotch.`);
				if (PC.dick !== 0) {
					r.push(`You viciously facefuck ${him}, cumming strongly down ${his} gagging throat while making sure to save one last spurt to paint ${his} face with.`);
				} else {
					r.push(`As ${he} recoils, you grab a strap-on and force it into ${his} mouth before fastening it to yourself. Once you are situated, you viciously facefuck ${him} until you are satisfied. As ${he} struggles to catch ${his} breath, you toggle the release and reveal that it is a squirt dildo, painting ${his} face with fake semen.`);
				}
				r.push(`${He} falls backwards, where ${he} lays, unmoving. It seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake.`);
				seX(eventSlave, "oral", PC, "penetrative");
			}
			r.push(`You pull the blanket back over yourself and nudge ${him} off your bed; you'll deal with ${him} in the morning`);
			if (fuckSlaves > 1) {
				if (V.masterSuiteUpgradeLuxury === 2) {
					r.addToLast(`, which will likely entail pulling ${his} used body out of the fuckpit orgy`);
				} else {
					r.addToLast(`, assuming one of your other toys doesn't get to ${him} first`);
				}
			}
			r.addToLast(`.`);
			if (fuckSlaves > 1 && V.masterSuiteUpgradeLuxury === 2) {
				if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					if (eventSlave.anus < 3) {
						eventSlave.anus++;
					}
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves*2);
				}
				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					if (eventSlave.vagina < 3) {
						eventSlave.anus++;
					}
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves*2);
				}
				seX(eventSlave, "oral", PC, "penetrative", fuckSlaves*2);
			} else if (fuckSlaves > 1) {
				if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves*2);
				} else if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves*2);
				} else {
					seX(eventSlave, "oral", PC, "penetrative", fuckSlaves*2);
				}
			}
			eventSlave.kindness = -100;
			r.toParagraph();
			return r.container();
		}

		function punish() {
			const fuckSlaves = fuckSlavesLength();
			const r = new SpacedTextAccumulator();
			r.push(`In one swift motion you throw aside the cover and backhand the ${SlaveTitle(eventSlave)} for waking you. ${He} falls to your side, where ${he} lays, unmoving. It seems ${his} mind was still fragile, ${he}'ll likely be back to ${his} usual blank self when you awake. You pull the blanket back over yourself; you'll deal with ${him} in the morning`);
			if (fuckSlaves > 1) {
				if (V.masterSuiteUpgradeLuxury === 2) {
					r.addToLast(`, which will likely entail pulling ${his} used body out of the fuckpit orgy`);
				} else {
					r.addToLast(`, assuming one of your other toys doesn't get to ${him} first`);
				}
			}
			r.addToLast(`.`);
			if (fuckSlaves > 1 && V.masterSuiteUpgradeLuxury === 2) {
				if (canDoAnal(eventSlave) &&eventSlave.anus >0) {
					if (eventSlave.anus < 3) {
						eventSlave.anus++;
					}
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves*2);
				}
				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					if (eventSlave.vagina < 3) {
						eventSlave.vagina++;
					}
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves*2);
				}
				seX(eventSlave, "oral", PC, "penetrative", fuckSlaves*2);
			} else if (fuckSlaves > 1) {
				if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					seX(eventSlave, "anal", PC, "penetrative", fuckSlaves);
				} else if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					seX(eventSlave, "vaginal", PC, "penetrative", fuckSlaves);
				} else {
					seX(eventSlave, "oral", PC, "penetrative", fuckSlaves);
				}
			}
			eventSlave.kindness = -100;
			r.toParagraph();
			return r.container();
		}
	}
};