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

	actorPrerequisites() {
		return [
			[ // event slave /domslave
				s => s.fetish !== "mindbroken",
				canMove,
				canTalk,
				s => s.devotion > 20,
				s => s.dietCum > 0 || (s.fetishKnown && s.fetish === "cumslut"),
				s => s.belly < 60000,
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				s => (s.assignment === Job.DAIRY || s.assignment === Job.MILKED),
				isSlaveAvailable,
				canMove,
				s => s.dick !== 0,
				s => s.balls !== 0,
				s => s.vasectomy === 0,
				s => s.ballType === "human",
				s => s.belly < 150000,
				s => ((canDoVaginal(s) && s.vagina > 0) || (canDoAnal(s) && s.anus > 0)),
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [slave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, His
		} = getPronouns(slave);
		const {say} = getEnunciation(slave);
		const doVaginal = (canDoVaginal(subSlave) && subSlave.vagina > 0);
		const doAnal = (canDoAnal(subSlave) && subSlave.anus > 0);
		const hands = hasBothArms(slave) ? "hands" : "hand";
		const {He2, he2, His2, his2, him2, girl2} = getPronouns(subSlave).appendSuffix("2");

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

		let t = [];
		t.push(`Early in the morning, you run across`, contextualIntro(V.PC, subSlave, true), `using one of the penthouse milking machines. This isn't surprising;`);
		if (subSlave.lactation === 0) {
			t.push(`${he2}'s not lactating, but ${he2}'s a good semen producer and when ${he2} wakes up, ${he2}'s usually very ready to have one of the machines drain ${his2} balls for ${him2}.`);
		} else {
			if (subSlave.preg > subSlave.pregData.normalBirth / 1.33) {
				t.push(`it's late in ${his2} pregnancy and ${he2} wakes up every day with ${his2} ${subSlave.boobShape} breasts sore, painfully swollen with rich, nutritious milk.`);
			} else if (subSlave.preg > subSlave.pregData.normalBirth / 2) {
				t.push(`${he2}'s pregnant and ${he2} wakes up every day with ${his2} ${subSlave.boobShape} breasts sore and swollen with rich, nutritious milk.`);
			} else if (subSlave.lactation > 1) {
				t.push(`the tiny little slow-release implant in each of ${his2} breasts is merciless. It keeps ${his2} mammary glands in a permanent state of barely-safe hyperproduction, and ${he2} wakes up every day with ${his2} terribly sore breasts spontaneously dribbling milk.`);
			} else {
				t.push(`${his2} lactation is natural, but it's still enough that ${he2} wakes up most days with full, sore breasts.`);
			}
			t.push(`But ${his2} udders aren't the only thing producing creamy liquid.`);
			if ((doAnal || doVaginal) && subSlave.prostate > 0) {
				t.push(`The machine is applying generous prostate stimulation to drain ${his2} balls, too.`);
			}
			subSlave.lactationDuration = 2;
			subSlave.boobs -= subSlave.boobsMilk;
			subSlave.boobsMilk = 0;
		}
		t.push(`But the cum is about to be intercepted. There's another slave lying on the floor under ${subSlave.slaveName}, intertwined with the`);
		if (subSlave.lactation === 0) {
			t.push(`machine; its cum receptacle lying unused.`);
		} else {
			t.push(`machine. The nipple milkers are attached to each of the human cow's nipples, and they're pumping away industriously, keeping the clear lines running away from each udder white with cream. On the other hand, the cum receptacle is lying unused.`);
		}
		App.Events.addParagraph(node, t);
		t = [];
		t.push(`You can't see much of the slave under ${subSlave.slaveName}, since ${he}'s intimately intertwined with the machine and`);
		if (subSlave.weight > 95) {
			t.push(`${subSlave.slaveName} is a hefty ${girl2},`);
		} else if (subSlave.belly > 30000) {
			t.push(`${subSlave.slaveName}'s middle isn't exactly small,`);
		} else {
			t.push(`with ${subSlave.slaveName},`);
		}
		t.push(`but based on ${his}`);
		if (slave.dick > 0) {
			if (canAchieveErection(slave) && !(slave.chastityPenis)) {
				t.push(`stiff prick,`);
			} else if (slave.chastityPenis === 1) {
				t.push(`uncomfortably filled chastity cage,`);
			} else {
				t.push(`pathetically soft but precum-tipped dick,`);
			}
		}
		if (slave.vagina > 0) {
			if (slave.labia > 0) {
				t.push(`generous pussylips,`);
			} else if (slave.clit > 0) {
				t.push(`visibly stiff clit,`);
			} else {
				t.push(`obviously aroused womanhood,`);
			}
		}
		if (slave.dick === 0) {
			if (slave.vagina === -1) {
				if (slave.scrotum > 0) {
					t.push(`lonely ballsack,`);
				} else {
					t.push(`smoothly featureless groin,`);
				}
			}
		}
		if (slave.weight > 100) {
			t.push(`fat`);
		} else if (slave.muscles > 30) {
			t.push(`muscular`);
		} else if (slave.weight > 30) {
			t.push(`chubby`);
		} else if (slave.muscles > 10) {
			t.push(`toned`);
		} else if (slave.weight > 10) {
			t.push(`nice soft`);
		} else if (slave.weight >= -10) {
			t.push(`slender`);
		} else {
			t.push(`skinny`);
		}
		t.push(`legs, and ${slave.skin} skin, it's`, App.UI.DOM.combineNodes(contextualIntro(subSlave, slave, true), "."), `${He}'s allowed access to cockmilk and ${he}'s getting it straight from the source. ${subSlave.slaveName}`);
		if (subSlave.dick < 3) {
			t.push(`has a`);
			if (subSlave.dick < 2) {
				t.push(`pathetically tiny penis,`);
			} else {
				t.push(`rather modest cock,`);
			}
			t.push(`so ${slave.slaveName} has ${his} head buried between ${subSlave.slaveName}'s quivering thighs. ${He} isn't sucking ${subSlave.slaveName}'s dick so much as ${he}'s nursing at it, keeping it entirely within ${his} mouth and applying powerful suction.`);
		} else if (subSlave.dick > 8) {
			t.push(`has an inhumanly monstrous penis that the poor slave's cardiovascular system couldn't possibly bring`);
			if (slave.drugs === "priapism agents") {
				t.push(`erect without outside aid; agents like the priapism agents ${he2} is currently on. ${slave.slaveName} has forced as much of its head into ${his} mouth as ${he} can, and is sucking lustily while trying not to choke.`);
			} else {
				t.push(`erect. ${slave.slaveName} has gotten its huge soft head into ${his} mouth, and is sucking lustily.`);
			}
		} else if (!canAchieveErection(subSlave)) {
			t.push(`can't achieve an erection, but ${slave.slaveName} is sucking ${his2} dick anyway. ${He}'s got ${his} mouth full of it, and to go by the flexing of ${his} cheeks, is applying ${his} tongue with gusto.`);
		} else {
			t.push(`is rock hard, of course, and ${slave.slaveName} is giving ${him2} a lusty blowjob, stroking ${his2} head busily back and forth.`);
		}
		t.push(`The milking machine cum receptacle is designed to be warm, wet, and stimulating, but ${subSlave.slaveName} is getting much better attention. ${slave.slaveName} is omitting nothing that could help ${him} extract every last drop of cum.`);
		if (doAnal || doVaginal) {
			t.push(`${He}'s sucking, and the machine is applying direct stimulation to ${subSlave.slaveName}'s`);
			if (subSlave.prostate) {
				t.push(`prostate`);
			} else {
				t.push(`insides`);
			}
			t.push(`with`);
			if (doAnal) {
				actX(subSlave, "anal");
				if (subSlave.anus > 3) {
					t.push(`a big vibrating dildo that comfortably fills ${his2} experienced anus,`);
				} else if (subSlave.anus > 2) {
					t.push(`a vibrating dildo that ${his2} soft asshole can take comfortably,`);
				} else {
					t.push(`a little vibrator that fits comfortably up ${his2} tight ass,`);
				}
			} else {
				actX(subSlave, "vaginal");
				if (subSlave.vagina > 3) {
					t.push(`a big vibrating dildo that comfortably fills ${his2} mature pussy,`);
				} else if (subSlave.vagina > 2) {
					t.push(`a vibrating dildo that ${his2} fits ${his2} pussy perfectly,`);
				} else {
					t.push(`a vibrating dildo that fills ${his2} tight little pussy,`);
				}
			}
			if (hasAnyArms(slave)) {
				if (subSlave.dick < 3) {
					t.push(`giving ${slave.slaveName} limited options to further stimulate the poorly-endowed slave. ${He}'s using one hand to`);
					if (doAnal && doVaginal) {
						seX(subSlave, "vaginal", slave, "penetrative");
						if (subSlave.vagina > 3) {
							t.push(`fist ${his2} mature vagina.`);
						} else if (subSlave.vagina > 2) {
							t.push(`penetrate ${his2} pussy.`);
						} else {
							t.push(`finger ${his2} tight pussy.`);
						}
					} else {
						t.push(`stroke the soft, precum-slick skin below ${subSlave.slaveName}'s anus.`);
					}
				} else if (subSlave.dick > 8) {
					t.push(`so ${slave.slaveName} has one hand wrapped around the gigantic soft python of flesh between ${subSlave.slaveName}'s legs, and is squeezing it rhythmically from its base up to where its head enters ${his} wet lips.`);
				} else if (!canAchieveErection(subSlave)) {
					t.push(`so, since ${slave.slaveName} can't jack off a soft shaft, ${he}'s using one hand to`);
					if (doAnal && doVaginal) {
						seX(subSlave, "vaginal", slave, "penetrative");
						if (subSlave.vagina > 3) {
							t.push(`fist ${his2} mature vagina.`);
						} else if (subSlave.vagina > 2) {
							t.push(`penetrate ${his2} vagina.`);
						} else {
							t.push(`finger ${his2} tight vagina.`);
						}
					} else {
						t.push(`stroke the soft, precum-slick skin below ${subSlave.slaveName}'s anus.`);
					}
				} else {
					t.push(`so ${he} uses one hand to stroke the hard shaft outside ${his} wet lips, using ${his} saliva and ${subSlave.slaveName}'s precum to perform a messy handjob.`);
				}
			}
		} else if (hasAnyArms(slave)) {
			if (subSlave.dick < 3) {
				t.push(`${He}'s giving ${slave.slaveName} limited options to further stimulate the poorly-endowed slave. ${He}'s using one hand to stroke the soft, precum-slick skin below ${subSlave.slaveName}'s anus.`);
			} else if (subSlave.dick > 8) {
				t.push(`${He} has one hand wrapped around the gigantic soft python of flesh between ${subSlave.slaveName}'s legs, and is squeezing it rhythmically from its base up to where its head enters ${his} wet lips.`);
			} else if (!canAchieveErection(subSlave)) {
				t.push(`Since ${slave.slaveName} can't jack off a soft shaft, ${he}'s using one hand to stroke the soft, precum-slick skin below ${subSlave.slaveName}'s anus.`);
			} else {
				t.push(`${He}'s using one hand to stroke the hard shaft outside ${his} wet lips, using ${his} saliva and ${subSlave.slaveName}'s precum to perform a messy handjob.`);
			}
		}
		if (hasBothArms(slave)) {
			t.push(`${His} other hand is`);
			if (subSlave.scrotum === 0) {
				if (subSlave.balls > 0) {
					if (subSlave.belly > 15000) {
						t.push(`pushing against ${his2} belly in an effort to claim a little more room beneath it.`);
					} else if (subSlave.belly > 1500 || subSlave.weight > 95) {
						t.push(`supporting ${his2} belly to keep it out of the way.`);
					} else {
						t.push(`massaging ${subSlave.slaveName}'s lower belly where ${his2} balls now reside.`);
					}
				} else {
					t.push(`massaging the place where ${subSlave.slaveName}'s scrotum used to be.`);
				}
			} else if (subSlave.scrotum < subSlave.balls) {
				t.push(`gently massaging ${subSlave.slaveName}'s overfilled scrotum, which ${his2} balls fill to the point of discomfort.`);
			} else if (subSlave.scrotum > subSlave.balls+1) {
				t.push(`playing with ${subSlave.slaveName}'s loose scrotum.`);
			} else {
				t.push(`massaging ${subSlave.slaveName}'s balls.`);
			}
		}
		App.Events.addParagraph(node, t);
		t = [];
		t.push(`${subSlave.slaveName} is getting`);
		let orgasmic = [];
		orgasmic.push(`${his2} dick sucked`);
		if (doAnal) {
			orgasmic.push(`${his2} ass fucked`);
			if (doVaginal) {
				orgasmic.push(`${his2} pussy teased`);
			}
		} else if (doVaginal) {
			orgasmic.push(`${his2} pussy fucked`);
		}
		if (subSlave.lactation > 0) {
			orgasmic.push(`${his2} boobs milked`);
		}
		t.push(toSentence(orgasmic) + ".");
		t.push(`${He2}'s so overstimulated that ${he2}'s shaking; a tremendous orgasm is building within ${him2}. ${He2}`);
		if (subSlave.voice !== 0) {
			t.push(`groans,`);
		} else {
			t.push(`makes a harsh rasping noise,`);
		}
		t.push(`which ${slave.slaveName}`);
		if (canHear(slave)) {
			t.push(`hears,`);
		} else {
			t.push(`can feel,`);
		}
		t.push(`and ${subSlave.slaveName} tenses, which ${slave.slaveName} feels in ${his} mouth${hasAnyArms(slave) ? ` and ${hands}` : ""}. Smiling around the penis in ${his} mouth, pleased by the approach of a gush of delectable semen, ${slave.slaveName} hums encouragement into ${subSlave.slaveName}'s`);
		if (canAchieveErection(subSlave)) {
			t.push(`rock-hard`);
		} else {
			t.push(`soft`);
		}
		if (subSlave.scrotum && subSlave.balls) {
			t.push(`dickhead and visibly tickles ${subSlave.slaveName}'s balls with ${his} naughty pink tongue`);
		} else {
			t.push(`dickhead.`);
		}

		seX(slave, "oral", subSlave, "penetrative");

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result("Step in for the stimulator", stimulator),
			subSlave.lactation
				? new App.Events.Result("Make sure the cumslut gets a balanced diet", balanced)
				: new App.Events.Result(),
			(V.PC.dick > 0 && V.PC.balls > 0)
				? new App.Events.Result("Substitute your cum", substitute)
				: new App.Events.Result(),
		]);

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

			t.push(`You command the machine to cease`);
			if (doAnal) {
				if (subSlave.anus < 3 || doVaginal) {
					t.push(`stimulating and leave ${subSlave.slaveName}'s ass alone for now. ${He2}`);
				} else {
					t.push(`stimulating, but leave its dildo where it is, for now. ${subSlave.slaveName}`);
				}
			} else {
				t.push(`stimulating and retract the dildo. ${subSlave.slaveName}`);
			}
			if (subSlave.voice !== 0) {
				t.push(`moans with frustration,`);
			} else {
				t.push(`wriggles uncomfortably,`);
			}
			t.push(`incipient orgasm ruined. Below ${him2}, ${slave.slaveName} makes a whining noise past ${his} mouth full of dick, not understanding what's happened. ${He} makes to start getting out from under ${subSlave.slaveName} and the machine, to investigate, but before ${he} can even put the dick down, ${he}`);
			if (canSee(slave)) {
				t.push(`sees a pair of`);
				if (V.PC.title) {
					t.push(`strong`);
				} else {
					t.push(`feminine`);
				}
				t.push(`hands reach around either side of ${subSlave.slaveName}'s torso and seize hold of ${his2}`);
			} else {
				t.push(`hears a pair of hands slap against the flesh of ${subSlave.slaveName}'s`);
			}
			if (subSlave.lactation === 0) {
				t.push(`milkless breasts.`);
			} else {
				t.push(`milk-filled udders.`);
			}
			t.push(`${slave.slaveName} can't`);
			if (canSee(slave)) {
				t.push(`see who it is,`);
			} else {
				t.push(`see,`);
			}
			t.push(`but ${he} knows it's you.`, Spoken(slave, `"Mhhf, hi, ${getWrittenTitle(slave)},"`), `${he} manages, letting ${subSlave.slaveName}'s`);
			if (canAchieveErection(subSlave)) {
				t.push(`hard cockhead spring free of ${his} mouth with a pop.`);
			} else {
				t.push(`soft dick fall out of ${his} mouth with a wet noise.`);
			}
			t.push(Spoken(slave, `"Should I, um, get out from under here?"`));
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`You order ${him} to stay where ${he} is, and go back to sucking dick.`, Spoken(slave, `"Yes, ${getWrittenTitle(slave)},"`), `${he} giggles, and then shuts up as ${his} mouth is occupied once more. ${subSlave.slaveName}, who's been obediently still under you as ${he2} waits for your pleasure, stiffens as ${he2} feels ${his2} dickhead surrounded by warm wetness once more. ${He2}'s got more coming.`);
			if (doVaginal && doAnal) {
				t.push(`${He2}'s got a cock and two fuckholes, so you instruct the machine to go back to stimulating, and adroitly lift ${his2} hips a little so that when the machine reinserts its stimulator, it penetrates ${his2} vagina and fucks that instead. Then you insert your`);
				if (V.PC.dick) {
					t.push(`cock`);
				} else {
					t.push(`strap-on`);
				}
				t.push(`into ${his2} conveniently pre-fucked ass and start`);
				if (V.PC.dick) {
					t.push(`pounding, feeling the vibration from inside ${his2} pussy on your dick through ${his2} insides`);
				} else {
					t.push("pounding.");
				}
				seX(subSlave, "anal", V.PC, "penetrative");
				actX(subSlave, "vaginal");
				if (canImpreg(slave, V.PC)) {
					knockMeUp(slave, 5, 1, -1);
				}
			} else if (subSlave.anus > 2 && doAnal) {
				t.push(`${His2} ass is so relaxed that your`);
				if (V.PC.dick) {
					t.push(`cock`);
				} else {
					t.push(`strap-on`);
				}
				t.push(`slides in alongside the stimulator without much trouble. Once you're inserted, you instruct the machine to start stimulating again, and mercilessly double penetrate ${his2}`);
				if (V.PC.dick) {
					t.push(`ass, enjoying the vibration against your cock as it slides against the stimulator.`);
				} else {
					t.push(`ass.`);
				}
				seX(subSlave, "anal", V.PC, "penetrative");
				if (canImpreg(slave, V.PC)) {
					knockMeUp(slave, 5, 1, -1);
				}
			} else {
				t.push(`The stimulator is effective enough, but it can't match `);
				if (V.PC.dick) {
					t.push(`a real cock,`);
				} else {
					t.push(`a strap-on wielded by a consummate master of the art,`);
				}
				t.push(`which is of course what ${subSlave.slaveName} has ${doAnal ? `up ${his2} ass` : `hilted in ${him2}`} in short order.`);
				if (doAnal) {
					seX(subSlave, "anal", V.PC, "penetrative");
					if (canImpreg(slave, V.PC)) {
						knockMeUp(slave, 5, 1, -1);
					}
				} else {
					seX(subSlave, "vaginal", V.PC, "penetrative");
					if (canImpreg(slave, V.PC)) {
						knockMeUp(slave, 5, 0, -1);
					}
				}
			}
			t.push(`${He2} was on the edge of orgasm when you stepped in, and this is just too much. ${He2} climaxes with indecent speed, involuntarily humping against the machine, shooting rope after rope of ${his2} cum into ${slave.slaveName}'s`);
			if (V.PC.dick) {
				t.push(`mouth and spasming against your invading penis wonderfully.`);
			} else {
				t.push("mouth.");
			}
			t.push(`You hold the quivering ${subSlave.slaveName} down and keep hammering ${him2} until you're certain ${he2}'s fed ${slave.slaveName} every drop ${he2} has. Then you let ${him2} up.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`As ${subSlave.slaveName} stumbles off, looking <span class="devotion inc">rather submissive,</span> ${slave.slaveName} scoots out from underneath the machine.`);
			t.push(Spoken(slave, `"${getWrittenTitle(slave)},"`), `${he} ${say}s <span class="devotion inc">devotedly,</span>`, Spoken(slave, `"that ${canTaste(slave) ? `tasted` : "was"} incredible. It ${canTaste(slave) ? `tastes` : "feels"} so much better when you fuck it out of ${him2}!"`));
			t.push(`${He}`);
			if (hasAnyArms(slave)) {
				t.push(`rubs ${his}`);
				if (slave.belly >= 5000) {
					t.push(`rounded`);
				}
			} else {
				t.push(`puffs out ${his}`);
				if (slave.belly >= 5000) {
					t.push(`already rounded`);
				}
			}
			t.push(`tummy with exaggerated satisfaction, and then realizes that you weren't fucking for nearly long enough to have gotten off yourself.`);
			if ((slave.lactation || slave.balls) && ((canDoVaginal(slave) && slave.vagina > 0) || (canDoAnal(slave) && slave.anus > 0))) {
				t.push(`"I need to be milked now, too," ${he} ${say}s flirtily, and turns to mount the machine in turn.`, Spoken(slave, `"Please, please do me too!"`), `The machine hasn't had a turn first, this time, so ${he}'s much`);
				if (V.PC.dick) {
					t.push(`tighter, and when ${he}'s done being milked, ${he}'s got a load of your cum inside ${him}.`);
				} else {
					t.push("tighter.");
				}
				if (slave.lactation > 0) {
					slave.lactationDuration = 2;
					slave.boobs -= slave.boobsMilk;
					slave.boobsMilk = 0;
				}
				if (canDoAnal(slave) && slave.anus > 0) {
					seX(subSlave, "anal", V.PC, "penetrative");
					if (canImpreg(subSlave, V.PC)) {
						knockMeUp(subSlave, 5, 1, -1);
					}
				} else if (canDoVaginal(slave) && slave.vagina > 0) {
					seX(subSlave, "vaginal", V.PC, "penetrative");
					if (canImpreg(subSlave, V.PC)) {
						knockMeUp(subSlave, 5, 0, -1);
					}
				}
			} else {
				t.push(Spoken(slave, `"Please, please let me drink yours, too,"`), `${he} moans, and gets down on ${his} knees, opening ${his} mouth and sticking out ${his} tongue, begging for`);
				if (V.PC.dick) {
					t.push(`your cock. You stick it straight down ${his} throat, and soon add a second load of cum`);
				} else {
					t.push(`you to mount ${his} face. You do, and soon add a generous helping of femcum`);
				}
				t.push(`to ${his} breakfast.`);
				seX(slave, "oral", V.PC, "penetrative");
			}
			slave.devotion += 3;
			subSlave.devotion += 3;

			App.Events.addParagraph(frag, t);

			return frag;
		}

		function balanced() {
			const frag = document.createDocumentFragment();
			t = [];
			t.push(`You stand by and watch the arresting scene until ${subSlave.slaveName} cums. The milking stations are designed to be pleasurable, so they're calibrated to drain ${girl2}s' balls about as fast as they drain their udders, allowing them to enjoy both kinds of relief for the whole session. But ${slave.slaveName} has falsified that for once;`);
			if (slave.skill.oral > 95) {
				t.push(`the inside of ${his} wet, hot mouth is really a delightful place for a penis, and ${he} puts the machine's dick receptacle to shame. ${subSlave.slaveName}`);
			} else if (slave.skill.oral > 60) {
				t.push(`${he}'s a skilled cocksucker, and ${his} wet, hot mouth is a much more stimulating place for a penis than the machine's dick receptacle. ${subSlave.slaveName}`);
			} else {
				t.push(`${he}'s no oral master, but ${his} mouth is wet and hot, and ${subSlave.slaveName} clearly likes it more than machine's dick receptacle. ${He2}`);
			}
			t.push(`can feel that ${his2} breasts aren't nearly empty of milk yet, and of course the milkers are tugging at ${his2} teats as industriously as ever, so ${he2} relaxes luxuriantly as ${slave.slaveName} starts to climb out from under ${him2}.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`You announce your presence by ordering ${slave.slaveName} to stay where ${he} is. Startled, ${he} sticks ${his} head out from under ${subSlave.slaveName} and chirps`, Spoken(slave, `"Yes, ${getWrittenTitle(slave)}!"`), `and scoots back under, waiting to see what you're planning. You straddle ${subSlave.slaveName}'s face; as`);
			if (canSee(subSlave)) {
				t.push(`${his2} vision is filled by your`);
				if (V.PC.dick) {
					t.push(`erect dick`);
				} else {
					t.push(`wet pussy`);
				}
			} else if (canSmell(subSlave)) {
				t.push(`${his2} nose samples the scent of`);
				if (V.PC.dick) {
					t.push(`the precum budding at the tip of your erect dick`);
				} else {
					t.push(`your wet pussy`);
				}
			} else {
				t.push(`${his2} face is warmed by the heat from your`);
				if (V.PC.dick) {
					t.push(`hard cock,`);
				} else {
					t.push(`wet cunt,`);
				}
			}
			t.push(`${he2} opens ${his2} mouth compliantly and`);
			if (V.PC.dick) {
				t.push(`receives ${his2} owner's hot cock, pressed past ${his2} lips and down ${his2} throat. ${He2} starts sucking`);
			} else {
				t.push(`is rewarded with ${his2} owner's hot womanhood, pressed against ${his2} lips. ${He2} starts eating you out`);
			}
			t.push(`obediently, until you reach down to ${his2} still-jiggling udders and tug one of the milkers loose. ${subSlave.slaveName} starts with discomfort, moaning uncomfortably into your`);
			if (V.PC.dick) {
				t.push(`member`);
			} else {
				t.push(`cunt`);
			}
			t.push(`before getting back to work. ${His2}`);
			if (subSlave.lactation > 1) {
				t.push(`lactation is unnaturally copious,`);
			} else {
				t.push(`milk is really flowing,`);
			}
			t.push(`and a thin stream of cream squirts out of ${him2}. It lands on ${slave.slaveName}'s face below, surprising ${him}. ${He} splutters comically, but obeys eagerly when you squeeze ${subSlave.slaveName}'s freed boob and order ${slave.slaveName} to start drinking. After all, you point out, a balanced diet is important. ${slave.slaveName} <span class="trust inc">giggles complaisantly</span> and reaches for the proffered tit. ${subSlave.slaveName} is still basking in the afterglow of ${his2} orgasm and shudders silently with overstimulation as ${he2} feels ${slave.slaveName}'s lips`);
			if (subSlave.nipples !== "fuckable") {
				t.push(`latch around`);
			} else {
				t.push(`encircle`);
			}
			t.push(`${his2} ${subSlave.nipples} nipple.`);
			if (V.PC.dick) {
				seX(subSlave, "oral", V.PC, "penetrative");
			} else {
				seX(subSlave, "oral", V.PC, "vaginal");
			}
			slave.trust += 5;

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

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

			t.push(`You order ${slave.slaveName} to put the dick back where it belongs and come out from under there. There's a lewd noise as ${he} spits out ${subSlave.slaveName}'s penis.`, Spoken(slave, `"Yes, ${getWrittenTitle(slave)}!"`), `${he} ${say}s automatically, knowing your voice, and ${he} scrabbles to obey, stuffing poor moaning ${subSlave.slaveName}'s member back in its proper cum receptacle before hurriedly scooting out from under,`);
			if (slave.clitSetting === "oral") {
				t.push(`gasping with the stimulation applied by ${his} smart piercing, which is encouraging ${him} to suck dick.`);
			} else if (slave.belly >= 10000) {
				t.push(`a struggle considering just how big ${his}`);
				if (slave.bellyPreg >= 8000) {
					t.push(`pregnancy`);
				} else {
					t.push(`belly`);
				}
				t.push(`is.`);
			} else if (slave.weight > 95) {
				t.push(`a process made much more comical as ${his} plush body wobbles and flops against everything in its way.`);
			} else if (slave.dick > 4) {
				t.push(`${his} own`);
				if (canAchieveErection(slave)) {
					t.push(`monster erection waving`);
				} else {
					t.push(`monstrously limp dick flopping`);
				}
				t.push(`around comedically as ${he} does.`);
			} else if (slave.boobs > 4000) {
				t.push(`a process made much more involved and a little funny by ${slave.slaveName}'s own gargantuan tits.`);
			} else {
				t.push(`${his} bare buttocks smacking painfully against the floor in ${his} haste.`);
			}
			if (canStand(slave)) {
				t.push(`${He} starts to scramble up to a standing position, but ${he} only gets halfway before ${he} notices that there's`);
			} else {
				t.push(`${He} starts push ${himself} upright, but quickly finds that there's`);
			}
			if (canAchieveErection(subSlave)) {
				t.push(`another`);
			} else {
				t.push("a");
			}
			t.push(`massively erect dick`);
			if (canSee(slave)) {
				t.push(`pointed`);
			} else {
				t.push(`poking`);
			}
			t.push(`at ${his} face. Yours.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`${slave.slaveName}`);
			if (slave.trust > 20) {
				t.push(`wasn't really worried that ${he} was in trouble; ${canHear(slave) ? "your tone was not" : "you don't seem"} angry and ${he} wasn't breaking the rules. Even so, ${he} giggles`);
			} else {
				t.push(`was worried that ${he} was in trouble; even through ${canHear(slave) ? "your tone wasn't not" : "you don't seem"} angry, and even though ${he} wasn't breaking the rules, ${he}'s afraid of you. So ${he} giggles with relief`);
			}
			t.push(`when ${he}`);
			if (canSee(slave)) {
				t.push(`sees`);
			} else {
				t.push(`realizes`);
			}
			t.push(`that ${he}'s going to get ${his} drink of cum, just from a different source.`);
			if (slave.trust > 20) {
				t.push(`${He} runs ${his}`);
				if (slave.piercing.tongue.weight) {
					t.push(`pierced`);
				} else {
					t.push(`pink`);
				}
				t.push(`tongue over ${his} lips hungrily, staring meaningfully at the cockhead`);
				if (V.showInches === 2) {
					t.push(`inches`);
				} else {
					t.push(`centimeters`);
				}
				t.push(`in front of ${his} face.`, Spoken(slave, `"I'm so happy, ${getWrittenTitle(slave)},"`), `${he} purrs.`, Spoken(slave, `"You have the best cum. ${V.PC.balls >= 10 ? "I'll never go hungry with you either." : "."}"`), `${He}'s still right up against ${subSlave.slaveName},`);
				if (hasAnyArms(slave)) {
					t.push(`and ${he} reaches back to pat ${subSlave.slaveName}'s butt reassuringly.`);
				} else {
					t.push(`so ${he} leans back and nuzzles ${subSlave.slaveName}'s butt reassuringly.`);
				}
				t.push(Spoken(slave, `"Yours is nice, but there's only one ${getWrittenTitle(slave)}."`), `Then ${he} starts sucking your dick.`);
			} else {
				t.push(Spoken(slave, `"Thank you, ${getWrittenTitle(slave)},"`), `${he} ${say}s dutifully.`, Spoken(slave, `"Your, um, your cum is the best.${V.PC.balls >= 10 ? " I'll never go hungry with you either." : ""}"`));
				t.push(`Momentarily unsure of ${himself}, ${he} blushes, and decides to take refuge in dicksucking.`);
			}
			if (slave.skill.oral > 60) {
				t.push(`${He}'s a well-trained cocksucker, and as the suction and ${his} active tongue go to work,`);
				if (hasAnyArms(slave)) {
					t.push(`${he} reaches up and`);
					if (V.PC.vagina !== -1) {
						t.push(`begins to lavish attention on your pussy with both hands. ${He} fingers your labia lovingly before starting to dip ${his} fingers inside you in time with ${his} oral strokes at your shaft.`);
					} else {
						t.push(`cups your`);
						if (V.PC.balls >= 30) {
							t.push(`monstrous balls`);
						} else if (V.PC.balls >= 14) {
							t.push(`hand-filling`);
						} else if (V.PC.balls >= 9) {
							t.push(`huge`);
						} else if (V.PC.balls >= 5) {
							t.push(`big`);
						}
						t.push(`balls lovingly. A testicular massage during a blowjob might not actually increase ejaculation volume, but the care ${he} shows suggests that the hungry slut might believe it does.`);
					}
				} else {
					t.push(`${he} lavishes attention as best ${he} can to your`);
					if (V.PC.vagina !== -1) {
						t.push(`your pussy without any hands.`);
					} else {
						if (V.PC.balls >= 30) {
							t.push(`monstrous balls`);
						} else if (V.PC.balls >= 14) {
							t.push(`hand-filling`);
						} else if (V.PC.balls >= 9) {
							t.push(`huge`);
						} else if (V.PC.balls >= 5) {
							t.push(`big`);
						}
						t.push(`balls without any hands. Lovingly teasing your testicles during a blowjob might not actually increase ejaculation volume, but the care ${he} shows suggests that the hungry slut might believe it does.`);
					}
				}
			} else {
				t.push(`${He}'s not an outstanding oral slave, so after ${he}'s working away reasonably well, you take ${his} head in both hands and fuck ${his} face. Not cruelly, but with comprehensive dominance. ${He} can breathe, but ${he} has to concentrate to do so, letting you rape ${his} throat like a good little bitch.`);
			}
			t.push(`When you cum, you thrust as far inside as you can manage and`);
			if (V.PC.balls >= 30) {
				t.push(`pump oversized load after oversized load down ${his} throat, steadily swelling ${his} stomach with your jizz.`);
			} else if (V.PC.balls >= 14) {
				t.push(`pump your massive load into ${him} until ${he} gags.`);
			} else if (V.PC.balls >= 9) {
				t.push(`unload your massive cumshot deep into ${him}.`);
			} else {
				t.push(`shoot your load deep into ${him}.`);
			}
			t.push(`Denied the`);
			if (canTaste(slave)) {
				t.push(`taste`);
			} else {
				t.push(`feeling`);
			}
			t.push(`of most of your semen, deposited far back and beyond ${his}`);
			if (canTaste(slave)) {
				t.push(`taste buds,`);
			} else {
				t.push(`tongue,`);
			}
			t.push(`${he} forms a tight seal around your shaft as ${he} pulls ${his} head back and off your cock, sucking the residual drops out of you and onto ${his} tongue. ${He} swallows, gives a`);
			if (slave.trust > 20) {
				t.push(`contented`);
			} else {
				t.push(`relieved`);
			}
			t.push(`sigh, and looks up at you <span class="hotpink">devotedly.</span>`);
			seX(slave, "oral", V.PC, "penetrative");
			slave.devotion += 5;
			App.Events.addParagraph(frag, t);
			return frag;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave
				s => s.fetish !== "mindbroken",
				s => s.devotion > 20,
				s => s.relationship > -2, // ebonded and lower always prefer PC
				s => s.devotion < 95, // perfectly devoted prefer PC
				s => [Job.CONCUBINE, Job.MASTERSUITE, Job.FUCKTOY].includes(s.assignment), // is assigned to fuck you
				s => !["either", V.PC.genes].includes(RETSFucktoyPrefersRelative.preferredSex(s)), // but swings the other way
				s => s.energy > 40, // scene assumes horniness...professionals might feel the same way, but you'd never know
				canSee,
				canHear
			],
			[ // and a relative that they prefer over you
				s => s.fetish !== "mindbroken",
				s => s.genes === RETSFucktoyPrefersRelative.preferredSex(getSlave(this.actors[0])),
				s => areRelated(s, getSlave(this.actors[0])),
				s => s.rivalTarget !== this.actors[0],
				s => (canWalk(s) || (canMove(s) && s.rules.mobility === "permissive")),
				isSlaveAvailable
			]
		];
	}

	/** Return the preferred sex for this slave's partners
	 * @param {App.Entity.SlaveState} slave
	 * @returns {string}
	 */
	static preferredSex(slave) {
		if (slave.attrXX > (slave.attrXY + 5)) {
			return "XX";
		} else if (slave.attrXY > (slave.attrXX + 5)) {
			return "XY";
		}
		return "either";
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		const [fucktoy, relative] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, him
		} = getPronouns(fucktoy);
		const {
			He2, he2, His2, his2, him2, girl2, women2
		} = getPronouns(relative).appendSuffix("2");

		App.Events.drawEventArt(node, [fucktoy, relative], "no clothing");

		let fuckhole = fucktoy.toyHole;
		if (fuckhole === "all her holes") {
			if (canDoVaginal(fucktoy)) {
				fuckhole = "pussy";
			} else if (canDoAnal(fucktoy)) {
				fuckhole = "ass";
			} else {
				fuckhole = "mouth";
			}
		}

		let t = [];
		t.push(`You're enjoying`, contextualIntro(V.PC, fucktoy, true), `one evening in your office when`, contextualIntro(fucktoy, relative, true), `passes by stark naked (probably on ${his2} way to or from the shower). The glass walls of your office are designed to let you, and by extension everyone else inside, clearly see everything that happens in the rest of the Penthouse, as well as the comings and goings of all your slaves.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`In this case, that means ${fucktoy.slaveName} gets an eyeful of ${relative.slaveName} as ${he2} passes by. ${He} is a well-disciplined slave and ${his} reaction might have passed unnoticed if you weren't`);
		switch (fuckhole) {
			case "pussy":
				if (V.PC.dick > 0) {
					t.push(`deep inside ${his} pussy. You feel ${his} walls pulse and contract around you as ${he} cums hard.`);
				} else {
					t.push(`thrusting a strap-on deep into ${his} pussy. You pause your thrusts as ${he} gasps and twitches, cumming hard.`);
				}
				break;
			case "ass":
				if (V.PC.dick > 0) {
					t.push(`deep inside ${his} ass. You feel ${his} sphincter contract around you as ${he} cums hard.`);
				} else {
					t.push(`thrusting a strap-on deep into ${his} ass. You pause your thrusts as ${he} gasps and twitches, cumming hard.`);
				}
				break;
			case "mouth":
				if (V.PC.dick > 0) {
					t.push(`buried deep in ${his} throat. ${His} motions waver and you feel ${his} throat contract around you as ${he} cums hard.`);
				} else {
					t.push(`thrusting a strap-on deep into ${his} throat. ${His} motions waver as ${he} twitches, cumming hard.`);
				}
				break;
			case "boobs":
				if (V.PC.dick > 0) {
					t.push(`receiving a ${fucktoy.boobs > 300 ? "boobjob" : "naizuri"} from ${him}. ${His} motions waver and ${he} gasps aloud as ${he} cums hard.`);
				} else if (fucktoy.boobs > 300) {
					t.push(`groping ${his} boobs. ${He} gasps and twitches, cumming hard.`);
				} else {
					t.push(`teasing ${his} flat chest. ${He} gasps and twitches, cumming hard.`);
				}
				break;
			case "dick":
				t.push(`riding ${him}. ${He} groans as ${he} unexpectedly cums hard, filling you up.`);
				if (V.PC.vagina > 0) {
					if (canImpreg(V.PC, fucktoy)) {
						t.push(`You wonder briefly if ${he} might have just gotten you pregnant.`);
						knockMeUp(V.PC, 5, 0, fucktoy.ID);
					}
				}
				break;
			default:
				throw Error(`Unexpected toyhole ${fuckhole}`);
		}
		t.push(`You have a lot of experience with slaves getting off, and you're pretty sure that reaction wasn't just from your use of ${him}, but from ogling the nude form of ${relative.slaveName} at the same time.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`You decide to test your fucktoy, and ask ${him} directly whether ${he} was turned on by ${his} ${relativeTerm(fucktoy, relative)} ${relative.slaveName}.`);
		if (fucktoy.trust <= 20) { // illusion of choice...he'll always tell you, just for a different reason
			t.push(`${He} knows better than to lie to you, and replies, terrified, that ${he} was.`);
		} else if (fucktoy.devotion < -20) {
			t.push(`${He} defiantly replies that ${he} was.`);
		} else {
			t.push(`${He} trusts you enough to tell you the truth without reservation, and replies that ${he} was.`);
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`Pushing further, you ask ${him} what turns ${him} on so much about ${relative.slaveName} that ${he}'d cum from looking at ${him2} but not from looking at you.`);
		if (fucktoy.devotion < -20 && fucktoy.trust > 20) {
			t.push(`${He} starts with some drivel about how much ${he} loves ${his} ${relativeTerm(fucktoy, relative)}, but ends with a snide remark about how`);
		} else {
			t.push(`Knowing that it's a potentially dangerous answer, but unwilling to lie to you, ${he} responds`);
			if (!canTalk(fucktoy)) {
				t.push(`with nervous gestures, indicating that`);
			} else {
				t.push(`nervously that`);
			}
			t.push(`${he} loves ${his} ${relativeTerm(fucktoy, relative)}, and besides,`);
		}
		if (RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX") { // likes women
			if (relative.vagina > -1 && V.PC.vagina === -1) {
				t.push(`${he2} has a pretty pussy, and you don't.`);
			} else if (relative.boobs > 300 && V.PC.boobs < 300) {
				t.push(`${he2} has great tits, and you don't.`);
			} else if (relative.boobs > V.PC.boobs * 1.2) {
				t.push(`${he2} has way bigger tits than you do.`);
			} else if (V.PC.title === 0) { // gender overhaul
				t.push(`${he2}'s a woman, while you just look like one.`);
			} else {
				t.push(`${he2}'s a woman, and you aren't.`); // meh
			}
		} else { // likes men
			if (relative.dick > V.PC.dick) {
				if (V.PC.dick === 0) {
					t.push(`${he2} has a cock, and ${he} loves cocks.`);
				} else {
					t.push(`${he2} has a bigger cock than you do.`);
				}
			} else if (relative.balls > 0 && V.PC.balls === 0) {
				t.push(`${he2} has balls, and you don't.`);
			} else if (relative.boobs === 0 && (V.PC.boobs >= 300 || V.PC.title === 0)) {
				t.push(`${he2} has a manly, muscular chest.`);
			} else if (V.PC.title === 1) { // gender overhaul
				t.push(`${he2}'s a man, while you just look like one.`);
			} else {
				t.push(`${he2}'s a man, and you aren't.`); // meh
			}
		}
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`You consider this for a moment... it's objectively a true difference between you and ${relative.slaveName}, and that reason lines up with what you ${fucktoy.attrKnown ? "know" : "have guessed"} about ${his} sexuality already.`);
		if (App.Utils.sexAllowed(fucktoy, relative)) {
			t.push(`In fact, you're pretty sure you've seen the two of them specifically going at it fairly vigorously before.`);
		}
		t.push(`${His} higher attraction to ${women2} isn't necessarily a problem... ${he}'s been plenty attentive to your sexual needs even if ${he}'s not necessarily turned on by your body... but at the same time, you could probably do something about it if you wanted.`);
		fucktoy.attrKnown = 1; // now you know
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`Punish ${him}`, punish),
			new App.Events.Result(`Condition ${him} to appreciate ${RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX" ? "men" : "women"}`, condition),
			new App.Events.Result(`Call ${relative.slaveName} back and have a threesome`, threesome),
		]);

		function punish() {
			const frag = document.createDocumentFragment();
			t = [];
			t.push(`You push ${fucktoy.slaveName} face-down over your desk and sternly inform that ${he} has only one objective when serving as your fucktoy: bringing you pleasure. To punctuate each phrase, you strike ${his} buttocks with your hand, leaving a red mark. ${He} is not to be distracted when a ${girl2} ${he} likes walks by, or when you get a call, or for any other reason unless you specifically tell ${him} to stop. And ${he} is certainly not allowed to cum before you without permission.`);
			App.Events.addParagraph(frag, t);

			t = [];
			t.push(`${He} meekly acknowledges your instructions and <span class="devotion inc">vows to do better</span> for you, and you can tell that ${he} <span class="trust dec">fears</span> a repeat of this lesson.`);
			fucktoy.devotion += 4;
			fucktoy.trust -= 4;
			if (fucktoy.fetish === "submissive" && fucktoy.fetishKnown === 1) {
				t.push(`Still, when you glance down, you catch the faintest hint of a smile; it seems your punishment appealed to him, <span class="fetish inc">reinforcing ${his} submission</span> to your will.`);
				fucktoy.fetishStrength += 10;
			} else {
				t.push(`${His} suppression of ${his} attraction naturally leads to a <span class="libido dec">decrease in ${his} libido</span> and <span class="stat drop">attraction to ${women2}.</span>`);
				fucktoy.energy -= 3;
				if (RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX") {
					fucktoy.attrXX -= 5;
				} else {
					fucktoy.attrXY -= 5;
				}
			}
			App.Events.addParagraph(frag, t);

			if (V.arcologies[0].FSSlaveProfessionalism !== "unset") {
				t = [];
				t.push(`Whispers spread through your arcology about how seriously you take your slaves' <span class="reputation inc">duty to professional detachment.</span>`);
				FutureSocieties.Change("Slave Professionalism", 3);
				App.Events.addParagraph(frag, t);
			}

			return [frag];
		}

		function condition() {
			const {himA} = getPronouns(assistant.pronouns().main).appendSuffix('A');
			t = [];
			t.push(`While ${fucktoy.slaveName} kneels before you, ready to resume ${his} service to you, you inform ${him} that ${he}'ll get some help to see things the right way. You summon ${V.assistant.name} and instruct ${himA} to begin a conditioning regimen to encourage ${fucktoy.slaveName} to engage sexually with`);
			if (RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX") {
				t.push(`<span class="improvement">men rather than women.</span>`);
				fucktoy.attrXX -= 10;
				fucktoy.attrXY += 15;
			} else {
				t.push(`<span class="improvement">women rather than men.</span>`);
				fucktoy.attrXX += 15;
				fucktoy.attrXY -= 10;
			}
			t.push(`${fucktoy.slaveName} is <span class="trust dec">apprehensive</span> of conditioning`);
			if (fucktoy.devotion < -20) {
				t.push(`and <span class="devotion dec">none too thrilled</span> that you're willing to twist ${his} tastes this way.`);
				fucktoy.devotion -= 1;
			} else {
				t.push(`but <span class="devotion inc">thankful</span> that you're willing to help ${him} this way.`);
				fucktoy.devotion += 1;
			}
			fucktoy.trust -= 1;
			return t;
		}

		function threesome() {
			const frag = document.createDocumentFragment();
			const enjoysIncest = s => s.sexualQuirk === "perverted" || s.sexualQuirk === "sinful";

			t = [];
			t.push(`You're not done with ${fucktoy.slaveName} yet, but what good is maintaining a stable of sex slaves if you don't have a threesome every now and then? You have your assistant call ${relative.slaveName} back to your office. ${He2} arrives in just a couple of seconds, finding ${fucktoy.slaveName} blushing with embarrassment. You inform ${him2} that you'll be using ${him2} with ${fucktoy.slaveName}.`);
			if (enjoysIncest(relative) || relative.relationshipTarget === fucktoy.ID) {
				t.push(`${He2} grins, clearly aroused at the thought, and comes around the desk towards the two of you.`);
			} else if (relative.devotion > 50) {
				t.push(`${His2} eyes widen slightly, but ${he2} is devoted enough to commit fully to whatever you ask of ${him2}.`);
			} else {
				t.push(`${He2} stops in ${his2} tracks, clearly disturbed by what's about to happen, until you repeat your order.`);
			}
			App.Events.addParagraph(frag, t);

			/* Double pen the fucktoy if she prefers dudes and can take it */
			const doublePenFucktoy = RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XY" && (canDoAnal(fucktoy) || canDoVaginal(fucktoy)) && canPenetrate(relative);
			/* Double pen the relative if the fucktoy prefers chicks and the relative can take it */
			const doublePenRelative = RETSFucktoyPrefersRelative.preferredSex(fucktoy) === "XX" && (canDoAnal(relative) || canDoVaginal(relative)) && canPenetrate(fucktoy);
			/* If double pen is not possible or desirable, and EITHER slave can ride you, double cowgirl on the player, so the slaves face each other */
			const doubleCowgirl = canDoAnal(fucktoy) || canDoVaginal(fucktoy) || canDoAnal(relative) || canDoVaginal(relative);
			if (doublePenFucktoy || doublePenRelative) {
				const recipient = doublePenFucktoy ? fucktoy : relative;
				const copenetrator = doublePenFucktoy ? relative : fucktoy;
				const {heR, himR, hisR} = getPronouns(recipient).appendSuffix('R');
				t = [];
				t.push(`You lay back on your couch while ${recipient.slaveName} mounts you, with ${copenetrator.slaveName} getting ready behind ${himR}.`);
				if (canDoAnal(recipient) && canDoVaginal(recipient)) {
					t.push(`While ${heR} slides your ${V.PC.dick > 0 ? "dick" : "strap-on"} into ${hisR} waiting pussy, ${copenetrator.slaveName} pushes into ${hisR} ass. You continue like this for a bit, before swapping positions with ${copenetrator.slaveName}.`);
					t.push(VCheck.Both(recipient, 2, 2));
				} else {
					const anal = canDoAnal(recipient);
					t.push(`It's a bit tight in ${recipient.slaveName}'s ${anal ? 'ass' : 'pussy'}, with both ${copenetrator.slaveName} and your ${V.PC.dick > 0 ? "dick" : "strap-on"} sharing the space, but you make it work.`);
					if (anal && recipient.anus < 3) {
						t.push(VCheck.Anal(recipient, 2));
						t.push(`Having both of you in ${hisR} tight ass <span class="lime">stretches it out</span> a bit.`);
						recipient.anus++;
					} else if (!anal && recipient.vagina < 3) {
						t.push(VCheck.Vaginal(recipient, 2));
						t.push(`Having both of you in ${hisR} tight pussy <span class="lime">stretches it out</span> a bit.`);
						recipient.vagina++;
					}
				}
				t.push(`It takes a few moments to find a rhythm, but ${fucktoy.slaveName} is excited that ${he} gets to do this with ${his} ${getWrittenTitle(fucktoy)} and ${his} ${relativeTerm(fucktoy, relative)}. It's easy to enjoy the change of pace, especially with ${recipient.slaveName} writhing on your ${V.PC.dick > 0 ? `dick` : `strap-on`}.`);
				App.Events.addParagraph(frag, t);
			} else if (doubleCowgirl) {
				const onDick = canDoVaginal(fucktoy) ? fucktoy : canDoVaginal(relative) ? relative : canDoAnal(fucktoy) ? fucktoy : relative; // whee
				const onMouth = onDick === fucktoy ? relative : fucktoy;
				const {heD} = getPronouns(onDick).appendSuffix('D');
				const {himM, heM, hisM} = getPronouns(onMouth).appendSuffix('M');
				t = [];
				t.push(`You lay back on your couch ${V.PC.dick < 1 ? `with your strap-on attached ` : ``}and have ${onDick.slaveName} climb onto you, facing you while ${heD} rides.`);
				t.push(VCheck.Simple(onDick, 1));
				t.push(`Meanwhile, you signal to ${onMouth.slaveName} that you want to taste ${himM}, and ${heM} straddles your face, facing ${hisM} ${relativeTerm(onMouth, onDick)}.`);
				t.push(`Naturally, ${fucktoy.slaveName} starts a makeout session while ${he} and ${relative.slaveName} ride you. It doesn't take long for moans to turn to screams.`);
				App.Events.addParagraph(frag, t);
			} else {
				/* FFS, really? You have two sex slaves here, one of whom is your *personal fucktoy*, and neither can do anything but oral? Fine, have an oral triangle. */
				t = [];
				t.push(`The three of you lie down together, as you order ${fucktoy.slaveName} to continue servicing you orally. You tell ${relative.slaveName} to`);
				if (fucktoy.dick > 0) {
					t.push(`give ${fucktoy.slaveName} a blowjob`);
				} else if (fucktoy.vagina > 0) {
					t.push(`eat ${fucktoy.slaveName} out`);
				} else {
					t.push(`give ${fucktoy.slaveName} a rimjob`); // I guess?
				}
				t.push(`while you get a taste of ${him2}. It takes a few moments to find a rhythm, but ${fucktoy.slaveName} is excited that ${he} gets to do this with ${his} ${getWrittenTitle(fucktoy)} and ${his} ${relativeTerm(fucktoy, relative)}, and it's not long before all of you have reached orgasm.`);
				seX(fucktoy, "oral", relative, "oral", 1);
				App.Events.addParagraph(frag, t);
			}

			t = [];
			t.push(`The three of you collapse into a warm, satisfied pile of bodies. ${fucktoy.slaveName} is grateful that you indulged ${his} fantasy, and trusts that you'll continue to keep ${his} satisfaction in mind.`);
			fucktoy.devotion += 2;
			fucktoy.trust += 2;

			/* did one or both of them *really* have fun? */
			if (enjoysIncest(fucktoy) && enjoysIncest(relative)) {
				t.push(`On top of it all, it turns out that ${fucktoy.slaveName} and ${relative.slaveName} both really enjoy breaking the taboo of incest, and they've grown closer to you from this encounter.`);
				fucktoy.devotion += 4;
				relative.devotion += 4;
			} else if (enjoysIncest(fucktoy)) {
				t.push(`On top of it all, it turns out that ${he} really enjoys breaking the taboo of incest, and ${he}'s <span class="devotion inc">grown closer to you</span> from this encounter.`);
				fucktoy.devotion += 3;
			} else if (enjoysIncest(relative)) {
				t.push(`On top of it all, it turns out that ${relative.slaveName} really enjoys breaking the taboo of incest, and ${he2}'s <span class="devotion inc">grown closer to you</span> from this encounter.`);
				relative.devotion += 3;
			}
			App.Events.addParagraph(frag, t);

			return [frag];
		}
	}
};

