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

	actorPrerequisites() {
		return [
			[ // event slave /InterestTargetID
				isSlaveAvailable,
				s => (s.fetish === "none" || s.fetishStrength <= 60),
				s => (canSee(s) || canHear(s)),
				s => s.rules.speech !== "restrictive",
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "boobs"),
				s => s.lactation > 0
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {he2, his2} = getPronouns(subSlave).appendSuffix("2");
		const {say} = getEnunciation(eventSlave);

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

		if (subSlave.lactation > 0) {
			subSlave.lactationDuration = 2;
			subSlave.boobs -= subSlave.boobsMilk;
			subSlave.boobsMilk = 0;
		} else {
			induceLactation(subSlave, 4);
		}

		let t = [];

		t.push(`On lunch duty today is`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(V.PC, subSlave, true), "."));
		t.push(`That means that as you eat your working lunch, ${he2} sits on the edge of your desk right next to you, so that`);
		if (subSlave.belly >= 100000) {
			t.push(`a nipple is`);
		} else {
			t.push(`${his2} nipples are`);
		}
		t.push(`conveniently at mouth height. Whenever you feel thirsty, you lean`);
		if (subSlave.nipples === "partially inverted" || subSlave.nipples === "inverted") {
			t.push(`over, pop one out,`);
		} else if (subSlave.nipples === "fuckable") {
			t.push(`over, slip your tongue deep inside,`);
		} else {
			t.push("over,");
		}
		t.push(`take some of ${his2} creamy, ${subSlave.milkFlavor === "none" ? `` : `${subSlave.milkFlavor} flavored `}milk straight from the source. Every time you do, ${he2} shudders convulsively,`);
		if (canTalk(subSlave)) {
			t.push(`giving little mewling whimpers.`);
		} else {
			if (subSlave.accent >= 3) {
				t.push(`giving little mewling whimpers.`);
			} else if (subSlave.voice === 0) {
				t.push(`making the harsh gasping noises that are all ${he2} can manage, as a mute.`);
			} else {
				t.push(`giving small moans through ${his2} obstructed mouth.`);
			}
		}
		t.push(`Though you never touch anything but ${his2} nipples, ${he2} climaxes twice. After you finish and ${he2} leaves, you notice`);
		t.push(contextualIntro(V.PC, eventSlave, true), `at the door to your office. You call ${him} in.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if (eventSlave.dick > 0 && eventSlave.chastityPenis === 1) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls === 0) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he} passed by while you were drinking from`, contextualIntro(eventSlave, subSlave), `and found the`);
		if (canSee(eventSlave)) {
			t.push(`sight`);
		} else {
			t.push(`sounds`);
		}
		t.push(`rather compelling. It should be possible to either encourage this fascination or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into another breast fetishist`, turn),
			new App.Events.Result(`Steer ${him} away from breast obsession for the moment`, steer),
		]);

		function turn() {
			t = [];

			if (!canTalk(eventSlave)) {
				if (eventSlave.accent >= 3) {
					if (!hasAnyArms(eventSlave)) {
						t.push(`Since ${he} isn't conversant in ${V.language} and lacks the hands to gesture, ${he}'s forced to push out ${his} chest and wiggle to try to communicate that ${he} would like to experience a nipple orgasm, too.`);
					} else {
						t.push(`Since ${he} isn't conversant in ${V.language}, ${he}'s forced to use some delightfully lewd gestures at ${his} own boobs to communicate that ${he} would like to experience a nipple orgasm, too.`);
					}
				} else if (eventSlave.voice === 0) {
					if (!hasAnyArms(eventSlave)) {
						t.push(`${He}'s mute and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like to experience a nipple orgasm, too.`);
					} else {
						t.push(`${He}'s mute, so ${he} uses gestures to ask you for a nipple orgasm, too.`);
					}
				} else {
					t.push(`${He} can't form`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`words and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like to experience a nipple orgasm, too.`);
					} else {
						t.push(`words, so ${he} uses gestures to ask you for a nipple orgasm, too.`);
					}
				}
			} else {
				if (eventSlave.lips > 70) {
					t.push(`${He} ${say}s through ${his} massive dick-sucking lips,`);
				} else if (eventSlave.piercing.lips.weight + eventSlave.piercing.tongue.weight > 2) {
					t.push(`${He} ${say}s through ${his} big oral piercings,`);
				} else {
					t.push(`${He} ${say}s,`);
				}
				t.push(Spoken(eventSlave, `"${getWrittenTitle(eventSlave)}, may I have a nipple orgasm, too?"`));
			}
			t.push(`You make ${him} state it more explicitly, so ${he} tries again:`);
			if (!hasAnyArms(eventSlave) && !canTalk(eventSlave)) {
				t.push(`${he} sticks ${his} chest out as far as it will go, and wiggles it back and forth demonstratively.`);
			} else if (!canTalk(eventSlave)) {
				t.push(`${he} tries to depict suckling and orgasm with ${his}`);
				if (hasBothArms(eventSlave)) {
					t.push(`hands,`);
				} else {
					t.push(`hand,`);
				}
				t.push(`but gives up and just sticks ${his} tits out at`);
				if (eventSlave.nipples === "fuckable") {
					t.push(`you while fingering ${his} nipplecunts.`);
				} else {
					t.push(`you, pinching ${his} nipples hard.`);
				}
			} else {
				t.push(Spoken(eventSlave, `"Please use my boobs, ${getWrittenTitle(eventSlave)}!"`));
			}
			t.push(`${He} gasps as you seize ${him} and carry ${him}`);
			if (V.PC.belly >= 30000) {
				t.push(`to the couch, but ${he}'s clearly pleased. While you would rather sit ${him} on your lap, you are far too pregnant to fit ${him}; instead you settle ${him} beside you and torment`);
			} else {
				t.push(`back to your desk chair, but ${he}'s clearly pleased. You sit in the chair with ${him} in your lap facing away from`);
				if (V.PC.boobs >= 300) {
					t.push(`you, ${his} back against your breasts and torment`);
				} else {
					t.push(`you, and torment`);
				}
			}
			t.push(`${his} nipples until ${he}'s close to climax. Then you get ${him} on`);
			if (hasBothLegs(eventSlave)) {
				t.push(`${his} knees`);
			} else {
				t.push(`the floor`);
			}
			t.push(`and push ${him} over the edge with`);
			if (V.PC.dick !== 0) {
				if (eventSlave.nipples === "fuckable") {
					t.push(`your cock and fingers deep inside ${his}`);
				} else {
					t.push(`your cock between ${his}`);
				}
			} else {
				if (eventSlave.nipples === "fuckable") {
					t.push(`your fingers deep inside ${his}`);
				} else {
					t.push(`your pussy rubbing against the stiff nipples atop ${his}`);
				}
			}
			if (eventSlave.boobs > 40000) {
				t.push(`gargantuan`);
			} else if (eventSlave.boobs > 25000) {
				t.push(`immense`);
			} else if (eventSlave.boobs > 10000) {
				t.push(`ridiculous`);
			} else if (eventSlave.boobs > 5000) {
				t.push(`enormous`);
			} else if (eventSlave.boobs > 3200) {
				t.push(`giant`);
			} else if (eventSlave.boobs > 1600) {
				t.push(`huge`);
			} else if (eventSlave.boobs > 800) {
				t.push(`big`);
			} else if (eventSlave.boobs > 300) {
				t.push(`modest`);
			} else {
				t.push(`flat`);
			}
			if (eventSlave.boobs > 300) {
				t.push(`tits.`);
			} else {
				t.push(`chest.`);
			}
			t.push(`<span class="devotion inc">${He} has become more devoted to you,</span> and <span class="fetish gain">${his} sexuality now focuses on ${his} breasts.</span>`);
			eventSlave.devotion += 4;
			seX(eventSlave, "mammary", V.PC, "penetrative");
			eventSlave.fetish = "boobs";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			if (eventSlave.lactation > 0) {
				eventSlave.lactationDuration = 2;
				eventSlave.boobs -= eventSlave.boobsMilk;
				eventSlave.boobsMilk = 0;
			} else {
				t.push(induceLactation(eventSlave, 5));
			}
			return t;
		}

		function steer() {
			t = [];
			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in nipple play,`);
			if (canDoVaginal(eventSlave) || (eventSlave.dick > 0 && !(eventSlave.chastityPenis))) {
				t.push(`and let ${him} masturbate while`);
				if (V.PC.dick === 0) {
					t.push(`eating you out,`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				} else {
					t.push(`sucking you off,`);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
				t.push(`to associate non-mammary intercourse with pleasure.`);
			} else {
				t.push(`and play with ${him} until ${he} orgasms while carefully keeping ${his} boobs and nipples untouched and unstimulated.`);
			}
			t.push(`You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave /InterestTargetID
				isSlaveAvailable,
				s => (s.fetish === "none" || s.fetishStrength <= 60),
				s => (canSee(s) || canHear(s)),
				s => s.rules.speech !== "restrictive",
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "buttslut"),
				s => s.anus > 0,
				canDoAnal
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {he2, his2, himself2} = getPronouns(subSlave).appendSuffix("2");
		const {say} = getEnunciation(eventSlave);

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

		if (canImpreg(subSlave, V.PC)) {
			knockMeUp(subSlave, 5, 1, -1);
		}
		seX(subSlave, "anal", V.PC, "penetrative");

		let t = [];
		t.push(`In the middle of the afternoon, you take a break from work to fuck`);
		t.push(contextualIntro(V.PC, subSlave, true));
		t.push(`in your office. ${subSlave.slaveName} is such a complete buttslut that ${he2}'s enjoying ${himself2} to an almost indecent degree: moaning, begging, or just smiling idiotically with ${his2} mouth open and ${his2} tongue lolling. After you finish and ${he2} leaves, you notice`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`at the door to your office. You call ${him} in.`);
		App.Events.addParagraph(node, t);
		t = [];
		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he} passed by while you were buttfucking`, contextualIntro(eventSlave, subSlave), `and found the`);
		if (canSee(eventSlave)) {
			t.push(`sight`);
		} else {
			t.push(`sounds`);
		}
		t.push(`rather compelling. It should be possible to either encourage this fascination or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into another anal slut`, turn, virginityWarning()),
			new App.Events.Result(`Steer ${him} away from anal obsession for the moment`, steer),
		]);

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

		function turn() {
			t = [];
			if (!canTalk(eventSlave)) {
				if (eventSlave.accent >= 3) {
					if (!hasAnyArms(eventSlave)) {
						t.push(`Since ${he} isn't conversant in ${V.language} and lacks the hands to gesture, so it takes a long, frustrating time for ${him} to communicate that ${he} would like you to do to ${him} what you did to ${subSlave.slaveName}.`);
					} else {
						t.push(`Since ${he} isn't conversant in ${V.language}, so ${he} uses gestures to ask you to do to ${him} what you did to ${subSlave.slaveName}.`);
					}
				} else if (eventSlave.voice === 0) {
					if (!hasAnyArms(eventSlave)) {
						t.push(`${He}'s mute and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like you to do to ${him} what you did to ${subSlave.slaveName}.`);
					} else {
						t.push(`${He}'s mute, so ${he} uses gestures to ask you to do to ${him} what you did to ${subSlave.slaveName}.`);
					}
				} else {
					t.push(`${He} can't form`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`words and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like you to do to ${him} what you did to ${subSlave.slaveName}.`);
					} else {
						t.push(`words, so ${he} uses gestures to ask you to do to ${him} what you did to ${subSlave.slaveName}.`);
					}
				}
			} else {
				if (eventSlave.lips > 70) {
					t.push(`${He} ${say}s through ${his} massive dick-sucking lips,`);
				} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
					t.push(`${He} ${say}s through ${his} big oral piercings,`);
				} else {
					t.push(`${He} ${say}s,`);
				}
				t.push(Spoken(eventSlave, `"${getWrittenTitle(eventSlave)}, would you please do me like that?"`));
			}
			t.push(`You make ${him} state it more explicitly, so ${he} tries again:`);
			if (!hasAnyArms(eventSlave) && !canTalk(eventSlave)) {
				t.push(`${he} wriggles around until ${his} ass is pointed straight at you,`);
				if (canDoAnal(eventSlave)) {
					t.push(`lets out a deep breath, and relaxes ${his} sphincter visibly.`);
				} else {
					t.push(`and bounces ${his} rear enticingly.`);
				}
			} else if (!canTalk(eventSlave)) {
				t.push(`${he} tries to depict anal sex with hand gestures, then gives up and turns around and points to ${his} ass.`);
			} else {
				t.push(Spoken(eventSlave, `"Please fuck my butt, ${getWrittenTitle(eventSlave)}!"`));
			}
			if (canDoAnal(eventSlave)) {
				t.push(`${He} squeaks with surprise as you throw ${him} on the couch, but ${his} eagerness is obvious. ${He} does everything right, relaxing as you`);
				if (V.PC.dick === 0) {
					t.push(`push a strap-on into`);
				} else {
					t.push(`enter`);
				}
				t.push(`${his} ass and enjoying ${himself} all the way through. ${He} climaxes hard to`);
				if (V.PC.dick === 0) {
					t.push(`the phallus`);
				} else {
					t.push(`the cock`);
				}
				t.push(`in ${his} asshole. <span class="devotion inc">${He} has become more devoted to you,</span> and <span class="fetish gain">${his} sexuality now focuses on ${his} anus.</span>`);
				t.push(VCheck.Anal(eventSlave, 1));
			} else if (V.PC.dick !== 0) {
				t.push(`${He} squeaks with surprise as you push ${him}`);
				if (eventSlave.belly >= 300000) {
					t.push(`onto ${his} ${bellyAdjective(eventSlave)}`);
					if (eventSlave.bellyPreg >= 1500) {
						t.push(`pregnancy`);
					} else {
						t.push(`belly`);
					}
				} else if (eventSlave.belly >= 5000) {
					t.push(`against the couch`);
				} else {
					t.push(`onto the couch`);
				}
				t.push(`and`);
				if (eventSlave.butt >= 6) {
					t.push(`hug ${his}`);
					if (eventSlave.butt <= 6) {
						t.push(`gigantic`);
					} else if (eventSlave.butt <= 7) {
						t.push(`ridiculous`);
					} else if (eventSlave.butt <= 10) {
						t.push(`immense`);
					} else if (eventSlave.butt <= 14) {
						t.push(`inhuman`);
					} else if (eventSlave.butt <= 20) {
						t.push(`absurdly massive`);
					}
					t.push(`ass around your cock. Deep within its quivering`);
					if (eventSlave.buttImplant / eventSlave.butt > .60) {
						t.push(`firmness,`);
					} else {
						t.push(`softness,`);
					}
					t.push(`you can clearly feel how excited ${he} is over ${his} rear getting the attention it deserves. While ${he} may have expected anal, you've decided otherwise, so you go to work savoring the depths of ${his} butt cheeks. ${He} is`);
					if (!canTalk(eventSlave)) {
						t.push(`practically`);
					}
					t.push(`mewling with lust by the time you cum in ${him}, joining you in orgasm as ${he} feels your seed trickle down ${his} lower back and down to ${his} chastity belt.`);
				} else if (eventSlave.butt >= 2) {
					t.push(`slip your cock between ${his}`);
					if (eventSlave.butt <= 3) {
						t.push(`big`);
					} else if (eventSlave.butt <= 4) {
						t.push(`huge`);
					} else if (eventSlave.butt <= 5) {
						t.push(`enormous`);
					}
					if (eventSlave.buttImplant / eventSlave.butt > .60) {
						t.push(`firm`);
					} else {
						t.push(`soft`);
					}
					t.push(`buttocks, atop ${his} anal chastity. You let ${him} quiver with anticipation for a little before reminding ${him} that the belt's removal is a reward for good slaves, and you might give release ${him} from it one day — but that ${he} doesn't deserve it yet. With that, you begin thrusting against ${his} rear, enjoying the twin pairs off flesh against your palms. ${He} is`);
					if (!canTalk(eventSlave)) {
						t.push(`practically`);
					}
					t.push(`mewling with lust by the time you cum on ${him}, joining you in orgasm as ${he} feels your seed trickle down ${his} lower back and down to ${his} chastity belt.`);
				} else {
					t.push(`rest your cock between ${his}`);
					if (eventSlave.butt <= 0) {
						t.push(`flat`);
					} else {
						t.push(`small`);
					}
					t.push(`buttocks, atop ${his} anal chastity. You let ${him} quiver with anticipation for a little before reminding ${him} that the belt's removal is a reward for good slaves, and you might give release ${him} from it one day — but that ${he} doesn't deserve it yet. With that, you begin thrusting between what can barely be called an ass. ${He} is`);
					if (!canTalk(eventSlave)) {
						t.push(`practically`);
					}
					t.push(`mewling with lust by the time you cum on ${him}, joining you in orgasm as ${he} feels your seed trickle down ${his} lower back and down to ${his} chastity belt.`);
				}
				t.push(`<span class="devotion inc">${He} has become more devoted to you,</span> and <span class="fetish gain">${his} sexuality now focuses on ${his} rear end.</span>`);
				seX(subSlave, "anal", V.PC, "penetrative");
			} else {
				t.push(`You trace a dildo around ${his} anal chastity before reminding ${him} that the belt's removal is a reward for good slaves, and you might give release ${him} from it one day — but that ${he} doesn't deserve it yet. With that, you run your hand across the quivering slave's rump, sending ${him} over the edge.`);
				t.push(`<span class="devotion inc">${He} has become more devoted to you,</span> and <span class="fetish gain">${his} sexuality now focuses on ${his} rear end.</span>`);
			}
			eventSlave.devotion += 4;
			eventSlave.fetish = "buttslut";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];
			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in anal sex,`);
			if (canDoVaginal(eventSlave) || (eventSlave.dick > 0 && !(eventSlave.chastityPenis))) {
				t.push(`and let ${him} masturbate while`);
				if (V.PC.dick === 0) {
					t.push(`eating you out,`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				} else {
					t.push(`sucking you off,`);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
				t.push(`to associate non-anal intercourse with pleasure.`);
			} else {
				t.push(`and play with ${him} until ${he} orgasms while carefully keeping ${his} ass untouched and unstimulated.`);
			}
			t.push(`You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			return t;
		}
	}
};

