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

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

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

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

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

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

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

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

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

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

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

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

			function here() {
				r = [];

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

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

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

		function fuck() {
			r = [];

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


code:
App.Events.RESSBedSnuggle = class RESSBedSnuggle 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 => [Job.CONCUBINE, Job.FUCKTOY, Job.MASTERSUITE].includes(s.assignment),
				s => s.devotion > 50,
				s => s.trust > 50,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, woman, girl, himself
		} = getPronouns(eventSlave);
		const {say} = getEnunciation(eventSlave);
		const {hisA, girlA, womanA, loliA} = getPronouns(assistant.pronouns().main).appendSuffix('A');
		const belly = bellyAdjective(eventSlave);

		let womanTerm = "kid";
		if (eventSlave.physicalAge > 30) {
			womanTerm = woman;
		} else if (eventSlave.physicalAge > 18) {
			womanTerm = girl;
		} else if (eventSlave.physicalAge > 12) {
			womanTerm = "teen";
		}

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

		let r = [];
		r.push(`${capFirstChar(V.assistant.name)} wakes you in the morning,`);
		if (V.assistant.personality <= 0) {
			r.push(`${hisA} voice`);
		} else {
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`${hisA} monster${girlA} avatar's sultry voice`);
					break;
				case "shemale":
					r.push(`${hisA} shemale avatar's syrupy voice`);
					break;
				case "amazon":
					r.push(`${hisA} amazon avatar's powerful voice`);
					break;
				case "businesswoman":
					r.push(`${hisA} business${womanA} avatar's confident voice`);
					break;
				case "fairy":
				case "pregnant fairy":
					r.push(`${hisA} fairy avatar's adorable voice`);
					break;
				case "schoolgirl":
					r.push(`${hisA} school${girlA} avatar's bubbly voice`);
					break;
				case "loli":
				case "preggololi":
					r.push(`${hisA} ${loliA} avatar's childish voice`);
					break;
				case "angel":
					r.push(`${hisA} angel avatar's heavenly voice`);
					break;
				case "cherub":
					r.push(`${hisA} cherub avatar's cheerful voice`);
					break;
				case "incubus":
					r.push(`${hisA} incubus avatar's forceful voice`);
					break;
				case "succubus":
					r.push(`${hisA} succubus avatar's sultry voice`);
					break;
				case "imp":
					r.push(`${hisA} imp avatar's mischievous voice`);
					break;
				case "witch":
					r.push(`${hisA} witch avatar's cocky voice`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`${hisA} avatar's piecemeal voice`);
					break;
				default:
					r.push(`${hisA} voice`);
			}
		}
		r.push(`gently calling your name. As you regain consciousness, you become aware of a weight on your`);
		if (V.PC.boobs >= 1400) {
			r.push(`chest other than your heavy tits.`);
		} else {
			r.push("chest.");
		}
		r.push(contextualIntro(V.PC, eventSlave, true, false, true));
		r.push(`has snuggled up against you in ${his} sleep. ${He}'s nude, and so are you; everyone sleeps naked in your penthouse. The sheet is down at your hips, leaving your upper bodies bare.`);
		if (!hasAnyArms(eventSlave)) {
			r.push(`${He}'s wormed ${his}`);
			if (isAmputee(eventSlave)) {
				r.push(`limbless`);
			} else {
				r.push(`armless`);
			}
			r.push(`torso under your arm,`);
		} else {
			r.push(`${He} has one arm across your`);
			if (V.PC.boobs >= 300) {
				r.push(`chest, just below your breasts,`);
			} else if (V.PC.title === 1) {
				r.push(`manly chest`);
			} else {
				r.push(`flat chest,`);
			}
		}
		r.push(`and is using your shoulder as a pillow. You can feel ${his} warm breath across`);
		if (V.PC.boobs >= 300 || V.PC.title === 0) {
			r.push(`your nipple on that side, and it hardens slowly under your gaze.`);
		} else {
			r.push(`your well-developed pectorals.`);
		}
		if (eventSlave.boobs > 4000) {
			r.push(`${His} incredible tits are resting to either side of your ribcage, with one of them a heavy mass on your chest and the other trapped under ${his}`);
		} else if (eventSlave.boobs > 1200) {
			r.push(`${His} big boobs form a warm, soft mass between you`);
		} else {
			r.push(`${His} soft chest rests warmly against your ribcage`);
		}
		if (eventSlave.belly >= 10000) {
			r.push(r.pop() + `, beneath them, ${his} ${belly}`);
			if (eventSlave.bellyPreg >= 8000) {
				r.push(`pregnant`);
			}
			r.push(`belly rests`);
			if (V.PC.belly >= 1500) {
				r.push(`against your own baby bump,`);
			} else {
				r.push(`upon your flat stomach,`);
			}
		}
		r.push(`and farther down, there's another source of warmth where ${he}'s`);
		if (!hasAnyLegs(eventSlave)) {
			r.push(`got ${his} legless pelvis resting against your ${eventSlave.height <= V.PC.height ? "hip" : "thigh"}.`);
		} else {
			r.push(`straddling your thigh.`);
		}
		App.Events.addParagraph(node, r);
		r = [];

		r.push(`"${properTitle()}," ${V.assistant.name} calls again, "you`);
		if (V.assistant.personality <= 0) {
			r.push(`set a wake-up for this time.`);
		} else {
			r.push(`asked me to wake you at this time.`);
		}
		r.push(`You have a business meeting that starts shortly." You begin to slide out from under ${eventSlave.slaveName}, but the ${womanTerm} clings to you in ${his} sleep as the warmth of your body begins to move away from ${him}.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result("Make the meeting", meeting),
			new App.Events.Result("Call in from where you are", call),
			new App.Events.Result("Go back to sleep", sleep),
			new App.Events.Result("Spend the day in bed", bed),
		]);

		function meeting() {
			r = [];

			let meetingBonus = Math.trunc(V.cash / 10000 * 1000);
			if (meetingBonus > 5000) {
				meetingBonus = 5000;
			} else if (meetingBonus < 1000) {
				meetingBonus = 1000;
			}
			r.push(`You finish the motion and get on with your day. ${He} burrows into the warm place on the bed where your body lay, which is actually an excellent sign of ${his} mental state. It suggests that ${his} dreaming mind is quite comfortable with your`);
			if (canSmell(eventSlave)) {
				r.push(`presence, and even smell.`);
			} else {
				r.push(`presence.`);
			}
			r.push(`You make the meeting, consoling yourself with the thought that you're hardly lacking for opportunities to`);
			if (V.PC.dick !== 0) {
				r.push(`stick your dick in`);
			} else {
				r.push(`have sex with`);
			}
			r.push(`${eventSlave.slaveName}. The business opportunity turns out to be <span class="cash inc">quite profitable;</span> you're glad you didn't pass it up.`);
			cashX(meetingBonus, "event", eventSlave);
			return r;
		}

		function call() {
			r = [];

			let meetingBonus = Math.trunc(V.cash / 10000) * 1000;
			if (meetingBonus > 5000) {
				meetingBonus = 5000;
			} else if (meetingBonus < 1000) {
				meetingBonus = 1000;
			}
			r.push(`You tell ${V.assistant.name} to inform your business contacts that you'll be attending the meeting by telepresence. A camera mounted above you focuses tightly on your face, making it look like you're relaxing, but concealing the fact that you have a naked ${womanTerm} draped across you. The meeting is long enough that your interlocutors eventually realize that something unusual is going on, especially once ${he} wakes up and starts sleepily`);
			if (V.PC.dick !== 0) {
				r.push(`sucking your dick`);
				if (V.PC.vagina !== -1) {
					r.push(`and`);
				}
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			if (V.PC.vagina !== -1) {
				r.push(`eating you out`);
				seX(eventSlave, "oral", V.PC, "vaginal");
			}
			r.push(r.pop() + `, out of frame. They're slightly annoyed, since having sex during meetings is still considered a minor faux pas, but you close the deal, and ${eventSlave.slaveName} is very pleased that you would rearrange your affairs to make time for`);
			if (V.PC.dick !== 0) {
				r.push(`one of ${his} blowjobs.`);
			} else {
				r.push(`oral sex with ${him}.`);
			}

			cashX(meetingBonus, "event", eventSlave);
			repX(forceNeg(50), "event", eventSlave);
			eventSlave.devotion += 4;
			return r;
		}

		function sleep() {
			r = [];
			const frag = document.createDocumentFragment();
			let didAnal = false;
			let didVaginal = false;

			r.push(`You tell ${V.assistant.name} to cancel the appointment, plant a kiss atop your bedmate's sleeping head, and go back to sleep yourself, with the peerless comfort of a warm, naked ${womanTerm} cuddled up beside you. ${capFirstChar(V.assistant.name)} lowers the temperature in the room and directs another slave to quietly put a couple of warm blankets over you and ${eventSlave.slaveName}. When you finally wake, several hours later, the effect is magical. You're ensconced in a little island of warmth and comfort, a tiny universe of relaxation populated only by yourself and your slave. ${He} woke before you did, but remained still to avoid disturbing you.`);
			if (canSee(eventSlave)) {
				r.push(`From the lazy, contented look in ${his} ${App.Desc.eyesColor(eventSlave)} as ${he} meets your waking gaze, ${he} did not mind waiting. ${He} was already looking at your face when you opened your eyes.`);
			} else {
				r.push(`From the serene expression on ${his} face as ${he} meets your waking gaze, ${he} did not mind waiting. ${He} was already looking at your face, lost in the soothing ${canHear(eventSlave) ? "sounds" : "motions"} of your breathing, when you opened your eyes.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];

			r.push(`Since you're awake, ${he} rolls onto ${his} face and then further, to place ${his} back and`);
			if (eventSlave.butt > 5) {
				r.push(`massive ass`);
			} else if (eventSlave.butt > 2) {
				r.push(`healthy rear`);
			} else {
				r.push(`butt`);
			}
			r.push(`against you, making sure to drag ${his} ${eventSlave.nipples} nipples against you the whole way. You accept the invitation and spoon ${him},`);
			// PC height stuff here!
			if (eventSlave.height >= 185) {
				r.push(`your bodies lining up well, since ${he}'s as tall as you are.`);
			} else if (eventSlave.height >= 160) {
				r.push(`${his} body fitting neatly within the embrace of your larger frame.`);
			} else {
				r.push(`${his} small body fitting entirely within your embrace.`);
			}
			if (eventSlave.muscles > 30) {
				r.push(`${His} muscles`);
			} else {
				r.push(`${His} softness`);
			}
			r.push(`and warmth awaken your desire, and ${he} feels`);
			if (V.PC.dick !== 0) {
				r.push(`your stiffening cock beginning to press against`);
				if (!hasBothLegs(eventSlave)) {
					r.push(`${his} perineum. ${He} shifts to slide ${himself} along its`);
					if (V.PC.vagina !== -1) {
						r.push(`shaft and down to where your pussy begins.`);
					} else {
						r.push("shaft.");
					}
				} else {
					r.push(`the place between ${his} thighs. ${He} shifts to let your dick slide between them, and reaches down to massage its head.`);
				}
			} else {
				r.push(`heat building against ${his} butt.`);
				if (!hasAnyArms(eventSlave)) {
					r.push(`${He} does ${his} best to grind against you, since ${he} can't caress you without hands.`);
				} else {
					r.push(`${He} snakes a hand behind ${himself} to caress your womanhood, and begins to gently`);
					if (hasBothArms(eventSlave)) {
						r.push(`masturbate with the other.`);
					} else {
						r.push(`grind against you.`);
					}
				}
			}
			if (V.PC.dick !== 0) {
				if (eventSlave.vagina > 0 && eventSlave.anus > 0 && canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
					r.push(`${He} begins to shift farther forward and back along your dick, causing its head to press against ${his} anus and then slide forward to nestle between ${his} pussylips. In response to ${his} wordless question, you nibble ${his} ear and tell ${him} that it's ${his} choice. ${He} turns ${his} upper torso to`);
					if (canSee(eventSlave)) {
						r.push(`stare at you in surprise`);
					} else {
						r.push(`so that you may see ${his} surprise`);
					}
					r.push(`for a moment, and then smiles and gives you a peck on the cheek.`);
					if ((eventSlave.fetish === "buttslut") && (eventSlave.fetishKnown === 1)) {
						r.push(`${He} hikes ${himself} up a bit, and then slides ${his} anal sphincter slowly around and down your cock until you're resting all the way up ${his} ass. You share loving anal`);
						didAnal = true;
					} else {
						r.push(`${He} hikes ${himself} up to give your dickhead a last teasing press against ${his} butt before cocking ${his} hips and sliding your cock into ${his} soaking cunt. You make love`);
						didVaginal = true;
					}
				} else if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
					r.push(`${He} cocks ${his} hips and so that your cock is pressing against ${his} soaked cunt. In response to ${his} wordless question, you nibble ${his} ear and tell ${him} that it's ${his} choice. ${He} turns ${his} upper torso to`);
					if (canSee(eventSlave)) {
						r.push(`stare at you in surprise`);
					} else {
						r.push(`so that you may see ${his} surprise`);
					}
					r.push(`for a moment, and then smiles and gives you a peck on the cheek.`);
					if (eventSlave.fetish === "pregnancy" && eventSlave.fetishKnown === 1 && isFertile(eventSlave)) {
						r.push(`${He} pushes against you until you are fully inserted into ${his} pussy. ${He}'s ripe for impregnation and needs your baby in ${him}. You make love`);
					} else if (eventSlave.vagina > 2) {
						r.push(`${He} easily slides your cock into ${his} loose pussy. You make love`);
					} else {
						r.push(`${He} hikes ${himself} up a bit, and then gently slides your cock into ${his} tight pussy. You make love`);
					}
					didVaginal = true;
				} else if (eventSlave.anus > 0 && canDoAnal(eventSlave)) {
					r.push(`${He} begins to shift farther forward along your dick, causing its head to press against ${his} anus. In response to ${his} wordless question, you nibble ${his} ear and tell ${him} that it's ${his} choice. ${He} turns ${his} upper torso to`);
					if (canSee(eventSlave)) {
						r.push(`stare at you in surprise`);
					} else {
						r.push(`so that you may see ${his} surprise`);
					}
					r.push(`for a moment, and then smiles and gives you a peck on the cheek.`);
					if (eventSlave.fetish === "buttslut" && eventSlave.fetishKnown === 1) {
						r.push(`${He} hikes ${himself} up a bit, and then slides ${his} anal sphincter slowly around and down your cock until you're resting all the way up ${his} ass. You share loving anal`);
						didAnal = true;
					} else if (eventSlave.anus > 2) {
						r.push(`${He} hikes ${himself} up a bit, and then easily slides your cock into ${his} loose rectum. You share loving anal`);
						didAnal = true;
					} else {
						r.push(`${He} decides against buttsex, and`);
						if (!hasBothLegs(eventSlave)) {
							r.push(`contents ${himself} with grinding`);
						} else {
							r.push(`presses ${his} thighs together so you can frot ${him}.`);
						}
						r.push(`After making love`);
					}
				} else {
					r.push(`You`);
					if (!hasBothLegs(eventSlave)) {
						r.push(`grind against ${him}`);
					} else {
						r.push(`frot ${him}`);
					}
				}
			} else {
				r.push(`You reach around ${him} and attend to a nipple with each hand, spreading your attention to the whole breast once`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`they're perfectly stiff.`);
				} else {
					r.push(`they've tightened around your fingers.`);
				}
				r.push(`After sharing gentle lovemaking`);
			}
			r.push(`for a while, until you sense that ${he}'s on the edge of climax. Without warning, you lift the edge of the blankets and send a gust of cool air down ${his} front and`);
			if (eventSlave.dick > 0) {
				r.push(`right onto ${his} cock.`);
			} else {
				r.push(`across ${him}`);
				if (eventSlave.nipples !== "fuckable") {
					r.push(`hard`);
				} else {
					r.push(`engorged`);
				}
				r.push(`nipples.`);
			}
			r.push(`${He} gasps at the sudden overstimulation and then orgasms very strongly, jerking against you`);
			if (!canTalk(eventSlave)) {
				r.push(`and panting in lieu of an exclamation.`);
			} else {
				r.push(`and ${say}ing "oh" over and over again.`);
			}
			if (V.PC.dick !== 0) {
				r.push(`${He} clenches against your dick,`);
				if (V.PC.vagina !== -1) {
					r.push(`so hard that you can feel the rush of blood into your cunt,`);
				}
			} else {
				r.push(`${He} works your pussy harder,`);
			}
			r.push(`getting you off in turn, and then rolls over to plant a whole-hearted kiss on your lips.`);
			eventSlave.devotion += 4;
			if (didAnal) {
				r.push(VCheck.Anal(eventSlave, 1));
			} else if (didVaginal) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function bed() {
			r = [];
			let didAnal = false;
			let didVaginal = false;

			r.push(`What's the point of becoming a wealthy tycoon in an anarcho-libertarian paradise if you have to obey the rules all the time? You tell ${V.assistant.name} to cancel the appointment. Then, you wake your bedmate, and`);
			if (V.PC.dick !== 0) {
				r.push(`get a blowjob`);
				seX(eventSlave, "oral", V.PC, "penetrative");
				if (V.PC.vagina !== -1) {
					r.push(`and some attention for your pussy`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				}
			} else {
				r.push(`have ${him} eat you out`);
				seX(eventSlave, "oral", V.PC, "vaginal");
			}
			r.push(`under the sheet while you enjoy the lurid sunrise through the glass wall of your bedroom. When the sun is up and you've`);
			if (V.PC.dick !== 0) {
				r.push(`shot your load down ${his} throat,`);
			} else {
				r.push(`climaxed twice,`);
			}
			r.push(`you pull the bemused ${girl} up alongside you again, bring the sheets up over you both, switch on a wallscreen, and ask ${him} if there's anything ${he}'d like to`);
			if (canSee(eventSlave)) {
				r.push(`watch.`);
			} else if (canHear(eventSlave)) {
				r.push(`listen to.`);
			} else {
				r.push(`put on.`);
			}
			r.push(`${He} smiles incredulously, but after you encourage ${him} ${he} finds ${his} confidence and admits that there's a Free Cities serial drama about slave life that ${he} enjoys. You put it on and watch three episodes with ${him}. It's terribly insipid, but there's a lot of explicit sex to liven things up, and all the actresses are nice enough to look at. ${eventSlave.slaveName} cuddles comfortably with you the entire time,`);
			if (canSee(eventSlave)) {
				r.push(`watching raptly`);
			} else if (canHear(eventSlave)) {
				r.push(`listening intently`);
			} else {
				r.push(`enjoying your company`);
			}
			r.push(`and doing ${his} best to explain the wretchedly trite plot you've missed. You have a meal delivered,`);
			if (eventSlave.vagina > 0 && canDoVaginal(eventSlave)) {
				r.push(`fuck ${him},`);
				didVaginal = true;
			} else if (eventSlave.anus > 0 && canDoAnal(eventSlave)) {
				r.push(`fuck ${his} butt,`);
				didAnal = true;
			} else {
				r.push(`fuck ${him},`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			r.push(`and then share a shower and a nap. Thus invigorated, you decide to tour the arcology's nightlife, and tell ${him} ${he}'ll accompany you. ${He} hurries to get ready, filled with excitement. A lovely day.`);
			eventSlave.trust += 4;
			if (didAnal) {
				r.push(VCheck.Anal(eventSlave, 1));
			} else if (didVaginal) {
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			return r;
		}
	}
};

repo_name: Fekenol/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canWalk,
				canTalk,
				s => s.devotion > 50,
				s => s.rules.speech !== "restrictive",
				s => s.birthWeek >= 51,
				s => V.week - s.weekAcquired > 50, // I need a better way to determine a slave has been a slave for a long time outside of the player's ownership.
				s => s.tankBaby === 0
			]
		];
	}

	get weight() {
		return 8;
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(
			`You come across`,
			contextualIntro(V.PC, eventSlave, true),
			`in the kitchen. ${He} has a normal slave meal on a plate in front of ${him}, but also has a pack of hot wax candles from your sex gear. Oddly, ${he} has a candle upright in the food and is trying to light it. You ask what ${he}'s doing, and ${he} explains meekly,`,
			Spoken(eventSlave, `"I don't know, ${Master}. I've been a slave so long. I just`)
		);
		if (canSee(eventSlave)) {
			r.push(Spoken(eventSlave, `saw`));
		} else if (canHear(eventSlave)) {
			r.push(Spoken(eventSlave, `heard`));
		} else {
			r.push(Spoken(eventSlave, `realized`));
		}
		r.push(
			Spoken(eventSlave, `the date today and this seemed like the right thing to do. I'm sorry."`),
			`It's probably ${his} birthday. Apparently ${he}'s losing ${his} grasp on the concept.`
		);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Bake ${him} a cake`, cake, virginityWarning()),
			new App.Events.Result(`Teach ${him} a new meaning of birthdays`, meaning),
			new App.Events.Result(`Punish ${him} for making a mess`, punish),

		]);

		function cake() {
			r = [];
			r.push(`You bake a simple cake while patiently explaining birthdays. ${He} slowly remembers, and`);
			if (canSee(eventSlave)) {
				r.push(`looks repeatedly at the date display`);
			} else {
				r.push(`focuses intently on the date as ${he} repeats it to ${himself}`);
			}
			r.push(`to ingrain ${his} birthday back in ${his} mind. When the cake is done, you quickly dust it with confectionary sugar, stand a hot wax candle in the middle of it, and invite ${him} to think of a wish and blow it out. ${He} sits on your lap and the two of you take turns feeding each other warm cake. When the cake is gone ${he} gets up to do the dishes and you turn to go. As you go, ${he} asks`);
			if (eventSlave.lips > 70) {
				r.push(`through ${his} massive dick-sucking lips,`);
			} else if ((eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2)) {
				r.push(`through ${his} inconvenient oral piercings,`);
			}
			r.push(Spoken(eventSlave, `"${Master}, may I tell you what my wish was?"`));
			if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
				r.push(
					`You nod, and ${he} slowly turns around with ${his} eyes closed and dick erect,`,
					Spoken(eventSlave, `"To feel your warmth embracing me, ${Master}."`)
				);
				if (V.PC.vagina > 0) {
					seX(eventSlave, "penetrative", V.PC, "vaginal");
					if (canImpreg(V.PC, eventSlave)) {
						knockMeUp(V.PC, 20, 0, eventSlave.ID);
					}
				} else if (V.PC.anus > 0) {
					seX(eventSlave, "penetrative", V.PC, "anal");
					if (canImpreg(V.PC, eventSlave)) {
						knockMeUp(V.PC, 20, 1, eventSlave.ID);
					}
				} else {
					seX(eventSlave, "penetrative", V.PC, "oral");
				}
			} else {
				r.push(`You nod, and ${he} kneels on the kitchen chair with ${his} eyes closed,`);
				if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
					r.push(`${his} ${hands} spreading ${his} buttocks; ${his} pussy moist and inviting and ${his} anus begging for penetration. "Take me, ${Master}."`);
					r.push(VCheck.Both(eventSlave, 1));
				} else if (canDoVaginal(eventSlave)) {
					r.push(`${his} ${hands} spreading ${his} buttocks; ${his} pussy moist and inviting. "Take me, ${Master}."`);
					r.push(VCheck.Vaginal(eventSlave, 1));
				} else if (canDoAnal(eventSlave)) {
					r.push(
						`${his} ${hands} spreading ${his} buttocks, and ${his} mouth open.`,
						Spoken(eventSlave, `"Buttsex, ${Master}."`)
					);
					r.push(VCheck.Anal(eventSlave, 1));
				} else {
					r.push(
						`${hands} to ${his} breasts, and mouth wide open.`,
						Spoken(eventSlave, `"To ${canTaste(eventSlave) ? `taste you` : `have you inside me`}, ${Master}."`)
					);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
			}
			r.push(`${He} feels so much <span class="devotion inc">closer to you</span> than before.`);
			eventSlave.devotion += 4;
			return r;
		}

		function virginityWarning() {
			if ((eventSlave.toyHole === "dick" || V.policies.sexualOpenness === 1) && canPenetrate(eventSlave)) {
				return `This option will penetrate you`;
			} else if (canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.vagina === 0 && eventSlave.anus === 0)) {
				return `This option will take ${his} virginities`;
			} else 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 meaning() {
			eventSlave.devotion += 4;
			return `You explain at length that ${he} will feel this way once a year, and that this day is special. On the day that makes ${him} feel this way, ${he} is to cover ${his} nipples with whipped cream, add a pattern with chocolate syrup, garnish each with a cherry, and present ${himself} to ${his} ${getWrittenTitle(eventSlave)}. ${He} nods in understanding and gets to work. When ${he}'s done, you help ${him} reach the confection on ${his} left breast ${himself} while you eat the one on ${his} right. When you're done, ${he} kisses you impulsively. ${He} tastes like whipped cream and chocolate.`;
		}

		function punish() {
			eventSlave.devotion -= 5;
			return `${He} begs your forgiveness and quickly cleans up the food and candles. ${He} can't seem to shake the feeling that <span class="devotion dec">something is wrong with this.</span>`;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.devotion < -20,
				s => s.trust >= -20,
				s => s.clothes === "uncomfortable straps",
				canMove,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {He, he, His, his, him, himself} = getPronouns(eventSlave);
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const hands = hasBothArms(eventSlave) ? "hands" : "hand";
		App.Events.drawEventArt(node, eventSlave, "no clothing");

		let t = [];
		t.push(`One day, you catch sight of`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		if (!canWalk(eventSlave)) {
			t.push(`crawling`);
		} else if (shoeHeelCategory(eventSlave) > 1) {
			t.push(`tottering`);
		} else if (eventSlave.belly >= 10000) {
			t.push(`waddling`);
		} else {
			t.push(`walking`);
		}
		t.push(`around stark naked. This is unacceptable, as ${he} has been ordered to wear humiliating and uncomfortable bondage gear. When confronted,`);
		if (!canTalk(eventSlave)) {
			if (!hasAnyArms(eventSlave)) {
				t.push(`${he} tries to communicate ${his} reluctance to wear the clothing as best as ${he} can with various head movements and facial`);
				if (eventSlave.bellyPreg >= 5000) {
					t.push(`expressions, including several nods towards ${his} rounded middle.`);
				} else {
					t.push("expressions.");
				}
			} else {
				t.push(`${he} uses gestures to communicate ${his} embarrassment with ${his} clothing, covering ${his} nipples, crotch, and anus with ${his} ${hands} one after the other, and begging for clothes that do the same.`);
				if (eventSlave.bellyPreg >= 5000) {
					t.push(`${He} also gestures to ${his} rounded belly with a look of concern.`);
				}
			}
		} else {
			t.push(`${he} ${say}s fearfully,`);
			if (eventSlave.bellyPreg >= 5000) {
				t.push(Spoken(eventSlave, `"I'm sorry, ${Master}, but those things are just so embarrassing! I'm also worried for my ${eventSlave.pregType > 1 ? "babies'" : "baby's"} safety."`));
			} else {
				t.push(Spoken(eventSlave, `"I'm sorry, ${Master}, but those things are just so embarrassing!"`));
			}
		}

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} go naked`, naked),
			new App.Events.Result(`Force ${him} to choose between ${his} straps and public nudity`, publicNude),
			(eventSlave.buttplug === "none" && (eventSlave.vagina < 0 || (eventSlave.vaginalAccessory === "none" && eventSlave.vaginalAttachment === "none")))
				? new App.Events.Result(`Add dildos to ${his} gear`, dildos, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null)
				: new App.Events.Result(),
			(V.arcade > 0)
				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
				: new App.Events.Result(),

		]);

		function naked() {
			t = [];
			if (!canWalk(eventSlave)) {
				t.push(`${He} cheerfully leaves your office,`);
			} else {
				t.push(`${He} skips away happily,`);
			}
			t.push(`overjoyed to be free of the clothing you ordered ${him} to wear. ${His} obedience to you <span class="devotion dec">has decreased,</span> as has <span class="trust inc">${his} fear</span> of you.`);
			eventSlave.devotion -= 5;
			eventSlave.trust += 4;
			return t;
		}

		function publicNude() {
			t = [];
			t.push(`You tell ${him} that you understand, and that ${he} can go naked; ${he} looks thrilled until you ${canHear(eventSlave) ? "tell" : "inform"} ${him} ${he}'ll be ${canWalk(eventSlave) ? "walking" : `dragging ${himself} down`} every hallway in ${V.arcologies[0].name} today, nude. Before ${he} can protest, you add that ${his} only other option is to put ${his} proper clothes back on and be a good little bitch.`);
			if (eventSlave.fetish === "humiliation") {
				t.push(`${He} <span class="devotion inc">happily accepts the alternative,</span>`);
				if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
					t.push(`${his} dick hardening`);
				} else if (eventSlave.dick > 0) {
					t.push(`${his} dick leaking precum`);
				} else if (eventSlave.vagina > 0) {
					t.push(`${his} pussy moistening`);
				} else {
					t.push(`${his} nipples`);
					if (eventSlave.nipples !== "fuckable") {
						t.push(`hardening`);
					} else {
						t.push(`swelling`);
					}
				}
				t.push(`with anticipation.`);
				eventSlave.devotion += 4;
				eventSlave.clothes = "no clothing";
				if (eventSlave.fetishKnown === 0) {
					t.push(`That was not the response you expected; turns out ${he} has a <span class="fetish gain">humiliation fetish.</span>`);
					eventSlave.fetishKnown = 1;
				}
			} else {
				t.push(`${He} shudders and <span class="trust dec">hurries to get ${his} straps back on.</span>`);
				eventSlave.trust -= 5;
			}
			return t;
		}

		function dildos() {
			t = [];
			t.push(`You tell ${him} that you understand, and that you will get ${him} some new clothing. ${He} is thrilled, but ${his} pleasure turns to horror when ${he} ${canSee(eventSlave) ? "sees" : "finds"} that the new clothes are a version of the same slave bondage gear, just with inward-facing dildos for ${his}`);
			if (eventSlave.vagina > -1) {
				t.push(`pussy and`);
			}
			t.push(`asshole.`);
			if (eventSlave.anus === 0 && eventSlave.vagina === 0 && canDoAnal(eventSlave) && canDoVaginal(eventSlave)) {
				t.push(`You pause before getting ${him} dressed; there's little reason to waste virginities on plugs. You`);
				if (V.PC.dick !== 0) {
					t.push(`stroke yourself to erection`);
				} else {
					t.push(`don a strap-on`);
				}
				t.push(`and bend ${him} over, opting to start with ${his} tight pussy.`);
				t.push(VCheck.Both(eventSlave, 1));
			} else if (eventSlave.anus === 0 && canDoAnal(eventSlave)) {
				t.push(`You pause before getting ${him} dressed; there's little reason to waste ${his} anal virginity on a plug. You `);
				if (V.PC.dick !== 0) {
					t.push(`stroke yourself to erection`);
				} else {
					t.push(`don a strap-on`);
				}
				t.push(`and bend ${him} over before working your way into ${his} tight anus.`);
				t.push(VCheck.Anal(eventSlave, 1));
			} else if (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) {
				t.push(`You pause before getting ${him} dressed; there's little reason to waste ${his} virginity on a plug. You`);
				if (V.PC.dick !== 0) {
					t.push(`stroke yourself to erection`);
				} else {
					t.push(`don a strap-on`);
				}
				t.push(` and bend ${him} over before working your way into ${his} tight pussy.`);
				t.push(VCheck.Vaginal(eventSlave, 1));
			}
			t.push(`For the rest of the week, ${he} ${canWalk(eventSlave) ? "walks" : "crawls"} around awkwardly, unable to find a comfortable position`);
			if (eventSlave.belly >= 1500) {
				t.push(`between`);
			} else {
				t.push(`since`);
			}
			t.push(`${his}`);
			if (V.seeRace === 1) {
				t.push(`${eventSlave.race}`);
			}
			t.push(`body`);
			if (eventSlave.belly < 1500) {
				t.push(`is`);
			}
			if (eventSlave.belly >= 1500) {
				t.push(`being penetrated by ${his} own clothing and the straps digging into ${his} ${belly} rounded belly`);
			} else {
				t.push(`being penetrated by ${his} own clothing.`);
			}
			t.push(`<span class="devotion inc">${He} has become more submissive.</span>`);
			eventSlave.devotion += 4;
			return t;
		}

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