repo_name: CloudyCoffee/fc

license: mit


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

	actorPrerequisites() {
		return [
			[
				s => s.fetish !== "mindbroken",
				hasBothArms,
				hasAnyLegs,
				canTalk,
				s => s.devotion > 50,
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				canTalk,
				isSlaveAvailable,
				s => s.devotion <= 20,
				s => s.fetish !== "buttslut",
				s => s.anus !== 0
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself,
		} = getPronouns(eventSlave);
		const {say} = getEnunciation(eventSlave);
		const {
			His2, him2, girl2, his2, he2, He2
		} = getPronouns(subSlave).appendSuffix("2");

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

		let t = [];

		t.push(`The distinctive sounds of a sexual encounter in which exactly one of the participants is enjoying ${himself} are coming from the dormitory. This is by no means uncommon, but this particular nonconsensual assignation sounds interesting, so you stick your head in on your way by. You're treated to the sight of`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, eventSlave, true), `'s ${eventSlave.skin} back and`));
		if (eventSlave.butt > 4) {
			t.push(`massive ass`);
		} else if (eventSlave.butt > 2) {
			t.push(`plush rear`);
		} else {
			t.push(`cute butt`);
		}
		t.push(`as ${he}`);
		if (!canStand(eventSlave)) {
			t.push(`kneels`);
		} else {
			t.push(`leans over`);
		}
		t.push(`on one of the bedrolls. It isn't immediately clear what's going on, but ${he}'s doing something with ${his}`);
		if (canPenetrate(eventSlave)) {
			t.push(`dick,`);
		} else {
			t.push(`hands,`);
		}
		t.push(`and there are a pair of ${subSlave.skin} feet visible on either side of ${him}. ${He}'s clearly got someone shoved down into the bedroll in front of ${him}, doggy style. That's the source of the whining.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`Advancing to get a better view, you identify the bottom as`);
		if (subSlave.bellyPreg >= 5000) {
			t.push(`the pregnant`);
		}
		t.push(App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(subSlave), "."));
		t.push(`${eventSlave.slaveName} has`);
		if (canPenetrate(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic dick up ${subSlave.slaveName}'s`);
				if (subSlave.anus > 2) {
					t.push(`loose anus, but ${subSlave.slaveName}'s butthole is so accommodating that it probably isn't anal pain that's troubling ${him2}.`);
				} else {
					t.push(`asshole, which must be so stretched to accommodate it that ${his2} anguish is probably due in part to anal pain.`);
				}
			} else if (eventSlave.dick > 2) {
				t.push(`${his} dick up ${subSlave.slaveName}'s`);
				if (subSlave.anus > 1) {
					t.push(`experienced anus, but ${subSlave.slaveName}'s butthole sufficiently used to buttsex that it probably isn't anal pain that's troubling ${him2}.`);
				} else {
					t.push(`tight little asshole, which must be so stretched to accommodate it that ${his2} anguish is probably due in part to anal pain.`);
				}
			} else {
				t.push(`${his} little cock up ${subSlave.slaveName}'s anus. It's so small that it probably isn't anal pain that's troubling ${subSlave.slaveName}.`);
			}
		} else {
			if (subSlave.anus > 2) {
				t.push(`three fingers up ${subSlave.slaveName}'s loose butthole, which is so accommodating that it probably isn't anal pain that's troubling ${him2}.`);
			} else if (subSlave.anus > 1) {
				t.push(`two fingers up ${subSlave.slaveName}'s butthole, which is experienced enough that it probably isn't anal pain that's troubling ${him2}.`);
			} else {
				t.push(`two fingers up ${subSlave.slaveName}'s tight ass, which must be so stretched to accommodate them that ${his2} anguish is probably due in part to anal pain.`);
			}
		}
		t.push(`${eventSlave.slaveName} isn't fucking ${subSlave.slaveName} at all: ${he}'s just`);
		if (canPenetrate(eventSlave)) {
			t.push(`holding ${his} penis stationary`);
		} else {
			t.push(`holding ${his} fingers`);
		}
		t.push(`up ${subSlave.slaveName}'s rear hole. ${His2} buttocks has been severely spanked, so some of ${his2} unhappiness probably comes from being forced to eat sheets and let ${eventSlave.slaveName} play with ${his2} ass. But then you notice that ${eventSlave.slaveName} is`);
		if (canPenetrate(eventSlave)) {
			t.push(`reaching around`);
		} else {
			t.push(`using ${his} other hand to reach around`);
		}
		t.push(`${subSlave.slaveName}, and is`);
		if (subSlave.dick > 0 && !(subSlave.chastityPenis)) {
			t.push(`jerking ${subSlave.slaveName} off`);
		} else {
			t.push(`manually stimulating ${subSlave.slaveName}`);
		}
		if (eventSlave.skill.oral >= 60) {
			t.push(`with all ${his} considerable expertise.`);
		} else if (eventSlave.skill.oral > 30) {
			t.push(`with considerable skill.`);
		} else {
			t.push(`with every appearance of effort.`);
		}
		t.push(`You're not sure what's going on here.`);

		seX(subSlave, "anal", eventSlave, "penetrative");

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result("Just watch", watch),
			new App.Events.Result(`${He}'s being too gentle`, join)
		]);

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

			t.push(`You settle down to watch what happens. ${eventSlave.slaveName}, who has a devoted slave's sixth sense about ${his} ${getWrittenTitle(eventSlave)}'s presence, realizes you're there and turns toward you.`);
			if (canSee(eventSlave)) {
				t.push(`You've already got a reassuring, silent hand raised, and you gesture that ${he} should continue.`);
			} else if (canHear(eventSlave)) {
				t.push(`Not hearing any comments, ${he} takes it as a gesture to continue.`);
			} else {
				t.push(`Not sensing your touch, ${he} eventually decides to continue.`);
			}
			t.push(`${He} smiles naughtily at you, <span class="trust inc">pleased with your trust in ${him},</span> before going back to ${subSlave.slaveName}. ${He}`);
			if (canPenetrate(eventSlave)) {
				t.push(`hauls ${subSlave.slaveName}'s`);
				if (subSlave.belly >= 5000) {
					t.push(`gravid`);
				}
				t.push(`torso partway up`);
			} else {
				t.push(`bends over the poor ${girl2}`);
			}
			t.push(`so ${he} can speak directly into ${his2} ear, and ${say}s quietly,`);
			t.push(Spoken(eventSlave, `"You're starting to enjoy this, aren't you, bitch?"`));
			t.push(`${subSlave.slaveName}, still unaware you're there, shakes ${his2} head unhappily, tears starting to leak out the corners of ${his2} eyes.`);

			App.Events.addParagraph(frag, t);
			t = [];
			t.push(`"N-no," ${he2} gasps.`);
			t.push(Spoken(subSlave, `"I'm not! Please t-take ${canPenetrate(eventSlave) ? `it` : `them`} out!"`));
			t.push(`${eventSlave.slaveName} makes no verbal reply, but continues ${his} manual stimulation, and`);
			if (subSlave.earShape !== "none" && subSlave.earT !== "none") {
				t.push(`sticks ${his} tongue into ${subSlave.slaveName}'s ear.`);
			} else {
				t.push(`runs ${his} tongue along ${subSlave.slaveName}'s ear hole.`);
			}
			t.push(`The poor ${girl2} lets out a startled yelp that trails off into a moan as ${eventSlave.slaveName}'s`);
			if (eventSlave.skill.oral >= 60) {
				t.push(`excellent`);
			} else if (eventSlave.skill.oral > 1) {
				t.push(`skillful`);
			} else {
				t.push(`enthusiastic`);
			}
			t.push(`ministrations really begin to have an effect on ${him2}.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${eventSlave.slaveName} laughs unpleasantly at the desperately uncomfortable ${subSlave.slaveName}, and ${say}s,`);
			t.push(Spoken(eventSlave, `"Tell you what, slut. I'll leave you alone if this doesn't get you off."`));
			t.push(`Already realizing ${his2} predicament, ${subSlave.slaveName} begins to protest, but ${eventSlave.slaveName} cuts ${him2} off.`);
			t.push(Spoken(eventSlave, `"Shut your fucking cockholster, bitch, I'm talking. I'll leave you alone if this doesn't get you off, but if you come, you've obviously been lying to me, and you obviously want me to buttfuck you all night long."`));
			t.push(`${subSlave.slaveName} tries very hard, taking a huge breath of air and holding it in, biting ${his2} lip, shutting ${his2} eyes tight, and more, but it's all for naught. Before long, ${he2} stiffens`);
			if (subSlave.balls > 0 || subSlave.prostate > 0) {
				t.push(`and makes a mess on the bedroll,`);
			} else {
				t.push(`with orgasm,`);
			}
			t.push(`moaning as ${his2} anal sphincter tightens against the invading`);
			if (canPenetrate(eventSlave)) {
				t.push(`cock.`);
			} else {
				t.push(`fingers.`);
			}
			t.push(`Once the climax leaves ${him2}, ${he2} begins to sob, knowing what this means. ${eventSlave.slaveName} takes ${his2} hand away from the crying ${girl2}'s crotch and begins to massage ${his2} back with surprising tenderness.`);
			t.push(Spoken(eventSlave, `"Shh, sweetie, it's all right. I promise you'll enjoy this, if you let yourself."`));
			t.push(`You leave quietly, letting ${eventSlave.slaveName} have ${his} fun. As the week goes on, ${subSlave.slaveName}'s attitude towards anal sex improves quickly, though ${he2} feels rather conflicted about ${eventSlave.slaveName} for forcing this on ${him2}.`);
			eventSlave.trust += 4;
			seX(subSlave, "anal", eventSlave, "penetrative", 4);
			subSlave.fetish = "buttslut";
			subSlave.fetishKnown = 1;
			subSlave.fetishStrength = 65;
			if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
				knockMeUp(subSlave, 20, 1, eventSlave.ID);
			}
			App.Events.addParagraph(frag, t);
			return frag;
		}

		function join() {
			t= [];

			t.push(`You advance on the slaves. ${eventSlave.slaveName}, who has a devoted slave's sixth sense about ${his} ${getWrittenTitle(eventSlave)}'s presence, realizes you're there and turns toward you.`);
			if (canSee(eventSlave)) {
				t.push(`Silently but forcefully, you use a simple hand gesture to instruct ${him} unequivocally`);
			} else {
				t.push(`${He} can feel`);
			}
			t.push(`that ${he}'s to stop fucking around and pound the bitch's butt. ${He} looks a little taken aback, but obeys instantly,`);
			if (canPenetrate(eventSlave)) {
				t.push(`pumping ${his} dick in and out of ${subSlave.slaveName}`);
			} else {
				t.push(`fingerfucking ${subSlave.slaveName}'s ass`);
			}
			t.push(`without mercy. The slave screams at the sudden change of pace, thrashing a little. ${His2} struggles bring`);
			if (canSee(subSlave)) {
				t.push(`${his2} head around, and ${he2}'s surprised to come face to face with your ankles. With dawning comprehension, ${his2} eyes track rapidly up your`);
				if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					t.push(`muscular`);
				} else if (V.PC.title !== 0) {
					t.push(`trim`);
				} else {
					t.push(`feminine`);
				}
				t.push(`thighs, past your`);
				if (V.PC.dick !== 0) {
					if (V.PC.vagina !== -1) {
						t.push(`turgid dick and flushed pussy,`);
					} else {
						t.push(`turgid dick,`);
					}
				} else {
					t.push(`flushed pussy,`);
				}
				t.push(`across your`);
				if (V.PC.belly >= 100000) {
					t.push(`massively pregnant middle`);
				} else if (V.PC.belly >= 10000) {
					t.push(`hugely pregnant middle`);
				} else if (V.PC.belly >= 5000) {
					t.push(`pregnant middle`);
				} else if (V.PC.belly >= 1500) {
					t.push(`swollen middle`);
				} else if (V.PC.belly >= 100) {
					t.push(`suspiciously swollen midriff`);
				} else if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
					t.push(`shredded abs`);
				} else {
					t.push(`muscular abs`);
				}
				t.push(`and over your`);
				if (V.PC.boobs < 300) {
					if (V.arcologies[0].FSPhysicalIdealist !== "unset") {
						t.push(`strong chest`);
					} else if (V.PC.title !== 0) {
						t.push(`firm chest`);
					} else {
						t.push(`flat chest`);
					}
				} else if (V.PC.boobs >= 1400) {
					t.push(`giant`);
					if (V.PC.boobsImplant > 0) {
						t.push(`fake breasts`);
					} else {
						t.push(`cow tits`);
					}
				} else if (V.PC.boobs >= 1200) {
					t.push(`huge`);
					if (V.PC.boobsImplant > 0) {
						t.push(`round`);
					}
					t.push(`breasts`);
				} else if (V.PC.boobs >= 1000) {
					t.push(`big`);
					if (V.PC.boobsImplant > 0) {
						t.push(`perky`);
					}
					t.push(`breasts`);
				} else if (V.PC.boobs >= 800) {
					t.push(`pretty breasts`);
				} else {
					t.push(`cute breasts`);
				}
				t.push(`to rest on your unforgiving face.`);
			} else {
				t.push(`a pleased chuckle out of you. With dawning comprehension, ${his2} face rapidly moves to face yours.`);
			}
			t.push(`${He2} wilts. ${eventSlave.slaveName} thinks this is hilarious, and laughs so hard at the slave's reaction to your appearance that ${he} almost loses hold of ${subSlave.slaveName}'s `);
			if (subSlave.dick > 0) {
				t.push(`cock.`);
			} else if (subSlave.clit > 0) {
				t.push(`clit.`);
			} else {
				t.push(`ass.`);
			}
			t.push(`There's nothing quite like oral from a ${girl2} who's moaning with anal pain, so you sit on the head of the bedroll and`);
			if (V.PC.dick !== 0) {
				t.push(`stick your dick in ${subSlave.slaveName}'s mouth.`);
			} else {
				t.push(`pull ${subSlave.slaveName}'s mouth against your cunt.`);
			}
			t.push(`${eventSlave.slaveName} is still giggling, but leans over the unhappy slave speared between the two of you to plant a kiss on you. ${He} misses, smearing ${his} kiss along your cheek and past your ear, but you take ${his} face in your hands and kiss ${him} properly as ${subSlave.slaveName} begins to do ${his2} best to relax and get you off, fearful that worse is in store if ${he2} doesn't submit.`);
			eventSlave.devotion += 4;
			seX(subSlave, "anal", eventSlave, "penetrative");
			seX(subSlave, "oral", V.PC, "penetrative");
			subSlave.trust -= 4;
			subSlave.devotion += 4;
			if (canPenetrate(eventSlave) && canImpreg(subSlave, eventSlave)) {
				knockMeUp(subSlave, 20, 1, eventSlave.ID);
			}

			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[
				s => s.fetish !== "mindbroken",
				s => s.daughters > 0,
				hasBothArms,
				canMove,
				canTalk,
				canHear,
				s => s.devotion > 20,
				s => s.sexualQuirk === "perverted" || s.energy > 80,
				s => s.belly < 100000,
				s => s.lactation > 0,
				s => s.boobsImplant / s.boobs < .60,
			],
			[ // and subslave
				s => s.fetish !== "mindbroken",
				isSlaveAvailable,
				hasAnyArms,
				canTalk,
				canHear,
				s => s.mother === this.actors[0] || s.father === this.actors[0],
				s => App.Utils.sexAllowedByID(s, this.actors[0])
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, his, him, himself, girl
		} = getPronouns(eventSlave);
		const {say} = getEnunciation(eventSlave);
		const {
			him2, his2, he2, He2, daughter2, himself2
		} = getPronouns(subSlave).appendSuffix("2");

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

		let meal = jsEither(["breakfast", "lunch", "dinner"]);
		const {mother, mommy} = subSlave.mother === eventSlave.ID ? {mother: "mother", mommy: "Mommy"} : {mother: "father", mommy: "Daddy"};
		let t = [];

		if (meal === "breakfast") {
			t.push(`At the beginning of`);
		} else if (meal === "lunch") {
			t.push(`At the midpoint of`);
		} else {
			t.push(`Near the end of`);
		}
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, subSlave, true), `'s scheduled day, you come across ${him2} curled up in ${his2} ${mother}`));
		t.push(App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(eventSlave), `'s lap, face buried in ${his} bosom. ${eventSlave.slaveName} is running a gentle hand`));
		if (eventSlave.hLength > 5) {
			t.push(`through ${subSlave.slaveName}'s hair,`);
		} else {
			t.push(`across ${subSlave.slaveName}'s scalp,`);
		}
		t.push(`and is softly ${say}ing something to ${him2}. As you approach, you catch the end of it.`);
		if (eventSlave.genes === "XX" && subSlave.tankBaby < 1) {
			t.push(Spoken(eventSlave, `"I missed doing this for you so much,"`), `${he} murmurs.`, Spoken(eventSlave, `"It's so nice to do it again."`));
		} else if (eventSlave.genes === "XY") {
			t.push(Spoken(eventSlave, `"This feels so good,"`), `${he} murmurs.`, Spoken(eventSlave, `"I could get used to this."`));
		} else {
			t.push(Spoken(eventSlave, `"I never got to do this for you when you were a baby,"`), `${he} murmurs.`, Spoken(eventSlave, `"It's so nice to do it now."`));
		}
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${subSlave.slaveName} is nursing, lustily sucking at one of ${eventSlave.slaveName}'s breasts, ${his2} ${subSlave.skin} throat bobbing as ${he2} swallows gulp after gulp of ${his2} ${mother}'s milk.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} shifts a little, and giggles.`);
		if (eventSlave.genes === "XX" && subSlave.tankBaby < 1) {
			t.push(Spoken(eventSlave, `"Of course it's a little bit different now. Ooh,`));
		} else if (eventSlave.genes === "XY") {
			t.push(Spoken(eventSlave, `"And it's even more fun when you do that too. Ooh,`));
		} else {
			t.push(Spoken(eventSlave, `"And it's even more fun since we're doing it now. Ooh,`));
		}
		let hands = "anus";
		if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0) {
			t.push(Spoken(eventSlave, `harder, sweetie."`), `${subSlave.slaveName}'s ${hasBothArms(subSlave) ? "hands aren't" : "hand isn't"} visible, but ${his} lewd movements make it obvious that ${he2}'s`);
			if (canAchieveErection(eventSlave)) {
				t.push(`giving ${his2} ${mother} a handjob`);
			} else {
				t.push(`playing with ${his2} ${mother}'s limp dick`);
			}
			actX(eventSlave, "penetrative");
			hands = "dick";
		} else if (canDoVaginal(eventSlave)) {
			t.push(Spoken(eventSlave, `deeper, sweetie."`), `${subSlave.slaveName}'s ${hasBothArms(subSlave) ? "hands aren't" : "hand isn't"} visible, but ${he}'s obviously using`);
			if (eventSlave.vagina > 2) {
				t.push(`a fist to fuck ${his} ${mother}'s loose pussy`);
			} else if (eventSlave.vagina > 1) {
				t.push(`a couple of fingers to pleasure ${his} ${mother}'s pussy`);
			} else {
				t.push(`a finger to pleasure ${his} ${mother}'s tight pussy`);
			}
			seX(subSlave, "penetrative", eventSlave, "vaginal");
			hands = "vagina";
		} else if (canDoAnal(eventSlave)) {
			t.push(Spoken(eventSlave, `deeper, sweetie."`), `${subSlave.slaveName}'s ${hasBothArms(subSlave) ? "hands aren't" : "hand isn't"} visible, but ${he} obviously has`);
			if (eventSlave.anus > 2) {
				t.push(`a fist up ${his} ${mother}'s huge asspussy`);
			} else if (eventSlave.anus > 1) {
				t.push(`a couple of fingers up ${his} ${mother}'s butt`);
			} else {
				t.push(`a finger up ${his} ${mother}'s tight ass`);
			}
			seX(subSlave, "penetrative", eventSlave, "anal");
		} else {
			t.push(Spoken(eventSlave, `just like that, sweetie."`), `${subSlave.slaveName}'s ${hasBothArms(subSlave) ? "hands aren't" : "hand isn't"} visible, but it's obvious ${he}'s using`);
			if (hasBothArms(subSlave)) {
				t.push(`them`);
			} else {
				t.push(`it`);
			}
			t.push(`to manually pleasure ${his} ${mother}`);
		}
		t.push(`while ${he2} nurses. ${eventSlave.slaveName} notices you first, of course, and`);
		if (canSee(eventSlave)) {
			t.push(`looks up at`);
		} else {
			t.push(`turns to`);
		}
		t.push(`you complacently.`, Spoken(eventSlave, `"Hi, ${getWrittenTitle(eventSlave)},"`), `${he} ${say}s quietly, ${his}`);
		if (eventSlave.voice > 2) {
			t.push(`bimbo's`);
		} else if (eventSlave.voice > 1) {
			t.push(`pretty`);
		} else {
			t.push(`deep`);
		}
		t.push(`voice thick with arousal.`);
		if (subSlave.dietMilk) {
			t.push(Spoken(eventSlave, `"I'm feeding my ${daughter2} ${his2} ${meal},"`));
		} else if (subSlave.sexualQuirk === "perverted") {
			t.push(Spoken(eventSlave, `"${He2}'s such a fun little pervert,"`));
		} else if (eventSlave.sexualQuirk === "perverted") {
			t.push(Spoken(eventSlave, `"It's perverted of me to enjoy this, but I can't help it,"`));
		} else if (eventSlave.relationship > 2 && eventSlave.relationshipTarget === subSlave.ID) {
			t.push(Spoken(eventSlave, `"Since we're already together, this feels natural,"`));
		} else {
			t.push(Spoken(eventSlave, `"I know milk isn't a big part of my ${daughter2}'s diet, but this is mostly for fun,"`));
		}
		t.push(`${he} adds impishly.`);
		if (canHear(subSlave)) {
			t.push(`Hearing this,`);
		} else {
			t.push(`Realizing your presence,`);
		}
		t.push(`${subSlave.slaveName} lets the breast pop free of ${his2}`);
		if (subSlave.lips > 95) {
			t.push(`facepussy`);
		} else if (subSlave.lipsImplant > 0) {
			t.push(`fake lips`);
		} else if (subSlave.lips > 20) {
			t.push(`big lips`);
		} else {
			t.push(`mouth`);
		}
		t.push(`so ${he2} can turn around and greet you too, but ${he2} hurries back to the nipple afterward, and doesn't stop stimulating ${his2} ${mother} for a moment.`);
		if (eventSlave.lactation > 0) {
			eventSlave.lactationDuration = 2;
			eventSlave.boobs -= eventSlave.boobsMilk;
			eventSlave.boobsMilk = 0;
		}

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result("That looks delicious", delicious),
			((eventSlave.relationship <= 3 && eventSlave.relationship >= 0) && (subSlave.relationship <= 4 && subSlave.relationship >= 0) && (canTalk(subSlave)))
				? new App.Events.Result("This is clearly a basis for a relationship", relationship)
				: new App.Events.Result(),
			new App.Events.Result("Shame them", shame),
		]);

		function delicious() {
			const frag = document.createDocumentFragment();
			t = [];
			t.push(`The motherly ${SlaveTitle(eventSlave)}'s breast milk looks delicious. ${He}'s lactating`);
			if (eventSlave.lactation > 1) {
				t.push(`so unnaturally that each jiggle transmitted to ${his} unoccupied breast by ${subSlave.slaveName}'s nursing produces a spurt from the free nipple.`);
			} else {
				t.push(`naturally, but in such healthy profusion that a milky stream is running down ${his} unoccupied breast.`);
			}
			t.push(`You get down beside ${subSlave.slaveName} and start nursing too.`);
			t.push(Spoken(eventSlave, `"Oh, ${getWrittenTitle(eventSlave)},"`), `gasps ${eventSlave.slaveName}, as much from surprise as from the additional stimulation. Then ${he} sighs contentedly, and goes back to petting ${subSlave.slaveName}'s head. ${He} picks up ${his} other hand and hesitates, not sure whether ${he} should stroke ${his} owner's hair, but you take ${his} hand in yours and place it on the back of your head. There's a sharp intake of breath in the chest behind the breast you're nursing from, and ${he} strokes your head with a motherly caress, gently holding you against ${his} milky tit as you drain it of its cream.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${subSlave.slaveName} reaches out to touch you, too, and before long you and ${subSlave.slaveName} are sharing ${eventSlave.slaveName}'s loving lap. By the time you and ${subSlave.slaveName} have drunk your fill, all three of you have climaxed at least once.`);
			if (subSlave.balls) {
				if (V.PC.balls) {
					t.push(`Both you and ${subSlave.slaveName} blew your loads all over ${eventSlave.slaveName}'s`);
					if (eventSlave.belly >= 5000) {
						t.push(`lap and underbelly,`);
					} else {
						t.push("lap,");
					}
					t.push(`making quite a mess. ${subSlave.slaveName}`);
					if (subSlave.fetish === "cumslut") {
						t.push(`greedily`);
					} else {
						t.push(`dutifully`);
					}
					t.push(`licks it all up, sparing so much oral attention for ${his2} ${mother}'s`);
					if (canAchieveErection(eventSlave)) {
						t.push(`softening`);
						seX(subSlave, "oral", eventSlave, "penetrative");
					} else if (eventSlave.dick > 0) {
						t.push(`soft cock`);
						seX(subSlave, "oral", eventSlave, "penetrative");
					} else {
						t.push(`pussy`);
						seX(subSlave, "oral", eventSlave, "vaginal");
					}
					t.push(`that ${he} orgasms yet again, moaning ${his} ${daughter2}'s name.`);
				} else {
					t.push(`${subSlave.slaveName}`);
					if (canAchieveErection(subSlave)) {
						t.push(`blew ${his2} load all over`);
					} else {
						t.push(`leaked ${his2} cum out onto`);
					}
					t.push(`${his2} ${mother}'s lap`);
					if (eventSlave.belly >= 5000) {
						t.push(`and underbelly`);
					}
					t.push(t.pop() + ";");
					t.push(`as ${he} heads off to shower, ${eventSlave.slaveName} scoops it off ${himself}`);
					if (eventSlave.fetish === "cumslut") {
						t.push(`and greedily sucks it down.`);
					} else {
						t.push(`and licks it off ${his} fingers.`);
					}
				}
			} else if (subSlave.lactation) {
				const bellyAdj = bellyAdjective(eventSlave);
				t.push(`${subSlave.slaveName}'s own breasts responded to all the stimulation by leaking all over ${eventSlave.slaveName}'s `);
				if (eventSlave.belly >= 5000) {
					t.push(`${bellyAdj}`);
					if (eventSlave.bellyPreg >= 3000) {
						t.push(`pregnant`);
					}
				}
				t.push(`belly; as ${he} heads off to shower, ${eventSlave.slaveName} laughingly chides ${subSlave.slaveName} for making such a milky mess of ${his2} own ${mother}.`);
			}
			eventSlave.trust += 3;
			subSlave.trust += 3;
			seX(subSlave, "oral", eventSlave, "mammary");
			App.Events.addParagraph(frag, t);
			frag.append(App.Events.eventFetish(eventSlave, "boobs"));
			frag.append(App.Events.eventFetish(subSlave, "boobs"));
			return frag;
		}

		function relationship() {
			const frag = document.createDocumentFragment();
			t = [];
			t.push(`Deciding that this should be encouraged, you praise ${eventSlave.slaveName} for ${his} close relationship to ${his} ${daughter2}.`, Spoken(eventSlave, `"Thank you, ${getWrittenTitle(eventSlave)},"`), `${he} ${say}s.`);
			t.push(Spoken(eventSlave, `"I try to be the best`));
			if (subSlave.mother === eventSlave.ID) {
				t.push(`mom`);
			} else {
				t.push(`dad`);
			}
			t.push(`I can." ${He} bends and kisses the top of ${subSlave.slaveName}'s head.`);
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${subSlave.slaveName}`);
			if (eventSlave.nipples !== "fuckable") {
				t.push(`lets the nipple pop free of`);
			} else {
				t.push(`releases the nipple from`);
			}
			t.push(`${his2} mouth and looks up at ${eventSlave.slaveName}.`, Spoken(subSlave, `"That's silly, ${mommy}," ${he2} scolds, using an exaggeratedly whiny tone.`));
			if (eventSlave.dick > 0 && eventSlave.chastityPenis === 0) {
				t.push(Spoken(subSlave, `"I'm jerking you off,`));
			} else if (canDoVaginal(eventSlave)) {
				t.push(Spoken(subSlave, `"I'm fingerbanging you,`));
			} else if (canDoAnal(eventSlave)) {
				t.push(Spoken(subSlave, `"I'm fingerfucking your butthole,`));
			} else {
				t.push(Spoken(subSlave, `"I'm giving you a handjob,`));
			}
			t.push(`and you're totally enjoying it!" ${He2} sticks out ${his2} tongue, and does something with ${his2} hand that makes ${eventSlave.slaveName} shudder helplessly.`);
			t.push(Spoken(subSlave, `"Admit it, you're basically my fuckbuddy, or even my ${girl}friend!"`));
			App.Events.addParagraph(frag, t);
			t = [];

			if (subSlave.sexualQuirk === "perverted") {
				t.push(Spoken(eventSlave, `"You're one t-to t-talk, you little perv,"`), `${he} gasps.`);
			} else if (eventSlave.sexualQuirk === "perverted") {
				t.push(Spoken(eventSlave, `"I c-can't h-help it,"`), `${he} gasps.`, Spoken(eventSlave, `"You're so h-hot, sweetie. I d-dream about you."`));
			} else {
				t.push(Spoken(eventSlave, `"W-we're f-fuckslaves, sweetie,"`), `${he} gasps.`, Spoken(eventSlave, `"I h-have to."`));
			}
			t.push(`${He} pulls ${himself} together and continues.`, Spoken(eventSlave, `"And I think we're going t-to be b-both. Both ${mother} and ${daughter2}, and lovers."`));
			t.push(`${He} pulls ${subSlave.slaveName} up into an embrace and kisses ${him2} hungrily. "My pretty little ${mother} lover." ${subSlave.slaveName} giggles and kisses ${eventSlave.slaveName} back. The older slave is suffused with lust, any lingering shriek of revulsion inside ${his} head drowned out by`);
			if (eventSlave.sexualQuirk === "perverted") {
				t.push(`sexual perversion.`);
			} else {
				t.push(`the urge to satisfy ${his} needs.`);
			}
			t.push(`"Come here," ${he} moans,`);
			if (eventSlave.fetishKnown) {
				switch (eventSlave.fetish) {
					case "submissive":
						t.push(Spoken(eventSlave, `"and do whatever you want with me. Use me, sweetie."`));
						SimpleSexAct.Slaves(eventSlave, subSlave, 1);
						break;
					case "cumslut":
						t.push(Spoken(eventSlave, `"let ${mommy}`));
						if (canDoVaginal(subSlave)) {
							t.push(`eat you out."`);
							seX(subSlave, "vaginal", eventSlave, "oral");
						} else if (subSlave.dick > 0 && subSlave.chastityPenis === 0) {
							t.push(Spoken(eventSlave, `suck your dick."`));
							seX(subSlave, "penetrative", eventSlave, "oral");
						} else {
							t.push(Spoken(eventSlave, `kiss you."`));
						}
						break;
					case "humiliation":
						t.push(Spoken(eventSlave, `"let's do it right here. I want all the other slaves to know what an incestuous old slut I am."`));
						SimpleSexAct.Slaves(eventSlave, subSlave, 1);
						break;
					case "buttslut":
						if (canPenetrate(subSlave)) {
							t.push(Spoken(eventSlave, `"and stick that beautiful cock up ${mommy}'s butt."`));
						} else {
							t.push(Spoken(eventSlave, `"fuck ${mommy}'s butt."`));
						}
						seX(eventSlave, "anal", subSlave, "penetrative");
						if (canPenetrate(subSlave) && canImpreg(eventSlave, subSlave)) {
							knockMeUp(eventSlave, 5, 1, subSlave.ID);
						}
						break;
					case "boobs":
						t.push(Spoken(eventSlave, `suck ${mommy}'s tits dry. Massage my boobs with your hands while you nurse, that's all I need."`));
						seX(subSlave, "oral", eventSlave, "mammary");
						break;
					case "sadist":
						t.push(Spoken(eventSlave, `"let ${mommy} rape you. Come on, struggle for me."`));
						SimpleSexAct.Slaves(subSlave, eventSlave, 1);
						break;
					case "masochist":
						t.push(Spoken(eventSlave, `"and do whatever you want with me. Just, just, you have to hurt me. Rape me, sweetie."`));
						SimpleSexAct.Slaves(eventSlave, subSlave, 1);
						break;
					case "dom":
						t.push(Spoken(eventSlave, `"be ${mommy}'s little bitch. Come on, sweetie, relax. It'll be easier."`));
						SimpleSexAct.Slaves(subSlave, eventSlave, 1);
						break;
					case "pregnancy":
						if (canDoVaginal(eventSlave) && canPenetrate(subSlave) && eventSlave.mpreg === 0) {
							t.push(Spoken(eventSlave, `"fill my pussy with your cum. Make a sister for yourself."`));
							seX(subSlave, "penetrative", eventSlave, "vaginal");
							if (canImpreg(eventSlave, subSlave)) {
								knockMeUp(eventSlave, 5, 0, subSlave.ID);
							}
						} else if (canDoAnal(eventSlave) && canPenetrate(subSlave) && eventSlave.mpreg === 1) {
							t.push(Spoken(eventSlave, `"fill my ass with your cum. I know it seems wrong, but that's where my babies come from. So please, make a sister for yourself."`));
							seX(eventSlave, "anal", subSlave, "penetrative");
							if (canImpreg(eventSlave, subSlave)) {
								knockMeUp(eventSlave, 5, 1, subSlave.ID);
							}
						} else if (eventSlave.pregKnown === 1) {
							t.push(Spoken(eventSlave, `"and keep doing that. Just, just touch my belly, too.`));
							if (eventSlave.preg > eventSlave.pregData.minLiveBirth) {
								t.push(Spoken(eventSlave, `You're going to have a sister soon."`));
							} else if (eventSlave.belly >= 10000) {
								t.push(Spoken(eventSlave, `Your ${eventSlave.pregType > 1 ? "sisters are" : "sister is"} kicking away, say hello to your family."`));
							} else if (eventSlave.belly >= 5000) {
								t.push(Spoken(eventSlave, `I'm getting pretty big with your new ${eventSlave.pregType > 1 ? "sisters" : "sister"}, aren't I"`));
							} else if (eventSlave.belly >= 1500) {
								t.push(Spoken(eventSlave, `Can you feel that swell? It's your new ${eventSlave.pregType > 1 ? "sisters" : "sister"}."`));
							} else if (eventSlave.belly >= 100) {
								t.push(Spoken(eventSlave, `Can you feel that swelling? It's your new ${eventSlave.pregType > 1 ? "sisters" : "sister"}.`));
							} else {
								t.push(Spoken(eventSlave, `I know you can't tell, but your ${eventSlave.pregType > 1 ? "sisters" : "sister"} are growing in there."`));
							}
						} else {
							t.push(Spoken(eventSlave, `"make love to me. Maybe someday I'll be able to give you a sister."`));
							SimpleSexAct.Slaves(eventSlave, subSlave, 1);
						}
						break;
					default:
						t.push(Spoken(eventSlave, `"${mother}fucker."`));
						SimpleSexAct.Slaves(eventSlave, subSlave, 1);
				}
			} else {
				t.push(Spoken(eventSlave, `"${mother}fucker."`));
				SimpleSexAct.Slaves(eventSlave, subSlave, 1);
			}
			eventSlave.devotion += 5;
			subSlave.devotion += 5;
			eventSlave.relationship = 4;
			subSlave.relationship = 4;
			eventSlave.relationshipTarget = subSlave.ID;
			subSlave.relationshipTarget = eventSlave.ID;

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

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

			t.push(`${eventSlave.slaveName} and ${subSlave.slaveName} are properly trained sex slaves, and you wonder whether they still understand exactly how perverted it is to, respectively, nurse one's adult child while getting masturbated by ${him2}, and drink one's ${mother}'s milk while playing with ${his} private parts. So, you decide to explain it to them. You start with ${eventSlave.slaveName}, cuttingly asking whether ${he} understands that ${his} relationship with ${his} ${daughter2} is irrevocably polluted by incest.`);
			if (eventSlave.fetish === "humiliation") {
				if (eventSlave.fetishKnown) {
					t.push(`Getting ${his} nipples sucked on and ${his} ${hands} played with by ${his} own ${daughter2} out in the open already had the humiliation slut's cheeks flaming with shame and arousal, and your words are so deliciously crushing that ${he} gasps once, twice, and then, on ${his} ${daughter2}'s next stroke with ${his2} hand, climaxes, crying with abject overstimulation.`);
					eventSlave.devotion += 3;
					if (eventSlave.fetishStrength <= 95) {
						t.push(`This is some of the strongest sexual humiliation ${he}'s ever experienced, and ${he} <span class="fetish inc">only wants more.</span>`);
						eventSlave.fetishStrength += 5;
					}
				} else {
					t.push(`${He} begins to cry, strangely, choking and gagging on ${his} tears. Something is troubling ${him} even more than you expected, and it soon becomes obvious what it is: ${he}'s getting off on being taunted this way. ${subSlave.slaveName} hesitates, but ${his2} ${mother} begs ${him2} to keep playing with ${his} hands, sobbing all the while, until ${he} finally climaxes. ${He}'s a humiliation fetishist, and all the more devoted to you now that ${he} knows what a slut for degradation ${he} really is.`);
					eventSlave.fetishKnown = 1;
					eventSlave.devotion += 5;
				}
			} else {
				t.push(`${He} starts, thinks for a moment, and then begins to cry, tears running down ${his} ${eventSlave.skin} cheeks and pattering onto ${subSlave.slaveName}'s head. Doubtful, ${subSlave.slaveName} slows ${his2} heavy petting, but you order ${him2} to keep doing it, making ${eventSlave.slaveName} sob harder. ${He}'s terrified at what ${he}'s become, and convinced ${he}'s lost to sexual slavery forever. ${He} wails as ${he} climaxes, very much against ${his} will.`);
				eventSlave.trust -= 3;
				eventSlave.devotion += 3;
			}
			App.Events.addParagraph(frag, t);
			t = [];

			t.push(`${subSlave.slaveName} is left in the crying ${eventSlave.slaveName}'s lap, with ${his2} ${mother}'s`);
			if (hands === "dick") {
				t.push(`cum all over ${his2} hands.`);
			} else if (hands === "vagina") {
				t.push(`pussyjuice all over ${his2} hands.`);
			} else {
				t.push(`anal sphincter squeezing ${his2} fingers as ${his} orgasm fades.`);
			}
			if (subSlave.fetish === "humiliation") {
				t.push(`You don't even have to explicitly shame ${him2}.`);
				if (eventSlave.fetishKnown) {
					t.push(`${He2} keeps drinking from ${his2} weeping ${mother}'s tits, ${his2} cheeks flaming red with lust and arousal. The humiliation slut shivers, extremely aware of your eyes on ${his2} naked back.`);
					subSlave.devotion += 3;
					if (subSlave.fetishStrength <= 95) {
						t.push(`${He2}'s crying too, some remaining sense of self control screaming at ${him2} on the inside, but ${he2} visibly stamps on it, <span class="fetish inc">giving ${himself2} up to the shame.</span>`);
						subSlave.fetishStrength += 5;
					}
				} else {
					t.push(`${He2}'s more affected by all this than even you expected. It seems ${he2}'s a humiliation fetishist, and ${he2} buries ${his2} face in ${his2} ${mother}'s boobs, shaking with arousal and shame, goosebumps springing up across ${his2} skin as ${he2} focuses on ${his2} new feelings.`);
					subSlave.fetishKnown = 1;
					subSlave.devotion += 5;
				}
			} else {
				t.push(`You ask ${him2} if ${he2} knows what ${he2}'s just done, rhetorically, and then helpfully explain that it's a little weird to nurse at age ${subSlave.actualAge}, and bit perverted to play with ${his2} ${mother}'s hands. ${subSlave.slaveName} hangs ${his2} head, and then makes to bury it in ${his2} weeping ${mother}'s heaving breasts to hide ${his2} face in shame, but stops when ${he2} realizes what ${he2}'s doing. ${He2}'s scared, unable to find anything ${he2} can do to make this better, and takes refuge in your merciful orders to go clean ${himself2} up.`);
				subSlave.trust -= 3;
				subSlave.devotion += 3;
			}
			App.Events.addParagraph(frag, t);
			return frag;
		}
	}
};