repo_name: Fekenol/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // event slave /InterestTargetID
				s => App.Events.qualifiesForREFIeventSlave(s)
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "cumslut"),
				s => ["none", "ring gag"].includes(s.mouthAccessory),
				s => canMove(s) || hasAnyArms(s),
				canTaste
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {he2, his2, He2} = getPronouns(subSlave).appendSuffix("2");

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

		let t = [];

		if (V.PC.dick > 0) {
			t.push(`You wake up to the sensation of`);
			t.push(contextualIntro(V.PC, subSlave, true));
			t.push(`eagerly sucking your dick. ${He2}'s industriously pumping ${his2} mouth up and down on your member. In truth, ${subSlave.slaveName} doesn't give the perfect blowjob: ${he2} loves cum so much that ${he2} mostly enjoys oral sex in an anticipatory way, and usually works to make the recipient cum as soon as possible so as to get ${his2} favorite treat into ${his2} mouth quicker. Still, ${his2} enthusiasm is nice and ${he2} does have permission to wake you at your usual time in this way. As you get up after finishing, you notice`);
			t.push(contextualIntro(subSlave, eventSlave, true));
			t.push(`at the door to your bedroom. You call ${him} in.`);
			seX(subSlave, "oral", V.PC, "penetrative");
		} else {
			t.push(`You come across ${subSlave.slaveName} in the middle of what appears to be an impromptu blowbang, one that seems to be drawing to a close. One by one, the citizens pull out of ${his2} wide-open mouth and splash cum into it. The bliss on ${his2} face is obvious even from where you are standing, and as you watch the scene unfolding before you, you notice`);
			t.push(contextualIntro(subSlave, eventSlave, true));
			t.push(`at the door of the room. You call ${him} in.`);
			actX(subSlave, "oral", 4);
		}

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

		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he} passed by while`, contextualIntro(eventSlave, subSlave), `was`);
		if (V.PC.dick === 0) {
			t.push(`in the midst of ${his2} little oral party.`);
		} else {
			t.push(`blowing you.`);
		}

		t.push(`${He} swallows painfully at the`);
		if (canSee(eventSlave)) {
			t.push(`sight of the satisfied cumslut swirling the ejaculate around ${his2} mouth.`);
		} else {
			t.push(`sound of the satisfied cumslut savoring the fresh load.`);
		}
		t.push(`It should be possible to either encourage this fascination or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into a cumslut too`, turn),
			new App.Events.Result(`Steer ${him} away from cum obsession for the moment`, steer),
		]);

		function turn() {
			t = [];

			t.push(`Focusing a slave's sexuality on cum isn't as easy as some other manipulations, for the simple reason that even you have a limited supply of the stuff and it would be a shame to waste it all on ${him}. So, you take another approach; you instruct ${eventSlave.slaveName} to accompany ${subSlave.slaveName}, and vice versa, whenever their duties permit. They're to act as sexual partners, and share cum whenever there's any forthcoming. They spend the week giving blowjobs whenever they can, and making out to swap the cum back and forth afterward. If someone insists on penetrating them instead, that just means that the other has to suck it out of them before they can share it. Most importantly, ${eventSlave.slaveName} is punished if ${he} ever orgasms without cum in ${his} mouth. Soon, ${he} gets aroused by the mere`);
			if (canSmell(eventSlave)) {
				t.push(`scent`);
			} else {
				t.push(`thought`);
			}
			t.push(`of the stuff. <span class="devotion inc">${He} has become more submissive to you,</span> and <span class="fetish gain">${his} sexuality now focuses on cum.</span>`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", "public", "penetrative", 50);
			seX(subSlave, "oral", "public", "penetrative", 50);
			eventSlave.fetish = "cumslut";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];

			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in cum, and`);
			if ((canDoVaginal(eventSlave) && eventSlave.vagina > 0) || (canDoAnal(eventSlave) && eventSlave.anus > 0)) {
				t.push(`fuck ${him} until ${he} orgasms, but you are careful to keep your cum well away from ${him}.`);
			} else {
				t.push(`enjoy ${him} until ${he} orgasms, making sure to not involve cum at all.`);
			}
			t.push(`You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more submissive to you.</span>`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			eventSlave.devotion += 4;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave /domInterestTargetID
				s => App.Events.qualifiesForREFIeventSlave(s)
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "dom"),
				canMove,
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {He2, he2, his2, him2} = getPronouns(subSlave).appendSuffix("2");
		const {hisU, himU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');

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

		let t = [];
		if (subSlave.vagina > 0 || subSlave.anus > 0) {
			t.push(`${subSlave.slaveName} is riding another slave,`);
			if (hasAnyArms(subSlave)) {
				t.push(`${his2} hand${hasBothArms(subSlave) ? "s" : ""} pinning ${himU} down.`);
			} else {
				t.push(`shifting ${his2} weight to keep ${himU} pinned down.`);
			}
			if (subSlave.vagina > 0 && canDoVaginal(subSlave)) {
				actX(subSlave, "vaginal");
			} else {
				actX(subSlave, "anal");
			}
		} else {
			t.push(`${subSlave.slaveName} is straddling another slave, ${his2}`);
			if (subSlave.dick > 0) {
				t.push(`cock in ${hisU} mouth.`);
				actX(subSlave, "penetrative");
			} else {
				if (subSlave.vagina > 0) {
					t.push(`pussy`);
					actX(subSlave, "vaginal");
				} else {
					t.push(`ass`);
					actX(subSlave, "anal");
				}
				t.push(`pressed to ${hisU} face.`);
			}
		}
		t.push(`The slave${girlU} had been disobedient, and ${hisU} punishment was to let`);
		t.push(contextualIntro(V.PC, subSlave, true));
		t.push(`dominate ${himU}. The truth is this is also ${his2} reward; ${he2} is such a dominant that ${he2}'s prone to lashing out at your other slaves if ${he2} isn't given a proper outlet. Sure enough, ${his2} moans begin to increase in pitch and frequency, reaching a crescendo as ${he2} comes to an orgasm. Once you feel the poor ${girlU} beneath ${him2} has had enough, you give ${subSlave.slaveName} the order to dismount. ${He2}`);
		if (canMove(subSlave)) {
			t.push(`leaves`);
		} else {
			t.push(`is taken from`);
		}
		t.push(`your office with a smile on ${his2} face, passing`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(subSlave, eventSlave, true), ", who is"));
		if (isAmputee(eventSlave)) {
			t.push(`propped limblessly nearby. ${He} has`);
		} else if (!hasAnyLegs(eventSlave)) {
			t.push(`propped helplessly nearby. ${He} has`);
		} else if (!canWalk(eventSlave)) {
			t.push(`kneeling in the doorway with`);
		} else if (canStand(eventSlave)) {
			t.push(`standing in the doorway with`);
		} else {
			t.push(`seated in the doorway with`);
		}
		t.push(`a troubled look on ${his} face.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if ((eventSlave.dick > 0) && (eventSlave.chastityPenis === 1)) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he}`);
		if (canMove(subSlave)) {
			t.push(`passed`);
		} else {
			t.push(`was carried`);
		}
		t.push(`by while ${subSlave.slaveName} was dominating the other slave${girlU} and found the ${canSee(eventSlave) ? "sight" : "sounds"} rather compelling. It should be possible to either encourage this fascination with domination or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into a dominant too`, turn),
			new App.Events.Result(`Steer ${him} away from total domination for the moment`, steer),
		]);

		function turn() {
			t = [];

			if (canWalk(eventSlave) && canSee(eventSlave)) {
				t.push(`You order a passing slave to come in and kneel besides you, then snap your fingers at ${eventSlave.slaveName} and point commandingly at ${himU}. You tell ${him} that a proper dom does what ${he} wants — with your permission, of course — and order ${him} to get started on the other slave.`);
			} else if (isAmputee(eventSlave)) {
				t.push(`You place ${eventSlave.slaveName}'s helpless body on the floor next to your desk, then order a passing slave to come in and service ${him}. You tell ${him} that a proper dom does what he wants — with your permission, of course — and order ${him} to tell the other slave what to do.`);
			} else {
				t.push(`You order a passing slave to come in and kneel besides you, then guide ${eventSlave.slaveName} to the waiting slave. You tell ${him} that a proper dom does what ${he} wants — with your permission, of course — and order ${him} to get started on the other slave.`);
			}
			t.push(`Then, you watch as ${he} begins to use the other slave as ${his} plaything. ${eventSlave.slaveName} spends almost all ${his} sexual experiences dominating other slaves for the rest of the week. The other slaves who have sex with ${him} are ${his} to use, not for ${him} to make love to. ${He} has become more obedient, and ${his} sexuality now focuses on domination.`);
			eventSlave.devotion += 4;
			actX(eventSlave, "penetrative", 10);
			eventSlave.fetish = "dom";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];

			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in domination, and`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(`make ${him} take`);
				if (V.PC.dick === 0) {
					t.push(`a strap-on you've put on, hard.`);
				} else {
					t.push(`your dick, hard.`);
				}
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				t.push(`make ${him} take`);
				if (V.PC.dick === 0) {
					t.push(`a strap-on you've put on, hard.`);
				} else {
					t.push(`your dick, hard.`);
				}
				t.push(VCheck.Anal(eventSlave, 1));
			} else {
				if (V.PC.dick !== 0) {
					t.push(`ram your dick down ${his} throat`);
					if (V.PC.vagina !== -1) {
						t.push(`and make ${him} eat you out`);
						seX(eventSlave, "oral", V.PC, "vaginal");
					}
					t.push(t.pop() + '.');
				} else {
					t.push(`mash your clit in ${his} face, making ${him} eat you out.`);
				}
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			t.push(`You ensure that ${he} maintains the submissive role throughout. You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more obedient.</span>`);
			eventSlave.devotion += 4;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave /InterestTargetID
				s => App.Events.qualifiesForREFIeventSlave(s)
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "humiliation"),
				s => ((s.anus > 0 && canDoAnal(s)) || (s.vagina > 0 && canDoVaginal(s))),
				s => s.belly < 30000
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {he2, his2, him2, He2} = getPronouns(subSlave).appendSuffix("2");

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

		if (canDoVaginal(subSlave) && subSlave.vagina > 0) {
			seX(subSlave, "vaginal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)){
				knockMeUp(subSlave, 5, 0, -1);
			}
		} else {
			seX(subSlave, "anal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)){
				knockMeUp(subSlave, 5, 1, -1);
			}
		}

		let t = [];
		t.push(`You have`);
		t.push(contextualIntro(V.PC, subSlave, true));
		t.push(`pinned up against a railing on a balcony that overlooks a public atrium. Passersby below cannot see you, but they can certainly see ${subSlave.slaveName}'s upper body as ${he2} takes your dick. ${He2}'s blushing furiously with the sex and with ${his2} trademark mixed arousal and embarrassment at having an audience. ${He2} makes a show of trying to disguise the fact that ${he2}'s getting railed, but it's obvious. When you finish, you pull ${him2} off the railing so ${he2} can clean up.`);
		t.push(contextualIntro(subSlave, eventSlave, true));
		if (canSee(eventSlave)) {
			t.push(`saw`);
		} else {
			t.push(`heard`);
		}
		t.push(`the denouement of this exhibitionist fun, and seems intrigued.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if (eventSlave.chastityPenis === 1) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`There was a glint of envy`);
		if (canSee(eventSlave)) {
			t.push(`in ${his} eyes when ${he} saw`);
		} else {
			t.push(`across ${his} face as ${he} listened to`);
		}
		t.push(`${subSlave.slaveName}'s satisfaction at being publicly used. It should be possible to either encourage this fascination with humiliation or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into a humiliation fetishist too`, turn, virginityWarning()),
			new App.Events.Result(`Steer ${him} away from humiliation fetishism for the moment`, steer),
		]);

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

		function turn() {
			t = [];

			t.push(`You bring ${eventSlave.slaveName} to the railing ${subSlave.slaveName} just left. For a long while, you just play with ${his} naked breasts,`);
			if (canSee(eventSlave)) {
				t.push(`requiring ${him} to look any member of the public below that stares at ${him} right in the eyes.`);
			} else {
				t.push(`making sure to keep ${him} well informed of how many passersby are ogling ${him}.`);
			}
			t.push(`${He} sobs and shakes with abject embarrassment`);
			if (canSee(eventSlave)) {
				t.push(`as ${he} locks eyes with person after person.`);
			} else {
				t.push(`as ${he} hears each whistle and catcall from onlookers.`);
			}
			t.push(`After enough of this, ${he}'s so sexually primed that ${he} orgasms convulsively almost immediately`);
			if ((canDoVaginal(eventSlave) && eventSlave.vagina > 0) || (canDoAnal(eventSlave) && eventSlave.anus > 0)) {
				t.push(`after you enter ${him} from behind.`);
			} else {
				t.push(`once run your hand across ${his} crotch.`);
			}
			t.push(`<span class="devotion inc">${He} has become more obedient,</span> and <span class="fetish gain">${his} sexuality now focuses on public humiliation.</span>`);
			if (canDoVaginal(eventSlave) && (eventSlave.vagina > 0 || eventSlave.anus === 0)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave)) {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			eventSlave.devotion += 4;
			eventSlave.fetish = "humiliation";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];
			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in humiliation and fuck ${him} privately in your office. You'll keep an eye on ${him}, and with this correction ${he}'ll become more obedient.`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				t.push(VCheck.Anal(eventSlave, 1));
			} else {
				t.push(SimpleSexAct.Player(eventSlave));
			}
			eventSlave.devotion += 4;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave
				s => App.Events.qualifiesForREFIeventSlave(s)
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "masochist"),
				s => (s.anus > 0 && canDoAnal(s)) || (s.vagina > 0 && canDoVaginal(s))
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {He2, he2, his2, him2} = getPronouns(subSlave).appendSuffix("2");

		App.Events.drawEventArt(node, [eventSlave, subSlave], "no clothing");
		const subBelly = bellyAdjective(subSlave);
		const domBelly = bellyAdjective(eventSlave);

		if (canDoAnal(subSlave) && subSlave.anus > 0) {
			seX(subSlave, "anal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)){
				knockMeUp(subSlave, 5, 1, -1);
			}
		} else {
			seX(subSlave, "vaginal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)) {
				knockMeUp(subSlave, 5, 0, -1);
			}
		}

		let t = [];
		if (subSlave.belly >= 1500) {
			t.push(`You have`);
			t.push(contextualIntro(V.PC, subSlave, true));
			t.push(`lying down on your desk, and are seeing to your own amusement and ${his2} masochistic streak at once. ${He2} has ${his2} body flat on the surface, but is unrestrained, and has been told that ${he2} must not rise off it at all, nor tilt ${his2} bulk to either side. You then tell ${his2} to count strokes and begin to flog ${his2} ${subBelly} belly with a leathern`);
			if (subSlave.pregKnown === 1) {
				t.push(`instrument, taking care not to cause ${his2} pregnancy any lasting harm.`);
			} else {
				t.push("instrument.");
			}
			t.push(`Before long ${he2} is experiencing more pain than the human body can support without involuntary movement, and you tell ${him2} to go back one count whenever ${he2} does. At long last ${he2} completes the required number of blows, and lies quivering and sobbing, thanking you over and over, until ${he2} stiffens again at the`);
			if (canDoAnal(subSlave) && subSlave.anus > 0) {
				t.push(`burning sensation of a`);
				if (V.PC.dick) {
					t.push(`cock`);
				} else {
					t.push(`dildo`);
				}
				t.push(`stretching ${his2} anal sphincter. You are not gentle, and the rough sodomy combined with the burning of ${his2} outraged skin as you slap yourself against it maintains ${his2} pain high.`);
			} else {
				t.push(`sudden sensation of a`);
				if (V.PC.dick) {
					t.push(`cock`);
				} else {
					t.push(`dildo`);
				}
				t.push(`slamming deep into ${his2} pussy. You are not gentle, and the rough fucking combined with the burning of ${his2} outraged skin as you slap yourself against it maintains ${his2} pain high.`);
			}
			t.push(`Your grip around ${his2} neck only adds to ${his2} thrill.`);
		} else {
			t.push(`You have`);
			t.push(contextualIntro(V.PC, subSlave, true));
			t.push(`bent over your desk, and are seeing to your own amusement and ${his2} masochistic streak at once. ${He2} has ${his2} body flat on the surface, but is unrestrained, and has been told that ${he2} must not rise off it at all. You then tell ${him2} to count strokes and begin to flog ${his2}`);
			if (subSlave.butt <= 0) {
				t.push(`flat`);
			} else if (subSlave.butt <= 1) {
				t.push(`small`);
			} else if (subSlave.butt <= 2) {
				t.push(`round`);
			} else if (subSlave.butt <= 3) {
				t.push(`curvy`);
			} else if (subSlave.butt <= 4) {
				t.push(`huge`);
			} else if (subSlave.butt <= 5) {
				t.push(`enormous`);
			} else if (subSlave.butt <= 6) {
				t.push(`gigantic`);
			} else if (subSlave.butt <= 7) {
				t.push(`ridiculous`);
			} else if (subSlave.butt <= 10) {
				t.push(`immense`);
			} else if (subSlave.butt <= 14) {
				t.push(`inhuman`);
			} else if (subSlave.butt <= 20) {
				t.push(`absurdly massive`);
			}
			t.push(`ass with a leathern instrument. Before long ${he2} is experiencing more pain than the human body can support without involuntary movement, and you tell ${him2} to go back one count whenever ${he2} does. At long last ${he2} completes the required number of blows, and lies quivering and sobbing, thanking you over and over, until ${he2} stiffens again at the`);
			if (canDoAnal(subSlave) && subSlave.anus > 0) {
				t.push(`burning sensation of a`);
				if (V.PC.dick) {
					t.push(`cock`);
				} else {
					t.push(`dildo`);
				}
				t.push(`stretching ${his2} anal sphincter. You are not gentle, and the rough sodomy combined with the burning of ${his2} outraged buttocks as you slap yourself against`);
				if (subSlave.butt < 2) {
					t.push(`it`);
				} else {
					t.push(`them`);
				}
				t.push(`maintains ${his2} pain high.`);
			} else {
				t.push(`sudden sensation of a`);
				if (V.PC.dick) {
					t.push(`cock`);
				} else {
					t.push(`dildo`);
				}
				t.push(`slamming deep into ${his2} pussy. You are not gentle, and the rough fucking combined with the burning of ${his2} outraged buttocks as you slap yourself against`);
				if (subSlave.butt < 2) {
					t.push(`it`);
				} else {
					t.push(`them`);
				}
				t.push(`maintains ${his2} pain high.`);
			}
		}
		t.push(`After you finish and ${he2}`);
		if (canMove(subSlave)) {
			t.push(`leaves`,);
		} else {
			t.push(`is taken away,`);
		}
		t.push(`wincing in agony`);
		if (subSlave.belly >= 1500) {
			t.push(`and short of breath`);
		}
		t.push(`but with a faraway look of release, you notice`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`at the door to your office. You call ${him} in.`);

		App.Events.addParagraph(node, t);
		t = [];
		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if ((eventSlave.dick > 0) && (eventSlave.chastityPenis === 1)) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he} passed by while you were beating`);
		t.push(contextualIntro(eventSlave, subSlave));
		t.push(`and found the`);
		if (canSee(eventSlave)) {
			t.push(`sight`);
		} else {
			t.push(`sounds`);
		}
		t.push(`rather compelling. It should be possible to either encourage this fascination or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into another pain slut`, turn, virginityWarning()),
			new App.Events.Result(`Steer ${him} away from pain obsession for the moment`, steer),
		]);

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

		function turn() {
			t = [];
			if (!canTalk(eventSlave)) {
				if (eventSlave.accent >= 3) {
					t.push(`Since ${he} doesn't speak ${V.language} well enough to handle the`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`subject and has no hands, it takes a long, frustrating time`);
					} else {
						t.push(`subject, ${he}'s forced to use delightfully humiliating gestures`);
					}
					t.push(`to communicate ${his} desire to be abused.`);
				} else if (eventSlave.voice === 0) {
					t.push(`${He}'s`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`mute and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like`);
					} else {
						t.push(`mute, so ${he} uses gestures to ask`);
					}
					t.push(`you to hurt ${him}, too.`);
				} else {
					t.push(`${He}'s incapable of forming`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`words and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like`);
					} else {
						t.push(`words, so ${he} uses gestures to ask`);
					}
					t.push(`you to hurt ${him}, too.`);
				}
			} else {
				if (eventSlave.lips > 70) {
					t.push(`${He} asks through ${his} massive dick-sucking lips,`);
				} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
					t.push(`${He} asks through ${his} big oral piercings,`);
				} else {
					t.push(`${He} asks,`);
				}
				t.push(Spoken(eventSlave, `"${getWrittenTitle(eventSlave)}, can — can you hurt me? Like that?"`));
			}
			t.push(`You make ${him} state it more explicitly, so ${he} tries again:`);
			if (!hasAnyArms(eventSlave) && !canTalk(eventSlave)) {
				t.push(`${he} wriggles ${himself} into a position where ${he} can lightly slap ${his} amputee ass against a chair leg.`);
			} else if (!canTalk(eventSlave)) {
				t.push(`${he} turns around and starts to spank ${himself} roughly.`);
			} else {
				t.push(Spoken(eventSlave, `"Please beat me, ${getWrittenTitle(eventSlave)}!"`));
			}
			t.push(`You shove ${him}`);
			if (eventSlave.belly >= 300000) {
				t.push(`over ${his} ${domBelly}`);
				if (eventSlave.bellyPreg >= 2000) {
					t.push(`pregnant`);
				}
				t.push(`belly,`);
			} else if (eventSlave.belly >= 1500) {
				t.push(`onto ${his} ${hasBothLegs(eventSlave) ? "knees" : "knee"},`);
			} else {
				t.push(`over the desk,`);
			}
			t.push(`rub your hand over ${his} ass, which is quivering with anticipation and fear, and ask if ${he} wants you to hit ${him}. ${He}'s almost beside ${himself}, shuddering at the titillation, but before ${he} can answer, you use your other hand to strike ${his}`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`caged dick.`);
			} else if (eventSlave.dick > 0) {
				t.push(`cockhead.`);
			} else if (eventSlave.vagina > -1 && canDoVaginal(eventSlave)) {
				t.push(`pussylips.`);
			} else if (eventSlave.belly >= 1500) {
				t.push(`distended middle.`);
			} else if (eventSlave.vagina > -1) {
				t.push(`chastity belt into ${his} pussylips.`);
			} else if (eventSlave.scrotum > 1) {
				t.push(`testicles.`);
			} else {
				t.push(`smooth crotch.`);
			}
			t.push(`As ${he} writhes in agony, you tell ${him} to get used to it. ${He}'s a pain slut now, second thoughts or not.`);
			if (canDoAnal(eventSlave)) {
				if (eventSlave.anus === 0) {
					t.push(`${He} hasn't recovered before ${he} feels the still more urgent pain of`);
					if (V.PC.dick !== 0) {
						t.push(`your dick brutally <span class="lime">taking ${his} anal virginity,</span>`);
					} else {
						t.push(`an enormous dildo <span class="lime">stealing ${his} anal virginity,</span>`);
					}
					t.push(`followed by rough anal,`);
					eventSlave.anus = 1;
				} else {
					t.push(`${He} hasn't recovered before ${he} feels the still more urgent pain of rough anal,`);
				}
				t.push(VCheck.Anal(eventSlave, 1));
			} else if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0) {
					t.push(`${He} hasn't recovered before ${he} feels the still more urgent pain of`);
					if (V.PC.dick !== 0) {
						t.push(`your dick brutally <span class="lime">stripping ${him} of ${his} virginity,</span>`);
					} else {
						t.push(`an enormous dildo <span class="lime">stealing ${his} virginity,</span>`);
					}
					t.push(`followed by rough sex,`);
					eventSlave.vagina = 1;
				} else {
					t.push(`${He} hasn't recovered before ${he} feels the still more urgent pain of`);
					if (V.PC.dick !== 0) {
						t.push(`your dick`);
					} else {
						t.push(`an enormous dildo`);
					}
					t.push(`slamming against ${his} cervix,`);
				}
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(`${He} hasn't recovered before ${he} feels`);
				switch (eventSlave.mouthAccessory) {
					case "dildo gag":
					case "massive dildo gag":
						t.push(`the relief of the dildo gag being drawn from ${his} throat before`);
						break;
					case "ball gag":
					case "bit gag":
					case "ring gag":
						t.push(`you unhook ${his} gag before`);
						break;
				}
				t.push(`the still more urgent pain of`);
				if (V.PC.dick !== 0) {
					t.push(`your dick getting shoved as deep down ${his} throat as you can,`);
				} else {
					t.push(`an enormous dildo forcing ${his} jaw wide and working its way down ${his} throat,`);
				}
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			t.push(`which is then overlaid by rough spanking, nipple pinching, and`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`cock torment.`);
			} else if (eventSlave.dick > 0) {
				t.push(`dick abuse.`);
			} else if (eventSlave.vagina > -1 && canDoVaginal(eventSlave)) {
				t.push(`clit torture.`);
			} else if (eventSlave.belly >= 1500) {
				t.push(`stomach abuse.`);
			} else if (eventSlave.vagina > -1) {
				t.push(`chastity assault.`);
			} else if (eventSlave.scrotum > 1) {
				t.push(`ball crushing.`);
			} else {
				t.push(`urethral torment.`);
			}
			t.push(`<span class="devotion inc">${He} has become more devoted to you,</span> and <span class="fetish gain">${he} has started to get off on pain.</span>`);
			eventSlave.devotion += 4;
			eventSlave.fetish = "masochist";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];
			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in pain play,`);
			if (canDoVaginal(eventSlave) || (eventSlave.dick > 0 && !(eventSlave.chastityPenis))) {
				t.push(`and let ${him} masturbate while`);
				if (V.PC.dick === 0) {
					t.push(`eating you out,`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				} else {
					t.push(`sucking you off,`);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
			} else {
				t.push(`and play with ${him} until ${he} orgasms while`);
				if (V.PC.dick === 0) {
					t.push(`eating you out, all while`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				} else {
					t.push(`sucking you off, all while`);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
			}
			t.push(`carefully keeping ${his} experience purely pleasurable. You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more submissive to you.</span>`);
			eventSlave.devotion += 4;

			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave
				s => App.Events.qualifiesForREFIeventSlave(s)
			],
			[ // and subslave
				s => App.Events.qualifiesForREFIsubSlave(s, "sadist"),
				hasAnyArms,
				s => canHear(s) || canSee(s)
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {He2, he2, his2, him2} = getPronouns(subSlave).appendSuffix("2");
		const {HeU, himU, girlU} = getNonlocalPronouns(V.seeDicks).appendSuffix('U');

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

		actX(subSlave, "penetrative");

		let t = [];
		t.push(`You are in your office, watching as`);
		t.push(contextualIntro(V.PC, subSlave, true));
		t.push(`takes a riding crop to another slave. This has become an almost daily occurrence, as ${he2} is liable to strike out against your other slaves out-of-turn if ${he2} isn't allowed to get a chance to satisfy ${his2} sadistic streak. The slave`);
		if (hasBothLegs(subSlave)) {
			t.push(`at ${his2} feet`);
		} else {
			t.push(`before ${him2}`);
		}
		t.push(`is a quivering mess, though you've given ${subSlave.slaveName} strict instructions to not leave any permanent marks on the ${girlU}. The slave had been disobedient, and so you decided that you would let ${subSlave.slaveName} punish ${himU}. ${HeU} winces as ${he2} slowly drags the crop against the ${girlU}'s shoulder, and you do your best to hide the small smile that threatens to escape. After another minute or so of the riding crop, you tell ${subSlave.slaveName} that this is getting boring and to change it up. ${He2} gives you a wicked grin and gives`);
		if (subSlave.dick > 0 && canAchieveErection(subSlave)) {
			t.push(`${his2} cock`);
		} else {
			t.push(`the strap-on ${he2} is wearing`);
		}
		t.push(`a few rubs before unceremoniously stuffing it into ${his2} victim's asshole. You can't hide your smile this time as the poor ${girlU} gives a loud shriek, and a small noise at the doorway catches your attention. To your surprise, you see`);
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`at the door to your office. You call ${him} in.`);

		App.Events.addParagraph(node, t);
		t = [];
		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if ((eventSlave.dick > 0) && (eventSlave.chastityPenis === 1)) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.hormoneBalance >= 100)) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if ((eventSlave.dick > 0) && (eventSlave.balls === 0)) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he} passed by while`);
		t.push(contextualIntro(eventSlave, subSlave));
		t.push(`was beating the ${girlU} and found the`);
		if (canSee(eventSlave)) {
			t.push(`sight`);
		} else {
			t.push(`sounds`);
		}
		t.push(`rather compelling. It should be possible to either encourage this fascination or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Show ${him} how enjoyable causing pain is`, turn, virginityWarning()),
			new App.Events.Result(`Steer ${him} away from an obsession with causing pain for the moment`, steer),
		]);

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

		function turn() {
			t = [];
			if (!canTalk(eventSlave)) {
				if (eventSlave.accent >= 3) {
					t.push(`Since ${he} doesn't speak ${V.language} well enough to handle the`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`subject and has no hands, it takes a long, frustrating time`);
					} else {
						t.push(`subject, ${he}'s forced to use gestures`);
					}
					t.push(`to communicate ${his} desire to be abuse someone.`);
				} else if (eventSlave.voice === 0) {
					t.push(`${He}'s`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`mute and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like`);
					} else {
						t.push(`mute, so ${he} uses gestures to ask`);
					}
					t.push(`to hurt someone, too.`);
				} else {
					t.push(`${He}'s incapable of forming`);
					if (!hasAnyArms(eventSlave)) {
						t.push(`words and has no hands, so it takes a long, frustrating time for ${him} to communicate that ${he} would like`);
					} else {
						t.push(`words, so ${he} uses gestures to ask`);
					}
					t.push(`to hurt someone, too.`);
				}
			} else {
				if (eventSlave.lips > 70) {
					t.push(`${He} asks through ${his} massive dick-sucking lips,`);
				} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
					t.push(`${He} asks through ${his} big oral piercings,`);
				} else {
					t.push(`${He} asks,`);
				}
				t.push(Spoken(eventSlave, `"${getWrittenTitle(eventSlave)}, can — can I hurt someone? Like that?"`));
			}
			t.push(`You make ${him} state it more explicitly, so ${he} tries again:`);
			if (!hasAnyArms(eventSlave) && !canTalk(eventSlave)) {
				t.push(`${he} wriggles ${himself} into a position where ${he} can lightly slap ${his} amputee ass against a chair leg.`);
			} else if (!canTalk(eventSlave)) {
				t.push(`${he} turns around and starts to spank ${himself} roughly.`);
			} else {
				t.push(Spoken(eventSlave, `"Please let me beat someone, ${getWrittenTitle(eventSlave)}!"`));
			}
			t.push(`You call in another slave and have ${himU} kneel on the floor, ass up. You then hand ${him} a leathern cat-o-nine tails and tell ${him} to get busy, or ${he}'ll take the other slave's place. As you note the remorse on ${his} face, you tell ${him} to get used to it. One of ${his} jobs is to cause pain now, second thoughts or not.`);

			if (!hasAnyArms(eventSlave)) {
				t.push(`Using a switch is awkward when one's only means to grip it is with their mouth, so it takes ${him} several attempts before ${he} elicits the first gasp of pain from the slave. ${He} soon gets the hang of things and draws gasp after gasp from the ${girlU} until ${he} finally lands a solid strike, drawing blood and a agonized screech from ${his} toy. ${He} loses ${his} grip on the handle, unable to hold back the`);
				if (canTalk(eventSlave)) {
					t.push(`malicious laugh`);
				} else {
					t.push(`silent laugh`);
				}
				t.push(`that reveals ${his} sadistic side.`);
			} else {
				t.push(`It takes a few swings for ${him} to draw out the first gasp of pain from the slave, but once ${he} does, it's almost like ${he}'s been doing this ${his} entire life. Gasp after gasp escapes the writhing ${girlU} until ${he} lands a truly exquisite blow, drawing blood and a agonized screech from ${his} toy.`);
				if (canTalk(eventSlave)) {
					t.push(`Malicious laughter`);
				} else {
					t.push(`Silent laughter`);
				}
				t.push(`begins to escape ${his} lips as ${he} is properly introduced to the sadist inside ${him}.`);
			}
			t.push(`<span class="devotion inc">${He} has become more devoted to you,</span> and <span class="fetish gain">${he} has started to get off on causing pain.</span>`);
			eventSlave.devotion += 4;
			eventSlave.fetish = "sadist";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];
			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in dishing out pain,`);
			if (canDoVaginal(eventSlave) || (eventSlave.dick > 0 && eventSlave.chastityPenis === 0)) {
				t.push(`and let ${him} masturbate while`);
				if (V.PC.dick === 0) {
					t.push(`eating you out,`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				} else {
					t.push(`sucking you off,`);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
			} else {
				t.push(`and play with ${him} until ${he} orgasms while`);
				if (V.PC.dick === 0) {
					t.push(`eating you out, all while`);
					seX(eventSlave, "oral", V.PC, "vaginal");
				} else {
					t.push(`sucking you off, all while`);
					seX(eventSlave, "oral", V.PC, "penetrative");
				}
			}
			t.push(`carefully making sure ${he} only causes pleasure. You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more submissive to you.</span>`);
			eventSlave.devotion += 4;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // event slave
				s => App.Events.qualifiesForREFIeventSlave(s)
			],
			[ // and subslave /subID
				s => App.Events.qualifiesForREFIsubSlave(s, "submissive"),
				s => (canDoAnal(s) && s.anus > 0) || (canDoVaginal && s.vagina > 0),
				s => s.belly < 30000,
			]
		];
	}

	execute(node) {
		const [eventSlave, subSlave] = this.actors.map(a => getSlave(a));
		const {He, he, his, him, himself} = getPronouns(eventSlave);
		const {He2, he2, his2, him2} = getPronouns(subSlave).appendSuffix("2");

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

		if (canDoVaginal(subSlave) && (subSlave.vagina > 0)) {
			seX(subSlave, "vaginal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)) {
				knockMeUp(subSlave, 5, 0, -1);
			}
		} else {
			seX(subSlave, "anal", V.PC, "penetrative");
			if (canImpreg(subSlave, V.PC)){
				knockMeUp(subSlave, 5, 1, -1);
			}
		}

		let t = [];
		t.push(`You have`, contextualIntro(V.PC, subSlave, true), `lying on the edge of your desk with ${his2}`);
		if (subSlave.belly >= 1500) {
			t.push(`bloated`);
		}
		t.push(`body helpless beneath you, your `);
		if (V.PC.dick !== 0) {
			t.push(`dick`);
		} else {
			t.push(`strap-on`);
		}
		t.push(`inside ${him2}, and your hands around ${his2} neck. It's just breath play, and you're practiced enough that ${he2}'s in no danger. ${He2}'s such a sexual submissive that ${he2} sometimes acts out if not managed. This happens when ${he2} feels the urge to misbehave in order to access punishment, so you personally ensure that ${he2} can indulge ${his2} submissiveness when ${he2} needs it. ${He2} does not orgasm with you, ${his2} complete servitude to your pleasure fulfilling a deeper need than that. ${He2}`);
		if (canMove(subSlave)) {
			t.push(`leaves`);
		} else {
			t.push(`is taken from`);
		}
		t.push(`your office with a serene look on ${his2} face, passing`);
		t.push(App.UI.DOM.combineNodes(contextualIntro(subSlave, eventSlave, true), ", who is"));
		if (isAmputee(eventSlave)) {
			t.push(`propped limblessly nearby. ${He} has`);
		} else if (!hasAnyLegs(eventSlave)) {
			t.push(`propped helplessly nearby. ${He} has`);
		} else if (!canWalk(eventSlave)) {
			t.push(`kneeling in the doorway with`);
		} else if (canStand(eventSlave)) {
			t.push(`standing in the doorway with`);
		} else {
			t.push(`seated in the doorway with`);
		}
		t.push(`a troubled look on ${his} face.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`${eventSlave.slaveName} hesitates before explaining ${himself}, and the ${SlaveTitle(eventSlave)} is obviously aroused:`);
		if (eventSlave.dick > 0 && eventSlave.chastityPenis === 1) {
			t.push(`${he}'s got a string of precum leaking out of ${his} chastity cage.`);
		} else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100) {
			t.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls > 0 && eventSlave.ballType === "sterile") {
			t.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.dick > 0 && eventSlave.balls === 0) {
			t.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (canAchieveErection(eventSlave)) {
			if (eventSlave.dick > 4) {
				t.push(`${his} gigantic cock is standing out like a mast.`);
			} else if (eventSlave.dick > 2) {
				t.push(`${he}'s sporting an impressive erection.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${his} little penis is rock hard.`);
			}
		} else if (eventSlave.dick > 7) {
			t.push(`${he}'s got a string of precum coming off ${his} engorged member.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${he}'s got a string of precum coming off ${his} limp member.`);
		} else if (eventSlave.clit > 0) {
			t.push(`${his} large clit is visibly engorged.`);
		} else if (eventSlave.vagina > -1) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there's a sheen on ${his} pussylips.`);
		} else if (eventSlave.balls > 0) {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a distinct dribble of precum running from ${his} featureless crotch.`);
		} else {
			if (eventSlave.nipples !== "fuckable") {
				t.push(`${his} nipples are hard and`);
			}
			t.push(`there is a clear scent of lust around ${him}.`);
		}
		t.push(`It seems ${he}`);
		if (canMove(subSlave)) {
			t.push(`passed`);
		} else {
			t.push(`was carried`);
		}
		t.push(`by while you were dominating ${subSlave.slaveName}.`);
		if (hasAnyArms(eventSlave)) {
			t.push(`As though it has a mind of its own, ${his} hand reaches up toward ${his} throat.`);
		}
		t.push(`It should be possible to either encourage this fascination with submission or steer ${him} away from it for now.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Turn ${him} into a submissive too`, turn),
			new App.Events.Result(`Steer ${him} away from total submission for the moment`, steer),
		]);

		function turn() {
			t = [];

			if (canWalk(eventSlave) && canSee(eventSlave)) {
				t.push(`You snap your fingers at ${eventSlave.slaveName} and point commandingly at the floor next to your desk. You tell ${him} that a proper sub does what ${his} dom wants, always, and leave ${him} kneeling obediently beside you for some time.`);
			} else if (isAmputee(eventSlave)) {
				t.push(`You place ${eventSlave.slaveName}'s helpless body on the floor next to your desk. You tell ${him} that a proper sub does what ${his} dom wants, always, and leave ${him} lying obediently beside you for some time.`);
			} else {
				t.push(`You guide ${eventSlave.slaveName} to the floor next to your desk and push ${him} to`);
				if (hasBothLegs(eventSlave)) {
					t.push(`${his} knees.`);
				} else {
					t.push(`the floor.`);
				}
				t.push(`You tell ${him} that a proper sub does what ${his} dom wants, always, and leave ${him} waiting obediently beside you for some time.`);
			}
			t.push(`Then, without preamble, you stand up again and`);
			if (V.PC.dick === 0) {
				t.push(`ride ${his} face,`);
			} else {
				t.push(`throatfuck ${him},`);
			}
			t.push(`intentionally ensuring that ${he} gags and struggles. ${eventSlave.slaveName} spends almost all ${his} sexual experiences in subspace for the rest of the week. Even other slaves who have sex with ${him} are required to use ${him}, not make love to ${him}. ${He} has become more obedient, and ${his} sexuality now focuses on submission.`);
			eventSlave.devotion += 4;
			seX(eventSlave, "oral", V.PC, "penetrative", 2);
			actX(eventSlave, "oral", 10);
			eventSlave.fetish = "submissive";
			eventSlave.fetishKnown = 1;
			eventSlave.fetishStrength = 65;
			return t;
		}

		function steer() {
			t = [];

			t.push(`Good slaves get aroused according to their masters' whim, not their own silly tendencies. You call ${eventSlave.slaveName} over before ${he} can give voice to ${his} interest in submission, and make ${him}`);
			if (canDoVaginal(eventSlave) && eventSlave.vagina > 0) {
				t.push(`ride`);
				if (V.PC.dick === 0) {
					t.push(`a strap-on you're wearing.`);
				} else {
					t.push(`your dick.`);
				}
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else if (canDoAnal(eventSlave) && eventSlave.anus > 0) {
				t.push(`ride`);
				if (V.PC.dick === 0) {
					t.push(`a strap-on you're wearing.`);
				} else {
					t.push(`your dick.`);
				}
				t.push(VCheck.Anal(eventSlave, 1));
			} else {
				if (V.PC.dick !== 0) {
					t.push(`suck you off`);
					if (V.PC.vagina !== -1) {
						t.push(`and eat you out`);
					}
				} else {
					t.push(`eat you out`);
				}
				t.push(`at ${his} own pace.`);
				seX(eventSlave, "oral", V.PC, "penetrative");
			}
			t.push(`You ensure that ${he} maintains the active role throughout. You'll keep an eye on ${him}, and with this correction <span class="devotion inc">${he}'ll become more obedient.</span>`);
			eventSlave.devotion += 4;
			return t;
		}
	}
};