code:
App.Events.RESSComfortableSeat = class RESSComfortableSeat extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.PC.belly < 5000,
			() => V.PC.balls < 10
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canStand,
				hasAnyArms,
				canSee,
				s => s.trust > 20,
				s => s.devotion > 20,
				s => s.energy > 40,
				s => s.belly < 300000
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {say, title: Master} = getEnunciation(eventSlave);
		const desc = SlaveTitle(eventSlave);
		const belly = bellyAdjective(eventSlave);
		const dickSize = eventSlave.dick > 4 ? "big" : (eventSlave.dick > 2 ? "" : "tiny");
		const PC = V.PC;

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push("There are sturdy leather seats placed strategically throughout your penthouse. They offer something convenient to bend your slaves over, wherever you happen to encounter them, and they're comfortable, too. At the moment, you're sitting on one, using a tablet to take care of some business that caught you away from your office, but isn't worth heading back to your desk for. Slaves move by your impromptu throne as you work, mostly");
		if (V.averageTrust > 50) {
			t.push("greeting you cheerfully");
		} else if (V.averageTrust > 20) {
			t.push("greeting you properly");
		} else if (V.averageTrust > -20) {
			t.push("doing their best to greet you properly");
		} else if (V.averageTrust > -50) {
			t.push("greeting you fearfully");
		} else {
			t.push("struggling to greet you through their terror");
		}
		t.push("as they pass. Busy, you spare few of them more than a glance.");
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`One of them slows as ${he} goes by, however. Looking up, you see that it's`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), "."));
		if (canTalk(eventSlave)) {
			if (eventSlave.belly >= 1500) {
				t.push(`"Hi ${Master}," ${he} ${say}s flirtatiously rubbing a hand across ${his} ${belly} ${eventSlave.bellyPreg > 0 ? "pregnancy" : "belly"}.`);
			} else {
				t.push(`"Hi ${Master}," ${he} ${say}s flirtatiously.`);
			}
			t.push(Spoken(eventSlave, `"That looks like a really comfortable seat. Can I sit down and rest ${eventSlave.belly >= 10000 ? "my tired legs" : ""} for a little while?"`));
		} else {
			t.push(`${He} greets you properly, but adds a flirtiness to ${his} gestures, and asks if ${he} can sit down and rest`);
			if (eventSlave.belly >= 10000) {
				t.push(`${his} ${eventSlave.bellyPreg > 0 ? "gravid" : belly} bulk`);
			}
			t.push("on the comfortable seat for a little while.");
		}
		t.push(`${He} is not pointing at the soft leather cushion next to you: ${he}'s pointing at your crotch.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`You're nude, a consequence of ${V.ConcubineID !== 0 && V.ConcubineID !== eventSlave.ID ? `recent activities involving ${contextualIntro(V.PC, S.Concubine)}` : "recent unrelated activities"}. ${PC.dick !== 0 ? "Your formidable dick is three quarters hard," : "Nude, that is, all except for the strap-on you were just using and haven't taken off yet,"} and ${eventSlave.slaveName} is pointing right at it. ${He} knows exactly what ${he}'s asking for and gives ${his}`);
		if (eventSlave.hips > 0) {
			t.push("broad");
		} else if (eventSlave.hips > -1) {
			t.push("trim");
		} else {
			t.push("narrow");
		}
		t.push("hips a little wiggle to make it even more abundantly clear.");
		if (eventSlave.chastityPenis === 1) {
			t.push(`${His} poor dick is visibly straining against the restrictive chastity belt ${he}'s wearing.`);
		} else if (canAchieveErection(eventSlave)) {
			t.push(`${His} ${dickSize} dick is jutting out stiffly and there's a bead of precum ${eventSlave.foreskin === 0 ? "forming at its smooth tip" : `escaping from ${his} foreskin`}.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${His} ${dickSize} dick is as soft as ever, but there's a string of precum running between ${eventSlave.foreskin === 0 ? "its smooth tip" : "the soft foreskin that completely covers its tip"} and ${his} inner thigh.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${His} ${eventSlave.clit > 1 ? "formidable" : "big"} clit is visibly erect. ${eventSlave.piercing.genitals.weight > 1 ? `${His} sizable clit piercing never lets its hood completely cover hide ${his} bitch button, but it's completely retracted now,` : `${His} delicate clitoral hood has been pushed back by ${his} female erection,`} leaving ${him} proudly aroused.`);
		} else if (eventSlave.labia > 0) {
			t.push(`${His} ${eventSlave.labia > 1 ? "dangling" : "thick"} labia are visibly swollen, flushing and growing prouder as the blood rushes to ${his} womanhood.`);
		} else if (eventSlave.vagina === -1) {
			t.push(`Since ${he}'s featureless in front, ${he} makes a little half turn to the side, making it very clear that ${his} asspussy needs fucking.`);
		} else {
			t.push(`${He} has a shapely womanhood, with trim labia and a demure clit, but it's a little flushed.`);
		}
		t.push(`${(eventSlave.vaginaLube > 0 && eventSlave.vagina > -1) ? `${His} wet cunt is already lubricating itself generously for you, slicking ${his} labia with female arousal.` : ""} The slutty ${desc} wants it badly.`);

		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} do what ${he} wants`, permit),
			new App.Events.Result(`Have ${him} service you while you work`, service),
			new App.Events.Result(`Drive ${him} off for breaking in on your work`, spank)
		]);

		function permit() {
			const frag = document.createDocumentFragment();
			t = [];

			t.push(`You tell ${him} to sit down if ${he}'d like to. ${He} looks at you quizzically, ${eventSlave.intelligence + eventSlave.intelligenceImplant < -15 ? `${his} dim mind slowly` : ""} realizing that you're letting ${him} choose what to do. ${canTalk(eventSlave) ? `"Oh, thank you, ${Master}," ${he} ${say}s,` : `${He} gestures ${his} thanks,`} and then makes a show of deciding. ${He} ${eventSlave.intelligence + eventSlave.intelligenceImplant < -15 ? "doesn't have to pretend" : "cheekily pretends"} to be an airheaded bimbo puzzling over how ${he} wants to approach a fuck, bouncing`);
			if ((eventSlave.boobsImplant / eventSlave.boobs) >= 0.60) {
				t.push(`${his} fake tits a little,`);
			} else if (eventSlave.boobs > 4000) {
				t.push(`${his} monstrous udders heavily,`);
			} else if (eventSlave.boobs > 1000) {
				t.push(`${his} heavy breasts a little,`);
			} else if (eventSlave.boobs > 300) {
				t.push(`${his} boobs a little,`);
			} else {
				t.push(`on ${his} heels,`);
			}
			if (eventSlave.belly >= 5000) {
				t.push(`rocking ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					t.push("baby bump");
				} else if (eventSlave.bellyImplant >= 3000) {
					t.push("implant-filled belly");
				} else {
					t.push(`${eventSlave.inflationType}-filled belly`);
				}
				t.push("side to side seductively");
			} else {
				t.push(`wiggling ${his} rear side to side alluringly`);
			}
			t.push(`and putting a finger to ${his} slightly parted lips as ${he} stares down at your ${PC.dick !== 0 ? "stiff prick" : "strap-on"}.`);
			App.Events.addParagraph(frag, t);
			t = [];

			if (eventSlave.fetishKnown === 1 && eventSlave.fetish !== "none") {
				t.push(`Finally making ${his} decision, ${he}`);
				switch (eventSlave.fetish) {
					case "submissive":
						t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`letting ${his} weight slide it inside ${his} wet pussy.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`letting ${his} weight push it up ${his} asshole.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`putting it between ${his} thighs.`);
						}
						t.push(`${He}'s not used to being on top, but ${he} uses ${himself} to service you as submissively as ${he} can. ${He} pays ${his} own pleasure no attention at all,`);
						break;
					case "cumslut":
						t.push(`squats down, coming face to face with ${PC.dick !== 0 ? "your cock" : "the phallus"}.`);
						if (canTalk(eventSlave)) {
							t.push(
								Spoken(eventSlave, `"${Master}, I changed my mind about sitting,"`),
								`${he} ${say}s,`
							);
						} else {
							t.push(`${He} gestures that ${he} changed ${his} mind about sitting,`);
						}
						t.push(`and licks ${his} lips sluttily. Then ${he} gives ${PC.dick !== 0 ? "you" : "the phallus"} a lusty blowjob, humming and licking happily. ${He} ${PC.dick !== 0 ? "swallows your load hungrily" : "helps you out of the harness with your permission and eats you out too"},`);
						seX(eventSlave, "oral", PC, "penetrative");
						break;
					case "humiliation":
						t.push(`turns around and sits on ${PC.dick !== 0 ? "your cock" : "the phallus"}, leaning back against you and making sure all the other slaves who pass by can see`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`where it penetrates ${his} cunt.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`where it's lodged up ${his} butt.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`where it's rubbing ${him} intimately between ${his} thighs.`);
						}
						t.push(`${He} gets off on their looks,`);
						break;
					case "buttslut":
						if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`turns around and shivers with pleasure as ${he} hilts ${his} anal sphincter around the base of ${PC.dick !== 0 ? "your cock" : "the phallus"}. ${He} bounces on it happily, reaming ${his} own ass,`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`turns around and shivers with pleasure as ${he} feels ${PC.dick !== 0 ? "your cock" : "the phallus"} slip between ${his} buttcheeks. ${He} rubs against it, happy to share ${his} butt with you,`);
						}
						break;
					case "boobs":
						t.push(`squats down, placing ${PC.dick !== 0 ? "your cock" : "the phallus"}`);
						if (eventSlave.boobs > 4000) {
							t.push(`in the virtual hole formed in the place between ${his} breasts, which are so massive they rest together.`);
						} else if (eventSlave.boobs > 1000) {
							t.push(`in the valley between ${his} tits.`);
						} else if (eventSlave.boobs > 300) {
							t.push(`between ${his} breasts.`);
						} else {
							t.push(`against one of ${his} nipples.`);
						}
						if (canTalk(eventSlave)) {
							t.push(
								Spoken(eventSlave, `"${Master}, I changed my mind about sitting,"`),
								`${he} ${say}s,`
							);
						} else {
							t.push(`${He} gestures that ${he} changed ${his} mind about sitting,`);
						}
						t.push(`and starts giving you a boob job. ${He} enjoys the breast play,`);

						seX(eventSlave, "mammary", PC, "penetrative");
						break;
					case "pregnancy":
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`turns around and lovingly lowers ${his} pussy onto you.`);
							if (PC.dick !== 0) {
								if (eventSlave.pregKnown === 1) {
									t.push(`${He}'s already pregnant, so this isn't a direct satisfaction of ${his} impregnation fetish, but being fucked while pregnant is almost as good as far as ${he}'s concerned.`);
								} else if (canGetPregnant(eventSlave)) {
									t.push(`This might be the moment ${he} gets pregnant, and ${he}'s quivering with anticipations.`);
								} else {
									t.push(`${He} knows ${he} isn't fertile, but ${he}'s good at fantasizing.`);
								}
							} else {
								t.push(`Your strap-on might not be able to impregnate anyone, but ${he}'s good at fantasizing.`);
							}
							t.push(`${He} rides you hungrily,`);

							t.push(VCheck.Vaginal(eventSlave, 1));
							if (canImpreg(eventSlave, PC)) {
								knockMeUp(eventSlave, 40, 0, -1);
							}
						} else {
							t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"}, putting it between ${his} thighs. ${He} rides you caringly,`);
						}
						break;
					case "dom":
						t.push(`turns around and sits right down on ${PC.dick !== 0 ? "your cock" : "the phallus"}, eagerly`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`taking it into ${his} cunt.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`getting it shoved up ${his} butt.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`squeezing it between ${his} thighs.`);
						}
						t.push(`${He} loves being on top, even if ${he}'s the one who's getting fucked. ${He} rides you happily,`);
						break;
					case "sadist":
						t.push(`turns around and hesitantly sits on ${PC.dick !== 0 ? "your cock" : "the phallus"}, letting`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`it slide into ${his} cunt.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`it slide up ${his} butt.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`it slide between ${his} thighs.`);
						}
						t.push(`${He} prefers to be rough, but settles for just directing how ${he} gets used. ${He} rides you cautiously,`);
						break;
					case "masochist":
						t.push(`turns around and carefully perches ${himself} on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
						if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
							t.push(`letting ${his} weight slide it inside ${his} wet pussy at an uncomfortable angle.`);
							t.push(VCheck.Vaginal(eventSlave, 1));
						} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
							t.push(`letting ${his} weight push it up ${his} asshole at an uncomfortable angle.`);
							t.push(VCheck.Anal(eventSlave, 1));
						} else {
							t.push(`putting it between ${his} thighs at an uncomfortable angle.`);
						}
						t.push(`${He} does ${his} best to please you while making sex as unpleasant as ${he} can for ${himself}. ${He} pays close attention to your comfort versus ${his} own,`);
						break;
				}
				t.push(`and after you've ${PC.dick !== 0 ? "cum" : "climaxed"}, ${he} <span class="mediumaquamarine">thanks you trustingly,</span> happy ${he}'s still allowed a sexy choice with you now and then.`);
			} else {
				t.push(`${eventSlave.fetishKnown === 1 ? `${He} can't really think of how to accommodate the situation to ${his} own preferred approach to sex` : `${He} isn't well versed in how ${his} own sexual needs might fit into the situation`}, so ${he} just services you like a good ${girl}. ${He} turns around and sits on ${PC.dick !== 0 ? "your cock" : "the phallus"},`);
				if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
					t.push(`squatting to bounce ${his} cunt up and down on it.`);
					t.push(VCheck.Vaginal(eventSlave, 1));
				} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
					t.push(`squatting to bounce ${his} butthole up and down on it.`);
					t.push(VCheck.Anal(eventSlave, 1));
				} else {
					t.push(`putting it between ${his} thighs for some intercrural sex, since ${his} ${eventSlave.vagina > -1 ? "holes aren't" : "hole isn't"} appropriate.`);
				}
				t.push(`When ${he}'s gotten you off, ${he} thanks you trustingly. Even though ${he} wasn't able to figure out how to seat ${himself} in a really satisfactorily sexy way, ${he}'s glad you gave ${him} some agency.`);
			}
			App.Events.addParagraph(frag, t);

			eventSlave.trust += 5;

			t = []; /* need to clear the array before returning in this case because otherwise weird things happen */
			return [frag];
		}

		function service() {
			t = [];

			t.push(`You order ${him} to sit on your ${PC.dick !== 0 ? "dick" : "strap-on"} and get you off like a good ${girl}, but not to disturb you while you're working. ${He}`);
			if (canTalk(eventSlave)) {
				t.push(`shuts up immediately,`);
			} else {
				t.push(`obediently drops ${his} ${hasBothArms(eventSlave) ? `hands to ${his} sides and stops communicating with them` : `hand to ${his} side and stops communicating with it`},`);
			}
			t.push(`and approaches you carefully. Meanwhile, you go back to your tablet, ignoring ${him} completely. ${He} gingerly straddles your legs, positioning ${his} intimate areas directly over the pointing head of`);
			if (eventSlave.belly >= 5000) {
				t.push(`${PC.dick !== 0 ? "your erection" : "the phallus"}, all while delicately trying to not bump into you with ${his} ${eventSlave.bellyPreg >= 3000 ? "pregnancy" : "belly"}.`);
			} else {
				t.push(`${PC.dick !== 0 ? "your erection" : "the phallus"}.`);
			}
			t.push(`Deciding that ${he} shouldn't use ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} to guide it, ${he} lowers ${himself} slowly,`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(`breathing a little harder as ${he} feels its head spread ${his} pussylips and then slide inside ${him}.`);
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				t.push(`letting out a breath and relaxing as ${he} feels its head press past ${his} sphincter and then all the way up ${his} butt.`);
				t.push(VCheck.Anal(eventSlave, 1));
			} else {
				t.push(`getting it situated between ${his} thighs, since that's the best option ${he} has available.`);
			}
			t.push(`${eventSlave.belly >= 5000 ? `Before starting to pleasure you, ${he} notices there is no way ${he} can move with ${his} rounded middle sticking out as far as it does. ${He} carefully turns around, feeling your glare on ${his} back at ${his} mistake.` : ""} Still crouched over you, ${he} begins to move up and down, milking ${PC.dick !== 0 ? "your penis" : "the strap-on"}. As ${he} works into it, ${he} lets ${his} butt touch you, just once, but you make a nonverbal sound of disapproval, letting ${him} know not to disturb your work like that. Realizing that ${he} needs to play the human sex toy, ${he}`);
			if (eventSlave.butt > 12) {
				t.push(`grabs ${his} massive buttocks and finds that there is no way ${he} can keep the expanses of flesh from enveloping your lap.`);
			} else if (eventSlave.butt > 5) {
				t.push(`grabs ${his} huge buttocks and holds them apart, doing ${his} best to keep them out of the way.`);
			} else if (eventSlave.butt > 2) {
				t.push(`takes hold of ${his} healthy asscheeks and spreads them as far as they'll go, doing ${his} best to keep them out of the way.`);
			} else {
				t.push(`uses ${his} arms for balance, since ${his} cute butt can stay out of the way on its own and doesn't need to be spread by hand.`);
			}
			if (eventSlave.belly >= 10000) {
				t.push(`You spread your legs as you shift into a more comfortable position, stealthily showing mercy since ${he} can't possibly keep ${his} ${eventSlave.bellyPreg >= 3000 ? "full-term" : belly} belly off you otherwise.`);
			}
			t.push(`${He} bobs up and down, getting you off without ever touching you${PC.dick !== 0 ? `, other than the contact between your penis and the inside of ${his} body, of course` : ""}.`);
			if (eventSlave.energy > 80) {
				t.push(`${He} has such a powerful sex drive that even this sterile intercourse brings ${him} to orgasm.`);
			} else if (!App.Utils.hasNonassignmentSex(eventSlave)) {
				t.push(`${He} obeys the rules about orgasm and hasn't gotten off as part of ${his} assignment recently, so ${he} orgasms despite the sterility of the intercourse.`);
			} else {
				t.push(`${He} does not orgasm, serving you properly and showing appropriate disregard for ${his} own pleasure.`);
			}
			t.push(`When ${he}'s done, ${he} makes the perfect exit, <span class="hotpink">silently padding away like the passive sex object ${he} is.</span>`);

			eventSlave.devotion += 5;
			return t;
		}

		function spank() {
			t = [];

			t.push(`You command ${him} to turn around and show you ${his} ass. ${He} obeys eagerly, spinning and bringing you face to face with ${his}`);
			if (eventSlave.butt > 12) {
				t.push("view filling rear.");
			} else if (eventSlave.butt > 5) {
				t.push("monstrous bottom.");
			} else if (eventSlave.butt > 2) {
				t.push("womanly butt.");
			} else {
				t.push("cute little rear end.");
			}
			t.push(`${He}'s expecting something sexy, and ${he}'s wrong. You give ${his} right asscheek a stinging, open-handed slap. It's so unexpected that ${he} jumps with surprise, takes a step forward, and instantly bursts into tears. Knowing that ${he} has to accept whatever you think ${he} deserves, ${he} takes a step back towards you to come back within range.`);
			if (canTalk(eventSlave)) {
				t.push(
					`${Master}, I'm s-sorry,"`,
					`${he} sobs.`,
					`"I d-don't understand. What did I d-do?"`
				);
			} else {
				t.push(`${He} shakily gestures a question, begging to know what ${he} did.`);
			}
			t.push(`You tell ${him} not to disturb you when you're working, tanning ${his} ass viciously, first one buttock and then the other. ${He} stands there and takes ${his} beating, weeping, more from the bitter disappointment that ${he}'s not allowed to approach you like that.`);

			eventSlave.trust -= 5;
			return t;
		}
	}
};