code:
App.Events.refsBaronDemand = class refsBaronDemand extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].FSNeoImperialist > random(25, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0),
			() => V.arcologies[0].FSNeoImperialistLaw2 === 1,
		];
	}

	execute(node) {
		const costYes = 8500;
		const costGifts = 2000;

		App.Events.addParagraph(node, [`One of your Barons has approached you with an elegantly-worded but rather entitled letter demanding that you increase his already extraordinarily generous stipend and allow for more individual freedom in the management of his arcology district. The petition appears to be supported by a number of other powerful Barons, who have tacked their name on in asking for similar advantages.`]);

		App.Events.addParagraph(node, [`"We manage and control the day-to-day operations of this entire Arcology," the letter reads, "And without us it would collapse in a matter of weeks. As such, you will not find our enclosed demands unreasonable, of greater rights and privileges for the daunting task of management and rule in your Immortal name, mighty Emperor..."`]);

		const choices = [];
		if (V.cash >= costYes) {
			choices.push(new App.Events.Result(`Accept their conditions as a show of good faith`, accept, `Will cost ${cashFormat(costYes)}`));
		}
		choices.push(new App.Events.Result(`Flat out refuse them`, refuse));
		if (V.cash >= costGifts) {
			choices.push(new App.Events.Result(`Refuse their demands, but placate them with gifts and ceremonies`, gifts, `Will cost ${cashFormat(costGifts)}`));
		}
		App.Events.addResponses(node, choices);

		function accept() {
			repX(2000, "event");
			cashX(-costYes, "event");
			return `You gracefully accept the demands of your Barons, granting them a number of minor new rights and increasing their luxurious Imperial stipends further. Predictably, the Barons are overjoyed at your flat acceptance, and shower you with praise and compliments for a few days before returning to the management of their now wealthier districts, enriched at the expense of your treasury.`;
		}

		function refuse() {
			V.arcologies[0].prosperity -= 3;
			repX(-2000, "event");
			return `You laugh at the Baron's petition and inform them that nothing will be changing, and they had best think twice before coming to you with any similar nonsense. The Barons proceed to sulk and grumble for the next month, half-assedly managing their districts and spreading nasty gossip about your supposedly 'tyrannical' mistreatment of your ever-so-loyal vassals.`;
		}

		function gifts() {
			cashX(-costGifts, "event");
			return `You invite the Barons to a party at your penthouse, informing them of your refusal of the petition over expensive wines and foreign slavegirl entertainment brought in for the evening's amusement. Although the pompous Barons do sulk somewhat at your refusal, the free drink and girls is more than enough to distract even these wealthy intellectuals, and the whole notion of additional Baron privileges is forgotten over the course of one drunken, expensive celebration.`;
		}
	}
};