code:
App.Events.RESSCoolerLockin = class RESSCoolerLockin 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,
				canWalk,
				canHear,
				canSee,
				s => s.devotion <= 95,
				s => [Job.QUARTER, Job.HOUSE].includes(s.assignment),
				s => s.intelligence + s.intelligenceImplant < -50,
			]
		];
	}

	execute(node) {
		const [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {heA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const {title: Master, say} = getEnunciation(eventSlave);
		const belly = bellyAdjective(eventSlave);

		App.Events.drawEventArt(node, eventSlave);

		let r = [];
		r.push(`You're circulating in ${V.clubName}, looking over your holdings but mostly just letting yourself be seen, when your personal assistant quietly alerts you.`);
		if (V.assistant.personality <= 0) {
			r.push(`"${properTitle()},"`);
		} else {
			r.push(`"Baby,"`);
		}
		r.push(`${heA} says,"`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`can't get out of the refrigerator."`);
		if (V.assistant.personality <= 0) {
			r.push(`The personal assistant explains the absurd statement: "${He}'s been assigned to get some items out of the walk-in refrigerator. ${He} accidentally let the door shut behind ${him}, didn't notice, took too long in there, and is now too chilled to figure out the emergency release. I can unlock it remotely, or you can let ${him} out yourself."`);
		} else {
			r.push(`Chuckling, your personal assistant explains the absurd statement: "The silly ${girl}'s been assigned to get some things out of the walk-in refrigerator. ${He} accidentally let the door shut behind ${him}, didn't notice, took too long in there, and is now too chilled to figure out the emergency release. I can unlock it remotely, or you can head over and have some fun with ${him}."`);
		}
		App.Events.addParagraph(node, r);
		App.Events.addParagraph(node, [`The walk-in cooling unit is designed for the refrigeration of food for you and guests only, since the slaves drink a nutritive fluid that doesn't require it. Only servants ever have any reason to be in there, but ${he} was indeed instructed to fetch out some beverages necessary for an entertainment you have planned. It's cool in there, but not freezing, so ${he}'s in no immediate danger.`]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Just direct ${V.assistant.name} to let ${him} out`, direct),
			new App.Events.Result(`Let ${him} out yourself`, yourself),
			new App.Events.Result(`Punish ${him} for ${his} forgetfulness`, punish, virginityWarning()),
		]);

		function direct() {
			r = [];
			r.push(`${capFirstChar(V.assistant.name)} unlatches the cooler door remotely, and admonishes ${eventSlave.slaveName}. The chilled slave scampers out of the cold air, rubbing ${his}`);
			if (eventSlave.bellyPreg >= 1500) {
				r.push(`${belly} pregnant belly's`);
			}
			r.push(`${eventSlave.skin} skin to get some warmth back into it. ${He}'s too cold to do much more than nod dumbly at ${V.assistant.name}'s review of how to operate the release, but ${he}'s much more careful the next time ${he}'s sent in there.`);
			return r;
		}

		function yourself() {
			r = [];
			r.push(`You're not close to the penthouse kitchen area, so it takes you some time to make your way there. By the time you get there, the poor ${girl} is pounding weakly against the refrigerator door to try to get someone's attention. ${capFirstChar(V.assistant.name)} was right, ${he} must be too cold to think straight; if ${he} weren't ${he} might notice the prominent release button right next to where ${he}'s striking the door. ${His} desperate ${eventSlave.skin} face is visible in the window. You hit the exterior release and the door swings open quickly, dumping ${him} into your arms.`);
			if (eventSlave.devotion < -50) {
				r.push(`Despite hating you, <span class="devotion inc">${he} clings to you like a long lost love,</span> ${his}`);
				eventSlave.devotion += 6;
			} else if (eventSlave.devotion <= 20) {
				r.push(`Despite not being devoted to you, <span class="devotion inc">${he} clings to you like a long lost love,</span> ${his}`);
				eventSlave.devotion += 4;
			} else {
				r.push(`${He} clings to ${his} savior, ${his}`);
			}
			if (eventSlave.height >= 185) {
				r.push(`big cold`);
			} else if (eventSlave.height >= 160) {
				r.push(`cold`);
			} else {
				r.push(`cold little`);
			}
			if (eventSlave.belly >= 1500) {
				r.push(belly);
				if (eventSlave.bellyPreg >= 1500) {
					r.push(`pregnant`);
				}
			}
			r.push(`body shaking convulsively. ${He} tries to burrow even`);
			if (V.PC.boobs >= 650) {
				r.push(`deeper between your breasts,`);
			} else {
				r.push(`closer to you,`);
			}
			r.push(`soaking up your warmth.`);
			if (!canTalk(eventSlave)) {
				r.push(`${He} gestures ${his} thanks shakily.`);
			} else {
				r.push(
					Spoken(eventSlave, `"T-t-thank y-you, ${Master}. I d-don't know what would have hap-p-pened if you hadn't come by,"`),
					`${he} ${say}s, teeth chattering.`
				);
			}
			r.push(`${He} clearly has no idea whatsoever that ${V.assistant.name} could have let ${him} out at any time. You rub your hands up and down ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`back, helping ${him} get warm. You point out the release handle and ${he} apologizes hastily for forgetting. Once ${he}'s warm you gently tell ${him} to get back to it, and give ${him} a gentle shove on ${his}`);
			if (eventSlave.butt > 5) {
				r.push(`massive ass.`);
			} else if (eventSlave.butt > 2) {
				r.push(`big butt.`);
			} else {
				r.push(`nice little butt.`);
			}
			r.push(`${He} <span class="trust inc">smiles gratefully</span> at you before heading back to get those drinks.`);
			eventSlave.trust += 4;
			return r;
		}

		function punish() {
			r = [];
			r.push(`You're not close to the penthouse kitchen area, so it takes you some time to make your way there. By the time you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`get there, the poor`);
			if (eventSlave.pregKnown === 1) {
				r.push(`pregnant`);
			}
			r.push(`${girl} is pounding weakly against the refrigerator door to try to get someone's attention. ${He} looks relieved when you open the door, but ${his} relief turns to ashes when you shut the door behind you. ${He} shivers with cold and fear as you sternly point out the release, high up on the door, and then demand ${his}`);
			if (hasBothArms(eventSlave)) {
				r.push(`hands. You bind them together and loop them over the release before hoisting ${his} legs off the ground so that ${his} back is against the cold metal door and all ${his} weight is hanging off the release by ${his} arms.`);
			} else {
				r.push(`hand. You bind it tightly and loop it over the release before hoisting ${his} legs off the ground so that ${his} back is against the cold metal door and all ${his} weight is hanging off the release by ${his} arm.`);
			}
			r.push(`${He} doesn't struggle until you tell ${him} ${he} can leave — if ${he} can get the release open like this. ${He} tries, but ${he} can't get enough leverage;`);
			if (canDoVaginal(eventSlave) || canDoAnal(eventSlave)) {
				r.push(`${his} spastic efforts get weaker as you pull ${his}`);
				if (eventSlave.butt > 5) {
					r.push(`massive ass`);
				} else if (eventSlave.butt > 2) {
					r.push(`big butt`);
				} else {
					r.push(`nice little butt`);
				}
				r.push(`away from the door and line`);
				if (V.PC.dick === 0) {
					r.push(`the strap-on`);
				} else {
					r.push(`your cock`);
				}
				r.push(`up with ${his}`);
				if (canDoVaginal(eventSlave)) {
					if (eventSlave.vagina > 2) {
						r.push(`loose pussy.`);
					} else if (eventSlave.vagina > 1) {
						r.push(`pussy.`);
					} else {
						r.push(`tight pussy.`);
					}
					VCheck.Vaginal(eventSlave, 1);
				} else {
					if (eventSlave.anus > 2) {
						r.push(`loose asspussy.`);
					} else if (eventSlave.anus > 1) {
						r.push(`asshole.`);
					} else {
						r.push(`tight little asshole.`);
					}
					VCheck.Anal(eventSlave, 1);
				}
				r.push(`Teeth chattering, legs shaking with cold, ${he} takes a ${!canDoVaginal(eventSlave) ? "butt" : ""}fuck in the cold cooler, hanging from what ${he} should have used to let ${himself} out.`);
			} else if (V.PC.dick === 0) {
				r.push(`${his} spastic efforts get weaker as you poke and prod ${his} sensitive areas with your strap-on. Teeth chattering, legs shaking with cold, ${he} takes your molestation in the cold cooler, hanging from what ${he} should have used to let ${himself} out.`);
			} else {
				r.push(`${his} spastic efforts get weaker when you take your dick in hand and warm yourself to a throbbing erection. Teeth chattering, legs shaking with cold, ${he} takes your load in the cold cooler, hanging from what ${he} should have used to let ${himself} out.`);
			}
			r.push(`When you finish, you hit it yourself and drop ${his} legs, letting ${him} unhook ${himself} and flee to the warmth outside. ${He} begs your pardon abjectly as ${he} rubs ${his}`);
			if (eventSlave.belly >= 5000) {
				r.push(`${belly} ${eventSlave.skin} belly`);
			} else {
				r.push(`${eventSlave.skin} shoulders`);
			}
			r.push(`to warm ${himself}`);
			if (V.PC.dick > 0) {
				r.push(`up, ignoring the cum`);
				if (canDoVaginal(eventSlave)) {
					if (eventSlave.vagina > 2) {
						r.push(`leaking out of ${his} broken-in vagina.`);
					} else if (eventSlave.vagina > 1) {
						r.push(`leaking out of ${his} parted vagina.`);
					} else {
						r.push(`filling ${his} still-tight vagina.`);
					}
				} else if (canDoAnal(eventSlave)) {
					if (eventSlave.anus > 2) {
						r.push(`leaking out of ${his} fucked-out anus.`);
					} else if (eventSlave.anus > 1) {
						r.push(`leaking out of ${his} now-gaped backdoor.`);
					} else {
						r.push(`filling ${his} still-tight anus.`);
					}
				} else {
					r.push(`dripping down ${his} body.`);
				}
			} else {
				r.push(`up.`);
			}
			eventSlave.trust -= 5;
			return r;
		}

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


code:
App.Events.RESSDevotedEducated = class RESSDevotedEducated extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => (canWalk(s) || (canMove(s) && s.rules.mobility === "permissive")),
				hasAnyArms,
				canTalk,
				s => s.devotion > 50,
				s => s.intelligence + s.intelligenceImplant > 50,
				s => s.intelligenceImplant >= 15,
				s => s.accent < 4
			]
		];
	}

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

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

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`comes before you for a routine inspection. The ${desc} is a well-educated and obedient slave. Though ${he} performs ${his} duties devotedly and to the best of ${his} abilities, slave life is not particularly conducive to straining an individual's brainpower. You happen to run into ${eventSlave.slaveName} in the hallways of the penthouse, where ${he} takes the opportunity to wordlessly signal ${he} wishes to gain your attention.`);
		if (canTalk(eventSlave)) {
			t.push(`"${Master}," ${he} ${say}s. "${Spoken(eventSlave, `I really enjoy my role as your slave, but I just don't feel like my new life stimulates me.`)}" ${He} blushes prettily at ${his} choice of words before continuing, "${Spoken(eventSlave, `Stimulate my mind, I mean.`)}"`);
		} else {
			t.push(`${He} uses gestures to beg your pardon and explains that while ${he} enjoys life as your slave, ${he} doesn't feel like ${his} new role in your arcology allows ${him} to stimulate ${his} mind as often as it does ${his} body.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Have a conversation with ${him}`, conversation),
			canDoAnal(eventSlave) || canDoVaginal(eventSlave)
				? new App.Events.Result(`Stimulate ${his} mind and body`, stimulate, virginityCheck())
				: new App.Events.Result(),
			V.arcologies[0].FSDegradationist !== "unset"
				? new App.Events.Result(`A public blowbang will show ${him} what a Degradationist arcology thinks about 'educated' slaves`, blowbang)
				: new App.Events.Result(),
			V.arcologies[0].FSPaternalist !== "unset"
				? new App.Events.Result(`Allow ${him} to audit some advanced classes at Paternalist slave schools`, schooling)
				: new App.Events.Result()
		]);

		function conversation() {
			t = [];

			t.push(`You linger in the hallway a while with ${eventSlave.slaveName} and enjoy a brief but verbose discussion. It's clear ${he} hasn't had the chance to engage in any meaningful conversations in a while, so ${he} relishes the opportunity energetically.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`Though the two of you only touch upon a handful of sophisticated topics, by the time you leave ${him} to tend to other matters, ${eventSlave.slaveName} is beaming happily as ${he} continues on to ${his} duties for the day. ${He} trusts you more for taking the time to engage with ${him} intellectually.`);
			App.Events.addParagraph(node, t);
			t = [];

			eventSlave.trust += 4;
			return t;
		}

		function stimulate() {
			t = [];

			t.push(`You find a comfortable seat to sit on ${PC.dick === 0 ? "and don a strap-on" : ""} as ${he} seats ${his}`);
			if (eventSlave.butt < 2) {
				t.push(`narrow`);
			} else if (eventSlave.butt < 5) {
				t.push(`average`);
			} else if (eventSlave.butt < 8) {
				t.push(`plump`);
			} else if (eventSlave.butt < 12) {
				t.push(`impressive`);
			} else {
				t.push(`mind-blowing`);
			}
			t.push(`ass on your ${PC.dick === 0 ? "strap-on" : "dick"} and rides you. While your cock plumbs the depths of ${his} ${canDoVaginal(eventSlave) ? "pussy" : "butt"}, the two of you engage in a casual debate over a number of topics of sophistry.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`At the crux of one of ${his} concluding arguments, the intense pleasure from the prolonged ${canDoVaginal(eventSlave) ? "fucking" : "buttfucking"} pushes ${him} over the edge into orgasm, robbing the thrust of ${his} defense of any gravitas it once had. ${He} doesn't seem to mind however, choosing to instead wrap up ${his} remarks by blowing you a kiss.`);
			if (canDoVaginal(eventSlave)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			App.Events.addParagraph(node, t);
			t = [];

			eventSlave.devotion += 4;
			return t;
		}

		function blowbang() {
			t = [];

			t.push(`You tell ${him} ${he}'ll get fucked in the mouth until ${he} either gets over the idea of being special for ${his} education or until all ${his} learning is fucked out of ${his} head. You drag the protesting ${eventSlave.slaveName} out into a public plaza, restrain ${him} in stocks so that ${his} mouth is available, and inform the gathering crowd of citizens that this particular slave thinks ${himself} more than a fuckhole because of some fancy 'education'.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`When you return later in the evening, it becomes abundantly clear that your citizenry taught ${eventSlave.slaveName} a harsh lesson about a slave's place in ${V.arcologies[0].name}. ${eventSlave.slaveName} has certainly learned to keep any pretentious thoughts about ${his} education in ${his} head. ${He} did, however, have quite a rough time sucking all those dicks${eventSlave.skill.oral <= 30 ? `, though ${he} did learn about sucking dick, so ${he} can't claim enslavement isn't educational. ${slaveSkillIncrease('oral', eventSlave, 10)}` : "."} And last of all, you and ${eventSlave.slaveName} did make quite a good impression today, though for widely differing reasons.`);
			App.Events.addParagraph(node, t);
			t = [];

			seX(eventSlave, "oral", "public", "penetrative", jsRandom(65, 80));
			repX(500, "event", eventSlave);
			healthDamage(eventSlave, 10);
			return t;
		}

		function schooling() {
			t = [];

			t.push(`You tell ${him} to take the day off for a trip to audit classes at ${V.arcologies[0].name}'s most renowned Paternalist slave schools. ${eventSlave.slaveName} is shocked into a reverie by your words before running to wrap ${his} ${hasBothArms(eventSlave) ? "arms" : "arm"} around you in a tight hug. When ${he} eventually untangles ${himself} from you, ${he} races off to get ready for ${his} day of intellectualism while you direct ${V.assistant.name} to make the necessary arrangements.`);
			App.Events.addParagraph(node, t);
			t = [];

			t.push(`When ${eventSlave.slaveName} returns, ${he} looks exhausted but happier than you've ever seen ${him}. It seems ${he} benefited greatly from ${V.arcologies[0].name}'s Paternalist institutions, and has grown to trust you more while also deepening ${his} acceptance of slavery.`);
			App.Events.addParagraph(node, t);
			t = [];

			eventSlave.trust += 4;
			eventSlave.devotion += 4;
			return t;
		}

		function virginityCheck() {
			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`;
			}
		}
	}
};