code:
App.Events.refsBodyPurismEncounter = class refsBodyPurismEncounter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].FSBodyPurist > random(25, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0),
		];
	}

	execute(node) {
		const cost = 1000;
		const slave = GenerateNewSlave("XX", {
			minAge: 36, maxAge: 42, ageOverridesPedoMode: 1, disableDisability: 1, race: "nonslave"
		});
		slave.devotion = 20;
		slave.trust = 20;
		setHealth(slave, -30, Math.max(normalRandInt(5, 3), 0), normalRandInt(10, 3));
		slave.boobs = random(7, 11) * 30;
		slave.hips = 0;
		slave.butt = 0;
		slave.weight = 0;
		slave.waist = random(-10, 10);
		slave.muscles = Math.min(slave.muscles, 30);
		slave.clothes = "conservative clothing";

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

		App.Events.drawEventArt(node, slave);

		App.Events.addParagraph(node, [`As a result of ${V.arcologies[0].name}'s adoption of body purism, a number of restorative spas, implant removal clinics and other cleansing businesses have begun to crop up around the arcology's various promenades and shopping districts. The citizens of ${V.arcologies[0].name} have taken to the idea of treating their bodies with sanctity — though not all are so quick to adopt the trend just because it's in vogue.`]);

		App.Events.addParagraph(node, [`On one particular outing, you come across a citizen outside a famous health spa staring pensively up at a poster advertising the variety of purification procedures on offer in the institution. The citizen's expression is wistful, if somewhat grave, and at odds with the display above ${him} lit up with pure unadulterated bodies, expensive health treatments and a plethora of natural cosmetic procedures. The citizen's clothes are ragged and sheer, revealing a number of implant scars around ${his} bust and rear, likely from a costly attempt to render ${himself} fashionable by having ${his} prior implants removed. With such visible scarring, it is unlikely that ${he} is one of the arcology's wealthier denizens, having paid the price to return ${his} body to its natural, unimplanted state.`]);

		const choices = [];
		choices.push(new App.Events.Result(`Keep walking`, ignore));
		if (V.cash >= cost) {
			choices.push(new App.Events.Result(`Pay for a day of treatment for ${him}`, pay, `The treatment will cost ${cashFormat(cost)}.`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to promote ${him}.`));
		}
		if (S.Attendant) {
			choices.push(new App.Events.Result(`Give ${him} a day of pampering with your attendant at your spa`, pamper));
		}
		App.Events.addResponses(node, choices);

		function ignore() {
			return `It's unfortunate that this citizen is unable to realize ${his} dreams, but that's the way of the Free Cities. There are winners, and there are losers.`;
		}

		function pay() {
			repX(5000, "event");
			cashX(-cost, "event");
			return `It takes a moment for you to convince the ${woman} that you aren't playing some cruel joke on ${him}, but once you do ${he} practically squeals with joy as you take ${him} through the doors of the spa and announce your intent to pay for a day of cleansing, pampering and luxury. When you next see ${him} it's on a wallscreen television at your penthouse praising you profusely. The rejuvenated young ${woman} has clearly spread word of your generosity across ${V.arcologies[0].name}.`;
		}

		function pamper() {
			const frag = new DocumentFragment();
			repX(1500, "event");

			App.Events.addParagraph(frag, [`You make your presence known to the citizen, and once the usual shock and disbelief have worn off it takes a moment to convince ${him} that your offer of a cleansing experience in your spa is neither a cruel joke nor an underhanded attempt to enslave ${him}. ${He} follows you back to the penthouse where you inform your attendant that the citizen is to be sequestered in the spa for a day of pampering, cleansing and rejuvenation. As the citizen passes through the doors to the spa, ${he} turns and blows you a kiss of gratitude.`]);

			App.Events.addParagraph(frag, [`When you stop by the spa later in the day, you spot the citizen luxuriating in a hot bath with a number of colorful health products spread across every visible surface of ${his} nude skin. From where you stand it is clear ${his} eyes are closed in immense contentment, while ${his} body floats relaxed and carefree in the bubbling water. When the citizen finally departs at the end of the a long day of purification in the spa, ${he} thanks you profusely and promises to tell everyone ${he} can of your generosity.`]);
			return frag;
		}
	}
};


code:
App.Events.refsDegradationistEncounter = class refsDegradationistEncounter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].FSDegradationist > random(25, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0),
		];
	}

	execute(node) {
		const cost = 2000;
		const slave = GenerateNewSlave(null, {maxAge: 22, disableDisability: 1});
		slave.origin = "$He was taken into your custody from an owner who treated $him as an equal.";
		slave.devotion = random(0, 50);
		slave.trust = random(25, 70);
		slave.boobs = random(6, 9) * 50;
		slave.hips = random(-2, -1);
		slave.butt = random(0, 2);
		setHealth(slave, jsRandom(70, 80), 0, undefined, 0, 0);
		slave.clothes = "conservative clothing";
		const {
			he, his, him, girl, wife
		} = getPronouns(slave);

		App.Events.drawEventArt(node, slave);

		App.Events.addParagraph(node, [`As a result of ${V.arcologies[0].name}'s adoption of degradationism there has been a remarkable effect on the social status of slaves, with the continued reduction of slave rights taking center stage. However, not all citizens are so keen as to internalize the tenets of degradationism, whether out of misplaced compassion, old habits or adherence to the old world style of relationships.`]);

		App.Events.addParagraph(node, [`On one particular outing, you come across an elderly male citizen holding the hand of his young slave, seemingly on a date at one of the arcology's prominent promenades. From the ring on the ${girl}'s finger and the modest neckline on ${his} clothing, it is clear that ${his} owner is treating ${him} as if ${he} is his ${wife}. His obscene treatment of his slave has already drawn a large crowd of shocked onlookers.`]);

		const choices = [];
		choices.push(new App.Events.Result(`Alert your drones and keep walking`, ignore));
		if (V.cash >= cost) {
			choices.push(new App.Events.Result(`Take the pampered slave ${girl} into your custody`, enslave, `Will cost ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		choices.push(new App.Events.Result(`Publicly confront the citizen`, confront));
		App.Events.addResponses(node, choices);

		function ignore() {
			return `You inform ${V.assistant.name} that you have a slave lover in need of harassment by your security drones, then continue on your way. You did not instruct your drones to attack the obscene pair, as the scrutiny and public shame of a drone escort around the arcology are a more fitting punishment for a citizen and will perhaps encourage him to think twice before treating his slave as an equal.`;
		}

		function enslave() {
			slave.clothes = "no clothing";
			App.Events.refreshEventArt(slave);
			cashX(-cost, "slaveTransfer", slave);
			return [
				`Confronting the citizen is simplicity in itself; he would not dare defy you directly under threat of arrest by your security drones and is unlikely to garner any sympathy from the public for his disturbing actions. As such, you are able to take civil ownership over the slave ${girl} and claim ${him} for yourself with only token compensation to the citizen. As you stride away from ${his} former owner with the ${girl} in your arms, ${he} clings to you with obvious naïveté for how you will treat ${him}. It's time ${he} learnt how slaves are treated in ${V.arcologies[0].name}.`,
				App.UI.newSlaveIntro(slave)
			];
		}

		function confront() {
			repX(2500, "event");
			return `Your walk up to the citizen is not accompanied by shaking ground or tumultuous fanfare, yet the citizen looks as if death itself has come before him. You don't hurt him physically, instead chastising him publicly in front of his fellow peers who begin to cheer their agreement. You end your tirade of verbal abuse with a reminder that although the man is a citizen of your arcology, that does not give him the impunity to parade a slave around the arcology as if ${he} were his ${wife}. To make it clear that you will not be so forgiving of his next transgression, a brace of your security drones hover behind you threateningly. The crowd that gathered approve of your rebuke of the citizen.`;
		}
	}
};


code:
App.Events.refsPastoralistEncounter = class refsPastoralistEncounter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].FSPastoralist > random(25, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0),
		];
	}

	execute(node) {
		const cost = 1000;
		const slave = GenerateNewSlave("XX", {maxAge: 65, disableDisability: 1, race: "nonslave"});
		if (slave.weight < 50) {
			slave.weight += 50;
		}
		slave.devotion = 100;
		slave.trust = 100;
		setHealth(slave, 100, 0);
		slave.hColor = "grey";
		slave.hStyle = "bun";
		slave.clothes = "conservative clothing";

		const {
			he, his, him, himself, woman
		} = getPronouns(slave);

		App.Events.drawEventArt(node, slave);

		App.Events.addParagraph(node, [`Pastoralism has taken ${V.arcologies[0].name} by storm and a number of enterprising citizens have been quick to respond by providing new services and businesses in response. One such innovation is a number of experimental new restaurants that incorporate human milk into their recipes, much to the delight of the citizenry. Such establishments have become a fashionable part of ${V.arcologies[0].name}'s taste palate and new takes on the simple premise are common.`]);

		App.Events.addParagraph(node, [`While navigating your arcology on an outing, you find yourself coming across one of the arcology's newest restaurants, a milkshake parlor that prides itself on deriving all of its dairy from human sources.`]);

		const choices = [];
		choices.push(new App.Events.Result(`Keep walking`, ignore));
		if (V.cash >= cost) {
			choices.push(new App.Events.Result(`Offer to sponsor ${him} for a promotional video`, sponsor, `This will cost ${cashFormat(cost)}.`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to promote ${him}.`));
		}
		choices.push(new App.Events.Result(`Have a shake`, workout));
		App.Events.addResponses(node, choices);

		function ignore() {
			return `The establishment is not the first of its kind in the arcology, but the idea seems to be popular enough with the citizenry to accommodate competition. When you've sated your curiosity perusing the courtesy menu by the door, you move on towards your next appointment.`;
		}

		function sponsor() {
			repX(5000, "event");
			cashX(-cost, "event");
			return `You soon discover that the owner of the establishment is a matronly ${woman} who sources ${his} dairy from other mothers in the arcology, having found that new or expectant mothers are often in need of a revenue stream. The two of you sit at the counter for some time, though the owner often excuses ${himself} for a milking in the back room, and together craft a simple promotional ad campaign featuring a simple slogan. Posters bearing the words "Got MILF?" soon grace the walls of ${V.arcologies[0].name}, and your citizens take to the idea of motherly milkshakes and admire your marketing acumen.`;
		}

		function workout() {
			const frag = new DocumentFragment();
			App.Events.addParagraph(frag, [`The owner of the parlor is so flattered by your patronage of ${his} humble store that ${he} not only provides your drink free of charge but even milks ${himself} at the counter to personally provide the dairy for your shake. The shake's taste is rich, even creamy, with an overall sweet palate mixed with a slight nuttiness.`]);

			App.Events.addParagraph(frag, [`Though you depart without officially sponsoring the milkshake parlor, your presence is endorsement enough to many citizens while others simply appreciate you drinking amongst them.`]);
			repX(1500, "event");
			return frag;
		}
	}
};