code:
App.Events.RESSMutinyAttempt = class RESSMutinyAttempt extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.PC.vagina > -1
		];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canSee,
				canWalk,
				s => s.devotion <= 20,
				s => ((s.trust >= -20 && s.behavioralFlaw === "arrogant") || s.trust > 20),
				s => s.muscles > 30,
				s => s.health.condition > 20,
				s => s.energy > 50,
				canPenetrate
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			His, He, he, his, him, himself
		} = getPronouns(eventSlave);
		const hands = hasBothArms(eventSlave) ? "hands" : "hand";
		const dick = V.PC.dick !== 0 ? "dick" : "strap-on";

		App.Events.drawEventArt(node, eventSlave);
		let mutinyAttempted = true;

		let r = [];
		r.push(`Finishing your work, you lean back for a well-deserved break. Your peace is quickly disturbed by several loud smashes from down the penthouse hall. As you get up from your desk, you hear somebody running down the hallway, and before you know it,`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`is inside. ${He} is looking quite treacherous and`);
		if (eventSlave.skill.combat > 0) {
			r.push(`relatively confident.`);
		} else {
			r.push(`somewhat unsure.`);
		}
		r.push(`${He} quickly reaches in to grab you,`);
		if (V.PC.career === "gang") {
			if (V.personalArms !== 0) {
				r.push(`but when you point your handgun towards ${him}, ${he} stutters back with ${his} ${hands} pointing upwards.`);
			} else {
				r.push(`but you just have to reach for your trusty handgun to make the slave step back in fear.`);
			}
			mutinyAttempted = false;
		} else if (V.PC.career === "street urchin") {
			r.push(`but you slash at ${him} with your trusted knife, catching ${him} off guard and leaving a nasty gash. Before ${he} recovers ${his} senses, you make sure to have your knife to ${his} throat.`);
			mutinyAttempted = false;
			/* TODO: add scar somewhere */
		} else if (V.PC.career === "mercenary" || V.PC.career === "recruit") {
			if (V.personalArms !== 0) {
				r.push(`but you quickly draw the weapon you always keep close at hand, forcing the slave to put ${his} ${hands} on the back of ${his} head.`);
			} else {
				r.push(`but you quickly grab ${his} arm, pull it towards you and lock it in ${his} back, pushing ${him} over the desk.`);
			}
			mutinyAttempted = false;
		} else if (isPCCareerInCategory("escort")) {
			r.push(`but you simply give ${him} a kick to the groin; ${he} wouldn't be the first person to try this shit on you.`);
			mutinyAttempted = false;
		} else if ((V.PC.career === "slaver" || V.PC.career === "slave overseer") || V.PC.skill.slaving >= 20) {
			r.push(`but you simply give ${him} a kick to the groin, a little trick you remember from your early days on how to deal with rebellious slaves.`);
			mutinyAttempted = false;
		} else if (V.PC.skill.warfare >= 20) {
			r.push(`but you have no problem grabbing ${him} and pushing ${him} to the ground, grabbing`);
			if (hasBothArms(eventSlave)) {
				r.push(`both of`);
			}
			r.push(`${his}`);
			if (hasBothArms(eventSlave)) {
				r.push(`arms`);
			} else {
				r.push(`arm`);
			}
			r.push(`to make sure ${he} doesn't try to step up.`);
			mutinyAttempted = false;
		} else if (V.PC.muscles >= eventSlave.muscles + 20 && canLift(eventSlave, V.PC)) {
			r.push(`but you are stronger, easily lifting ${him} into the air and slamming ${him} back to the ground.`);
			mutinyAttempted = false;
		} else if (V.PC.muscles >= eventSlave.muscles + 30) {
			r.push(`but you are far stronger; ${he}'s too big to lift, so you just overpower ${him} with sheer might.`);
			mutinyAttempted = false;
		} else {
			r.push(`and despite your attempts at fighting ${him} off, ${he} manages to get a hold on your body.`);
		}
		App.Events.addParagraph(node, r);

		r = [];
		if (mutinyAttempted) {
			r.push(`${He} doesn't seem to understand what ${he} is getting ${himself} into`);
			if (V.PC.boobs >= 300) {
				r.push(`as ${he} gropes your chest`);
			} else {
				r.push(`as ${he} runs ${his} ${hands} over your body`);
			}
			r.push(`in a desperate attempt at taking control.`);
			if (V.HeadGirlID !== 0) {
				const {
					he2, his2
				} = getPronouns(S.HeadGirl).appendSuffix("2");
				r.push(`You jump in surprise as ${S.HeadGirl.slaveName} tackles ${him} off you and to the floor`);
				if (S.HeadGirl.skill.combat > 0) {
					r.push(`where ${he2} twists ${his} arm in an arm hold until the rebellious slave stops struggling.`);
				} else {
					r.push(`where ${he2} settles ${his2} weight on the struggling rebel, lacking any better idea of what to do.`);
				}
				r.push(Spoken(S.HeadGirl, `"I'm sorry, ${getWrittenTitle(S.HeadGirl)}, ${he} tried to knock me out on ${his} way here. But as soon as I got up, I came running. I promise I saw nothing, but what should we do about ${him}?"`));
				mutinyAttempted = false;
			} else {
				r.push(`You try to fight ${him} off, but ${his} grip is stronger than you expected, so you will just have to bear with it, at least until an opening arises. If this gets out of the penthouse, your reputation as both arcology owner and as a slaver will be devastated.`);
			}
		}

		App.Events.addParagraph(node, r);
		let choices = [];
		let choices2 = [];
		if (mutinyAttempted) {
			choices.push(new App.Events.Result(`Fight ${him} off as much as you can`, fight));
			choices.push(new App.Events.Result(`Try to talk it out`, talk));
			choices.push(new App.Events.Result(`Fake playing along`, fake));
			App.Events.addResponses(node, choices);
		} else {
			App.Events.addParagraph(node, [`With the bitch restrained, you have all the time you need to devise ${his} punishment.`]);
			choices2.push(new App.Events.Result(`Lock ${his} dick in chastity`, lock));
			choices2.push(new App.Events.Result(`Flog ${him}`, flog));
			if (eventSlave.voice !== 0) {
				choices2.push(new App.Events.Result(`Mute ${him}`, mute, `This option will cost ${cashFormat(V.surgeryCost)}`));
			}
			choices2.push(new App.Events.Result(`Castrate ${him}`, castrate, `This option will cost ${cashFormat(V.surgeryCost)}`));
			if (eventSlave.vagina === -1) {
				choices2.push(new App.Events.Result(`Surgically alter ${his} gender`, genderbender, `This option will cost ${cashFormat(V.surgeryCost * 2)}`));
			} else {
				choices2.push(new App.Events.Result(`Remove ${his} male genitalia`, remove, `This option will cost ${cashFormat(V.surgeryCost * 2)}`));
			}
			choices2.push(new App.Events.Result(`Deny ${him} from ever having satisfying sex again`, deny, `This option will cost ${cashFormat(V.surgeryCost * 4)}`));
			App.Events.addResponses(node, choices2);
		}

		function fight(){
			const frag = document.createDocumentFragment();
			r = [];
			if (overpowerCheck(eventSlave, V.PC) >= random(1, 100)) {
				r.push(`You know your own body well, at least enough to be able to make it as difficult as possible for ${him} to use you. If ${he} were to loosen ${his} grip by a little, you'd be quick to shake ${him} off, but the position ${he}'s got you in doesn't leave much room to fight back. When you start to tire, ${he} pushes you to the wall and starts rubbing ${his}`);
				if (eventSlave.dick === 1) {
					r.push(`pathetic`);
				} else if (eventSlave.dick === 2) {
					r.push(`little`);
				} else if (eventSlave.dick === 3) { // empty
				} else if (eventSlave.dick === 4) {
					r.push(`big`);
				} else if (eventSlave.dick === 5) {
					r.push(`impressive`);
				} else if (eventSlave.dick === 6) {
					r.push(`huge`);
				} else if (eventSlave.dick === 7) {
					r.push(`gigantic`);
				} else if (eventSlave.dick === 8) {
					r.push(`titanic`);
				} else if (eventSlave.dick === 9) {
					r.push(`absurd`);
				} else if (eventSlave.dick === 10) {
					r.push(`inhuman`);
				} else {
					r.push(`hypertrophied`);
				}
				r.push(`dick on your lower body, thrusting blindly around your belly, before lodging ${himself} between your thighs. You have a hard time fighting against ${him} in your position, but you're not about to let ${him} dominate you either. You continue trying to shake ${him} off, making sure at the same time that your movements are as aggressive as possible to try and distract ${him} with pain or pleasure. You feel ${his} grip loosen as ${his} body tenses before pending orgasm, so you strongly push into ${him}, knocking ${him} off balance and to the floor. ${He} spills ${his} seed all over ${himself} and you as you wrestle ${him} into a chokehold. Now that you have ${him} restrained, it's time ${he} learned ${his} place.`);
			} else {
				r.push(`You know your own body well, but ${eventSlave.slaveName} is much stronger than you had thought. ${His} grip shows little sign of loosening despite your struggle, and ${he}'s got you in a position that allows for little other options to fight back. When you soon start to tire, ${he} pushes you to the wall, tears off your clothing, and starts rubbing ${his}`);
				if (eventSlave.dick === 1) {
					r.push(`pathetic`);
				} else if (eventSlave.dick === 2) {
					r.push(`little`);
				} else if (eventSlave.dick === 3) { // empty
				} else if (eventSlave.dick === 4) {
					r.push(`big`);
				} else if (eventSlave.dick === 5) {
					r.push(`impressive`);
				} else if (eventSlave.dick === 6) {
					r.push(`huge`);
				} else if (eventSlave.dick === 7) {
					r.push(`gigantic`);
				} else if (eventSlave.dick === 8) {
					r.push(`titanic`);
				} else if (eventSlave.dick === 9) {
					r.push(`absurd`);
				} else if (eventSlave.dick === 10) {
					r.push(`inhuman`);
				} else {
					r.push(`hypertrophied`);
				}
				r.push(`dick on your lower body, thrusting blindly around your belly, before suddenly lodging ${himself} in your pussy. You have an even harder time fighting against ${him} in this position, especially since your aggressive movements seem to send a pleasurable sensation to ${his} cock. You only manage to find an opportunity to free yourself when ${he} reaches orgasm, shooting ${his} seed deep inside you. As ${he} cums, you strongly push into ${him}, knocking ${him} off balance and to the floor. By sheer luck, ${his} head strikes a large paperweight that was thrown across the room in your struggle, knocking ${him} unconscious long enough for you to dislodge yourself and tie ${him} up. Now that you have ${him} restrained, it's time ${he} learned ${his} place.`);
				seX(eventSlave, "penetrative", V.PC, "vaginal");
				if (canImpreg(V.PC, eventSlave)) {
					r.push(knockMeUp(V.PC, 50, 0, eventSlave.ID));
				}
			}
			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, choices2);
			return frag;
		}

		function talk() {
			const frag = document.createDocumentFragment();
			let r = [];
			r.push(`You start trying to talk ${him} down, hoping to persuade ${him} that you might reconsider your punishment if ${he} stopped this foolishness; ${he} doesn't seem too keen on`);
			if (canHear(eventSlave)) {
				r.push(`listening to`);
			} else {
				r.push(`acknowledging`);
			}
			r.push(`you, instead pushing you against a wall and tearing your clothes off. Ignoring your words, ${he} forces ${his}`);
			if (eventSlave.dick === 1) {
				r.push(`pathetic`);
			} else if (eventSlave.dick === 2) {
				r.push(`little`);
			} else if (eventSlave.dick === 3) { // empty
			} else if (eventSlave.dick === 4) {
				r.push(`big`);
			} else if (eventSlave.dick === 5) {
				r.push(`impressive`);
			} else if (eventSlave.dick === 6) {
				r.push(`huge`);
			} else if (eventSlave.dick === 7) {
				r.push(`gigantic`);
			} else if (eventSlave.dick === 8) {
				r.push(`titanic`);
			} else if (eventSlave.dick === 9) {
				r.push(`absurd`);
			} else if (eventSlave.dick === 10) {
				r.push(`inhuman`);
			} else {
				r.push(`hypertrophied`);
			}
			r.push(`dick in without a second thought. You make sure to clamp down as hard as possible so the experience is not all that pleasant for ${him}, but ${he} continues to thrust in a daze.`);
			if (canImpreg(V.PC, eventSlave)) {
				r.push(`You make one last plea for ${him} not to cum inside; it's a danger day. If anything, it only encourages ${him} to thrust deeper before painting the insides of your pussy with ${his} load.`);
				r.push(knockMeUp(V.PC, 100, 0, eventSlave.ID));
			}
			r.push(`Once spent, ${he} shoves you to the ground and crashes into your office chair. The moment ${he} lets down ${his} guard, you slam the heaviest object you can find into ${his} head. Now that you have ${him} controlled, it's time ${he} learned ${his} place — when ${he} wakes up, of course. It's more fun that way.`);
			seX(eventSlave, "penetrative", V.PC, "vaginal");
			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, choices2);
			return frag;
		}

		function fake() {
			const frag = document.createDocumentFragment();
			let r = [];
			r.push(`You start removing your top and putting on a show of seducing your slave, dropping to your knees while looking doe-eyed at ${him}. By sucking ${him} off, you'll probably get ${him} to lower ${his} guard enough to get the upper hand. You take ${his}`);
			if (eventSlave.dick === 1) {
				r.push(`pathetic`);
			} else if (eventSlave.dick === 2) {
				r.push(`little`);
			} else if (eventSlave.dick === 3) { // empty
			} else if (eventSlave.dick === 4) {
				r.push(`big`);
			} else if (eventSlave.dick === 5) {
				r.push(`impressive`);
			} else if (eventSlave.dick === 6) {
				r.push(`huge`);
			} else if (eventSlave.dick === 7) {
				r.push(`gigantic`);
			} else if (eventSlave.dick === 8) {
				r.push(`titanic`);
			} else if (eventSlave.dick === 9) {
				r.push(`absurd`);
			} else if (eventSlave.dick === 10) {
				r.push(`inhuman`);
			} else {
				r.push(`hypertrophied`);
			}
			r.push(`dick inside your`);
			if (["escort", "prostitute", "child prostitute", "servant"].includes(V.PC.career)) {
				r.push(`expert`);
			}
			r.push(`mouth. You diligently suck until you feel ${him} begin to tense up; this is your chance. You clamp down on ${his} cock while simultaneously punching ${him} in the balls. ${He} howls in pain, until you headbutt ${him} in the stomach and knock the wind out of ${him}. You quickly pull ${him} into an arm lock and force ${him} over your desk. Now that you have ${him} restrained, it's time ${he} learned ${his} place — after you've gotten the taste of the slut out of your mouth, that is.`);
			App.Events.addParagraph(frag, r);
			App.Events.addResponses(frag, choices2);
			return frag;
		}

		function lock() {
			eventSlave.trust += 10;
			eventSlave.chastityPenis = 1;
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust += 5; } });
			return `You simply clamp a chastity cage onto ${his} limp dick; ${he}'ll be taking a little break from fucking girls for the time being. When ${he} comes to and finds ${himself} locked in chastity, ${he} immediately begins fiddling with it in an attempt to remove it. ${He} feels this punishment is laughable and only grows more defiant. Word spreads through your chattel that the only downside of trying to rape ${getWrittenTitle(eventSlave)} is getting locked in chastity, spreading defiance through your rebellious slaves.`;
		}

		function flog() {
			eventSlave.trust -= 15;
			healthDamage(eventSlave, 15);
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust += 5; } });
			return `You bind ${his} naked body to the wall in preparation for a good beating. Going against one's master is bad, but going against you is even worse. You thoroughly strike ${him}, showering extra attention to ${his} crotch, while making sure ${he} will be in pain for days to come. Such a beating leaves ${him} in agonizing pain and makes a clear example to ${him} and all your other rebellious slaves that you are not to be trifled with.`;
		}

		function mute() {
			eventSlave.trust += 5;
			eventSlave.devotion -= 15;
			eventSlave.voice = 0;
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust += 10; } });
			cashX(forceNeg(V.surgeryCost), "slaveSurgery", eventSlave);
			return `As you pull ${his} limp body to the remote surgery, you notice ${he} understands what ${he} has done and begs you to reconsider your decision; but your mind is set. ${He} tried to rape you, ${he} must be silenced. Restrained as ${he} is, the most ${he} can do is cry and beg. When ${he} awakens from surgery, ${he} realizes all you did was stop ${him} from talking; what stops ${him} from making another go at you? Your other rebellious slaves see this as a minor loss for a potentially huge gain and, if anything, become more defiant.`;
		}

		function castrate() {
			eventSlave.trust -= 20;
			eventSlave.devotion -= 10;
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 5; } });
			cashX(forceNeg(V.surgeryCost), "slaveSurgery", eventSlave);
			surgeryDamage(eventSlave, 10);
			return `As you pull ${his} limp body to the remote surgery, you notice ${he} understands what ${he} has done and begs you to reconsider your decision; but your mind is set. ${He} had the balls to try and rape you, and now ${he} won't. Restrained as ${he} is, the most ${he} can do is cry and beg. Once ${he} comes to after the surgery, ${he} faces ${his} new life; ${he}'ll never get hard again and ${he}'s the only one to blame for ${his} suffering. Every other rebellious slave is mortified by the example.`;
		}

		function genderbender() {
			eventSlave.trust -= 30;
			eventSlave.devotion -= 25;
			eventSlave.dick = 0;
			eventSlave.balls = 0;
			eventSlave.scrotum = 0;
			eventSlave.prostate = 0;
			eventSlave.dickAccessory = "none";
			eventSlave.vagina = 1;
			eventSlave.chastityPenis = 0;
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } });
			cashX(forceNeg(V.surgeryCost*2), "slaveSurgery", eventSlave);
			surgeryDamage(eventSlave, 20);

			let r = [];
			r.push(`You ask ${him} if ${he} enjoyed the last time ${he} used ${his} dick and if it was worth crossing you, because it will not happen again. Restrained as ${he} is, the most ${he} can do is cry and beg. Once ${he} comes to after the surgery, ${he} faces ${his} new body; ${he}'s now a shemale and ${he}'s the only one to blame for ${his} suffering. You waste no time in shoving ${him} against the wall and forcing your ${dick} into ${his} virgin pussy. You use ${him} until you are satisfied and toss ${him} to the floor to think about ${his} new life. Every other rebellious slave is horrified by the example.`);
			r.push(VCheck.Vaginal(eventSlave, 1));
			return r;
		}

		function remove() {
			eventSlave.trust -= 30;
			eventSlave.devotion -= 25;
			eventSlave.dick = 0;
			eventSlave.foreskin = 0;
			eventSlave.balls = 0;
			eventSlave.scrotum = 0;
			eventSlave.dickAccessory = "none";
			eventSlave.chastityPenis = 0;
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } });
			cashX(forceNeg(V.surgeryCost*2), "slaveSurgery", eventSlave);
			surgeryDamage(eventSlave, 20);
			return `You ask ${him} if ${he} enjoyed the last time ${he} used ${his} dick and if it was worth crossing you, because it will not happen again. Restrained as ${he} is, the most ${he} can do is cry and beg. Once ${he} comes to after the surgery, ${he} faces ${his} new body; ${he}'s now a surgical null and ${he}'s the only one to blame for ${his} suffering. Every other rebellious slave is horrified by the example.`;
		}

		function deny() {
			eventSlave.trust -= 50;
			eventSlave.devotion -= 30;
			eventSlave.dick = 0;
			eventSlave.prostate = 0;
			eventSlave.dickAccessory = "none";
			eventSlave.chastityPenis = 0;
			eventSlave.vagina = 0;
			eventSlave.ovaries = 0;
			eventSlave.clit = 0;
			eventSlave.labia = 0;
			eventSlave.vaginalAccessory = "none";
			eventSlave.vaginalAttachment = "none";
			eventSlave.chastityVagina = 0;
			V.slaves.forEach(function(s) { if (s.devotion < -50) { s.trust -= 15; } });
			cashX(forceNeg(V.surgeryCost*4), "slaveSurgery", eventSlave);
			surgeryDamage(eventSlave, 20);

			let r = [];
			r.push(`You ask ${him} if ${he} enjoyed ${his} last orgasm, because ${he} won't be getting any more. Restrained as ${he} is, the most ${he} can do is cry and beg. Once ${he} comes to after the surgery, ${he} faces ${his} new body; ${he}'s now a surgical null, though ${he} retains ${his} balls, and ${he}'s the only one to blame for ${his} suffering. You waste no time in shoving ${him} against the wall and forcing your ${dick} into ${his} anus. As ${his} arousal grows, ${he} realizes you not only took ${his} dick, but ${his} prostate as well. ${He} quickly finds ${himself} desperate for release but lacking any way to do so. You watch ${him} squirm in sexual frustration. This will be ${his} new life. Every other rebellious slave is horrified by the example.`);
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canMove,
				s => s.rules.speech !== "restrictive",
				s => s.rules.release.master === 1,
				s => s.devotion >= -20,
				s => s.trust >= -20,
				s => s.energy > 75,
				s => ((canDoVaginal(s) && s.vagina > 0) || (canDoAnal(s) && s.anus > 0))
			]
		];
	}

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

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

		let r = [];
		r.push(`As you are retiring for the night,`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		if (!canWalk(eventSlave)) {
			if (eventSlave.rules.mobility === "permissive") {
				r.push(`hobbles`);
			} else {
				r.push(`crawls`);
			}
		} else if (shoeHeelCategory(eventSlave) > 1) {
			r.push(`totters`);
		} else if (eventSlave.belly >= 10000) {
			r.push(`waddles`);
		} else {
			r.push(`walks`);
		}
		r.push(`into your bedroom and ${canStand(eventSlave) ? "stands" : "settles"} before you submissively. Since ${he}'s allowed to ask questions,`);
		if (!canTalk(eventSlave)) {
			r.push(`${he} begs you with gestures to have sex with ${him}.`);
		} else {
			if (eventSlave.lips > 70) {
				r.push(`${he} says meekly through ${his} massive dick-sucking lips,`);
			} else if (eventSlave.piercing.lips.weight+eventSlave.piercing.tongue.weight > 2) {
				r.push(`${he} says meekly through ${his} inconvenient oral piercings,`);
			} else {
				r.push(`${he} says meekly,`);
			}
			r.push(Spoken(eventSlave, `"${Master}, would you please fuck me?"`));
		}

		App.Events.addParagraph(node, r);
		let choices = [];
		if (canDoVaginal(eventSlave) || canDoAnal(eventSlave)){
			choices.push(new App.Events.Result(`Fuck ${him} as ${he} asks`, fuck, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null));
			if (canDoVaginal(eventSlave)) {
				choices.push(new App.Events.Result(`Rape ${him}`, rape, (eventSlave.vagina === 0) ? `This option will take ${his} virginity` : null));
			}
			if (canDoAnal(eventSlave)) {
				choices.push(new App.Events.Result(`Assrape ${him}`, assrape, (eventSlave.anus === 0) ? `This option will take ${his} anal virginity` : null));
			}
		}
		choices.push(new App.Events.Result(`Play with ${him}`, play, (eventSlave.anus === 0 && canDoAnal(eventSlave)) || (eventSlave.vagina === 0 && canDoVaginal(eventSlave)) ? `This option will take ${his} virginity` : null));
		choices.push(new App.Events.Result(`Send ${him} away`, away));
		App.Events.addResponses(node, choices);

		function fuck(){
			r = [];
			r.push(`${He} almost sobs with joy as`);
			if (V.PC.dick === 0) {
				r.push(`your strap-on enters`);
			} else {
				r.push(`you enter`);
			}
			r.push(`${him}. The two of you have`);
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(`passionate oral, vanilla, and finally anal sex`);
			} else if (canDoVaginal(eventSlave)) {
				r.push(`gentle vanilla sex`);
			} else {
				r.push(`gentle anal sex`);
			}
			r.push(`for the rest of the`);
			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
				r.push(`night; whenever you go soft for a moment, all ${he} has to do is eat you out, and you're rock hard again`);
			} else {
				r.push(`night.`);
			}
			r.push(`As you move from position to position,`);
			if (eventSlave.belly >= 5000) {
				r.push(`and exploring several unusual ones thanks to ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnancy,`);
				} else {
					r.push(`belly,`);
				}
			}
			r.push(`${he} twists to face you whenever ${he} can. When ${he} manages it, ${he} kisses you when ${he} can reach your lips, and ${he}`);
			if (canSee(eventSlave)) {
				r.push(`stares deeply into your eyes`);
			} else {
				r.push(`meets your face with ${his} own`);
			}
			r.push(`when ${he} cannot. ${His} trust in you <span class="trust inc">has increased.</span>`);
			eventSlave.trust += 4;
			if (canDoVaginal(eventSlave) && canDoAnal(eventSlave)) {
				r.push(VCheck.Both(eventSlave, 6));
			} else if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave, 4));
			} else {
				r.push(VCheck.Anal(eventSlave, 4));
			}
			seX(eventSlave, "oral", V.PC, "penetrative", 3);
			return r;
		}

		function rape() {
			r = [];
			r.push(`You order ${him} to kneel. ${He} looks hopeful and complies, but ${his} anticipation of enjoyable sex vanishes with a pathetic little gasp when you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`shove ${him} to the floor. With nothing more than the arousal ${he} came in with, you brutally rape ${him}, fucking ${his}`);
			if (V.seeRace === 1) {
				r.push(eventSlave.race);
			}
			r.push(`pussy to the limit of what you can get away with without damaging ${him}.`);
			if (((eventSlave.fetish === "submissive" && eventSlave.fetishStrength > 60) || (eventSlave.energy > 95)) && (eventSlave.fetishKnown === 1)) {
				r.push(`${He}'s such a submissive that after a while pleasure overwhelms pain to the extent that ${he} manages a <span class="devotion inc">sobbing orgasm.</span>`);
			} else {
				r.push(`${He} gets the message: ${he}'s your property and ${his} desires are entirely subject to your will. ${His} submission to you and fear of you have both increased.`);
				eventSlave.trust -= 3;
			}
			eventSlave.devotion += 3;
			r.push(VCheck.Vaginal(eventSlave, 1));
			return r;
		}

		function assrape() {
			r = [];
			r.push(`You order ${him} to kneel. ${He} looks hopeful and complies, but ${his} anticipation of enjoyable sex vanishes with a pathetic little gasp when you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			if (V.PC.vagina !== -1) {
				r.push(`use a couple of fingers to collect some of your pussyjuice for improvised lube.`);
			} else {
				r.push(`spit on ${his} butthole.`);
			}
			r.push(`With only a little saliva as lubrication, you brutally sodomize ${him}, fucking ${his}`);
			if (V.seeRace === 1) {
				r.push(eventSlave.race);
			}
			r.push(`ass to the limit of what you can get away with without damaging ${him}.`);
			if (((eventSlave.fetish === "buttslut" && eventSlave.fetishStrength > 60) || (eventSlave.energy > 95)) && (eventSlave.fetishKnown === 1)) {
				r.push(`${He} loves anal so much that after a while pleasure overwhelms pain to the extent that ${he} manages a <span class="devotion inc">sobbing orgasm.</span>`);
			} else {
				r.push(`${He} gets the message: ${he}'s your property and ${his} desires are entirely subject to your will. ${His} submission to you and fear of you have both increased.`);
				eventSlave.trust -= 3;
			}
			eventSlave.devotion += 3;
			r.push(VCheck.Anal(eventSlave, 1));
			return r;
		}

		function play() {
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave, "no clothing");

			r = [];
			if (canSee(eventSlave)) {
				r.push(`You get into bed and crook a finger, silently`);
			} else if (canHear(eventSlave)) {
				r.push(`You get into bed and growl sexually,`);
			} else {
				r.push(`You pull ${him} towards your bed and collapse onto it,`);
			}
			r.push(`ordering ${him} to join you. ${He}`);
			if (App.Data.clothes.get(eventSlave.clothes).exposure <= 3) {
				r.push(`hurries out of ${his} clothes and`);
			}
			r.push(`bounces over,`);
			if (eventSlave.chastityPenis === 1) {
				r.push(`${his} posture communicating the arousal that ${his} caged cock cannot.`);
			} else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100) {
				r.push(`${his} impotent dick already streaming watery precum.`);
			} else if (eventSlave.dick > 0 && eventSlave.balls === 0) {
				r.push(`${his} dick pathetically soft despite ${his} obvious arousal.`);
			} else if (eventSlave.dick > 6 && !canAchieveErection(eventSlave)) {
				r.push(`${his} dick swollen with arousal yet too large to become erect.`);
			} else if (eventSlave.dick > 0 && !canAchieveErection(eventSlave)) {
				r.push(`${his} dick tipped with precum yet enable to get hard.`);
			} else if (eventSlave.dick > 4) {
				r.push(`${his} massive cock rock hard.`);
			} else if (eventSlave.dick > 2) {
				r.push(`${his} erection standing out stiffly.`);
			} else if (eventSlave.dick > 0) {
				r.push(`${his} tiny little dick poking out stiffly.`);
			} else if (eventSlave.clit > 0) {
				r.push(`${his} big clit visibly stiff.`);
			} else if (eventSlave.vagina === -1) {
				r.push(`already arching ${his} back to present ${his} bottom.`);
			} else {
				r.push(`${his} pussylips shining with arousal.`);
			}
			r.push(`As ${he}`);
			if (eventSlave.belly >= 10000 || eventSlave.weight > 130) {
				r.push(`hefts ${his}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`gravid`);
				}
				r.push(`bulk`);
			} else {
				r.push(`climbs`);
			}
			r.push(`into bed you take ${his} ${eventSlave.skin} ${hasAnyArms(eventSlave) ? "hand" : "hips"} and guide ${him}`);
			if (V.PC.belly >= 10000 || V.PC.dick.isBetween(0, 3)) {
				r.push(`rear up and face down so you may mount ${him}.`);
			} else {
				r.push(`into your lap, facing away from you.`);
			}
			r.push(`${He} sighs happily and snuggles ${his}`);
			if (eventSlave.weight > 160) {
				r.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				r.push(`soft`);
			} else if (eventSlave.muscles > 95) {
				r.push(`ripped`);
			} else if (eventSlave.muscles > 30) {
				r.push(`muscular`);
			} else if (eventSlave.muscles > 5) {
				r.push(`toned`);
			} else {
				r.push(`soft`);
			}
			r.push(`back`);
			if (V.PC.belly >= 10000) {
				r.push(`against the underside of your belly.`);
			} else {
				r.push(`into your chest.`);
			}
			r.push(`You`);
			if (eventSlave.belly >= 5000) {
				r.push(`embrace ${his} ${belly}`);
				if (eventSlave.bellyPreg >= 3000) {
					r.push(`pregnant`);
				}
				r.push(`belly before you`);
			} else if (eventSlave.weight > 95) {
				r.push(`embrace ${his} plush body before you`);
			}
			if (eventSlave.boobs > 2000) {
				r.push(`run your hands across ${his} massive chest`);
			} else if (eventSlave.boobs > 800) {
				r.push(`heft ${his} heavy breasts`);
			} else {
				r.push(`massage ${his} pretty chest`);
			}
			r.push(`and tease ${his}`);
			if (eventSlave.nipples === "huge") {
				r.push(`ridiculous`);
			} else if (eventSlave.nipples === "flat") {
				r.push(`fat`);
			} else if (eventSlave.nipples === "puffy") {
				r.push(`puffy`);
			} else if (eventSlave.nipples === "inverted") {
				r.push(`shy`);
			} else if (eventSlave.nipples === "partially inverted") {
				r.push(`exposed`);
			} else if (eventSlave.nipples === "fuckable") {
				r.push(`deep`);
			} else {
				r.push(`erect`);
			}
			r.push(`nipples, as ${he} shimmies ${himself} back`);
			if (V.PC.dick === 0) {
				r.push(`so ${his} warmth is against yours, your legs spreading ${his}`);
			} else {
				r.push(`onto you so your cock is lodged between ${his}`);
			}
			if (eventSlave.butt > 10) {
				r.push(`unfathomable`);
			} else if (eventSlave.butt > 5) {
				r.push(`incredible`);
			} else if (eventSlave.butt > 2) {
				r.push(`healthy`);
			} else {
				r.push(`pert`);
			}
			r.push(`buttocks. When ${he}'s close to orgasm from all the stimulation, ${he} reflexively squeezes`);
			if (V.PC.dick === 0) {
				r.push(`your body between ${his} legs,`);
			} else {
				r.push(`your dick between ${his} asscheeks,`);
			}
			r.push(`bringing you to climax. At the feeling of your`);
			if (V.PC.dick === 0) {
				r.push(`juices`);
			} else {
				r.push(`warm cum`);
			}
			r.push(`between ${his}`);
			if (eventSlave.weight > 190) {
				r.push(`immense`);
			} else if (eventSlave.weight > 160) {
				r.push(`massive`);
			} else if (eventSlave.weight > 130) {
				r.push(`huge`);
			} else if (eventSlave.weight > 95) {
				r.push(`thick`);
			} else if (eventSlave.weight > 10) {
				r.push(`ample`);
			} else if (eventSlave.weight >= -10) {
				r.push(`trim`);
			}
			r.push(`thighs, ${he} tips over the edge and`);
			if (eventSlave.chastityPenis === 1) {
				r.push(`shivers with orgasm, ejaculate dribbling out of ${his} chastity cage.`);
			} else if (eventSlave.dick > 0 && eventSlave.hormoneBalance >= 100) {
				r.push(`cums weakly, ${his} soft dick twitching.`);
			} else if (eventSlave.dick > 0 && (eventSlave.balls === 0 || eventSlave.ballType === "sterile")) {
				r.push(`shivers with orgasm, ${his} soft dick twitching weakly.`);
			} else if (eventSlave.balls > 4) {
				r.push(`making a massive mess all over ${himself}.`);
			} else if (eventSlave.balls > 2) {
				r.push(`adding ${his} own load to the mess.`);
			} else if (eventSlave.balls > 0) {
				r.push(`adding ${his} own pathetic load to the mess.`);
			} else if (eventSlave.clit > 0) {
				r.push(`pitches forward convulsively, gasping with overstimulation at the sensation on ${his} huge clit.`);
			} else {
				r.push(`quivers in your grasp, gasping, before relaxing back into you in a puddle of satisfaction.`);
			}
			r.push(`${His} devotion to you <span class="devotion inc">has increased.</span>`);
			eventSlave.devotion += 4;
			if (canDoVaginal(eventSlave)) {
				r.push(VCheck.Vaginal(eventSlave));
			} else {
				r.push(VCheck.Anal(eventSlave));
			}
			return r;
		}

		function away() {
			eventSlave.devotion += 4;
			return `${He} tries to hide ${his} disappointment as ${he} turns to go, and as ${he} flees out the door you hear ${him} begin to cry. By the next morning, however, ${his} responses to your commands have become less flirtatious and much more attentive. ${His} obedience to you has increased.`;
		}
	}
};

repo_name: CloudyCoffee/fc

license: mit


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.aphrodisiacs > 0 || s.inflationType === "aphrodisiac",
				s => s.addict > 20,
				s => s.devotion > 20 || s.trust < -20
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`takes ${his} aphrodisiacs in pill form, with ${his} food. They're dispensed alongside ${his} nutrition in the kitchen. You happen to be passing by when ${he}'s being issued ${his} drugs, and you see ${him} ${canSee(eventSlave) ? "staring" : "gazing"} thoughtfully at the insignificant-looking little pill, just holding it in ${his} hand and considering it for a long time. When ${he} realizes you're watching, ${he} turns to you and you realize ${his} eyes are moist.`);
		if (canTalk(eventSlave)) {
			t.push(`${He} ${SlaveStatsChecker.checkForLisp(eventSlave) ? "lisps through huge, quivering lips" : "mutters"}, "${Master}, ${Spoken(eventSlave, "I hate this shit. I come and come and come but it's just physical. I haven't felt close to anyone ever since I've been on these fucking aphrodisiacs.")}" ${He} shrugs bitterly. ${Spoken(eventSlave, `"Still crave them though."`)}`);
		} else {
			t.push(`${He} uses trembling gestures to pour out dissatisfaction with life as an aphrodisiac addict. ${He} is emotionally unsatisfied with the mechanical orgasms ${he} gets on the drugs, but craves them intensely.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Make an example by forcing ${him} to take a massive dose`, forceful),
			canDoVaginal(eventSlave) || canDoAnal(eventSlave)
				? new App.Events.Result(`Have caring sex with ${him} before ${he} takes the aphrodisiacs`, caring, virginityCheck())
				: new App.Events.Result()
		]);

		function forceful() {
			t = [];

			if (hasAnyEyes(eventSlave)) {
				t.push(`You take ${him} by the shoulders, look into ${his} ${hasBothEyes(eventSlave) ? "eyes" : "eye"},`);
			} else {
				t.push(`You take ${him} by the shoulders`);
			}
			t.push(`and tell ${him} you'll fix things so ${he} doesn't mind so much. ${He} looks hopeful, even when you tell ${him} to take ${his} pill. ${He} does, and you hand ${him} another. And another. ${He}'s crying with dread by the fourth pill, knowing that this is ${his} punishment for complaining. ${His} pupils dilate, ${he} begins to breathe hard, and ${his} ${eventSlave.skin} skin flushes badly. ${He} tries to beg you to fuck ${him} but can't seem to find the words. ${He} begins to masturbate compulsively, so hard that ${he} collapses to the kitchen floor with ${his} first spastic orgasm.`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`${His} cock is painfully compressed by ${his} chastity cage, but it does nothing to stop ${his} frantic efforts to come.`);
			} else if (canAchieveErection(eventSlave)) {
				if (eventSlave.dick > 9) {
					t.push(`${His} inhuman cock is as engorged as physically possible given its size, threatens to knock ${him} unconscious from the sheer amount of blood diverted into it, and doesn't shrink at all when cum weakly splurts from its tip.`);
				} else if (eventSlave.dick > 6) {
					t.push(`${His} monstrous cock is agonizingly erect, threatens to knock ${him} unconscious from the sheer amount of blood is takes ${him} to get hard, and doesn't soften at all when ${he} spatters ${his} own chest with cum.`);
				} else if (eventSlave.dick > 4) {
					t.push(`${His} huge cock is agonizingly erect and doesn't soften at all when ${he} spatters ${his} own chest with cum.`);
				} else if (eventSlave.dick > 3) {
					t.push(`${His} big cock is agonizingly erect and doesn't soften at all when ${he} spatters ${his} own chest with cum.`);
				} else if (eventSlave.dick > 1) {
					t.push(`${His} cock is agonizingly erect and doesn't soften at all when ${he} spatters ${his} own chest with cum.`);
				} else if (eventSlave.dick > 0) {
					t.push(`${His} pathetic dick is agonizingly erect and doesn't soften at all when ${he} weakly dribbles cum.`);
				}
			} else if (canDoVaginal(eventSlave)) {
				t.push(`${His} pussy is dripping with moisture and ${his} ragingly stiff clit doesn't soften at all when ${he} comes.`);
			} else if (canDoAnal(eventSlave)) {
				t.push(`${His} hungry asshole spasms with orgasm, but ${he} doesn't even pause ${his} anal masturbation.`);
			} else {
				t.push(`${His} whole body spasms with orgasm, but ${he} doesn't even pause ${his} efforts to draw out an orgasm by any means possible.`);
			}
			t.push(`For the hour or so it takes ${him} to pass out, slaves using the kitchen have to step over ${his} prostrate, orgasming body, lying in a pool of ${his} own drool, tears, sweat, and fluids. The next time you see ${him} in the kitchen, ${he} takes ${his} medicine like a good ${girl}. All your aphrodisiac addicts recognize the symptoms and the punishment, and avoid even thinking about resisting the system.`);

			V.slaves.forEach(function(s) { if (s.aphrodisiacs > 0 || s.inflationType === "aphrodisiac") { s.trust -= 5; } });
			return t;
		}

		function caring() {
			t = [];

			t.push(`You back ${him} up against the wall of the kitchen, kissing ${him}, touching ${his} body with care, and quietly shushing ${his} attempts to ask questions. You deftly extract the pill form ${his} hand and put it on the counter for later. With time and skill you bring ${him} to a fine state of arousal, not to mention emotional need; ${he} begins to kiss you back with almost frantic enthusiasm. When ${he}'s clearly ready, you lay ${him} across the kitchen table and ${PC.dick === 0 ? `work your groin up between ${his} legs` : `enter ${him}`}, drawing out a lusty moan. As the sex continues, however, ${he} begins to look doubtful, then distracted, and then to twitch occasionally. Finally ${he} bursts into tears.`);
			if (canTalk(eventSlave)) {
				t.push(`"I — I — fucking need my fix to come, ${Master}," ${he} sobs.`);
			} else {
				t.push(`${He} indicates through ${his} weeping that ${he} can't climax without the drugs.`);
			}
			t.push(`You pass ${him} the pill, and ${he} continues to weep inconsolably, apologizing all the while, until the drug takes away ${his} ability to care about anything but getting fucked. When you finish and extract ${PC.dick === 0 ? `yourself from between ${his} legs` : `your cock from ${his} well-used hole`}, though, you think you can detect a deep sadness in ${his} eyes that it cannot reach.`);
			if (canDoVaginal(eventSlave)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(VCheck.Anal(eventSlave, 1));
			}

			eventSlave.devotion += 4;
			return t;
		}

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


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canTalk,
				canSee,
				s => s.behavioralFlaw === "bitchy",
				s => s.devotion > 20,
				s => s.trust >= -20
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`is a decent slave, pretty well broken to your will and generally obedient. However, ${he} retains a cutting tongue. Though ${he}'s learned to ${his} considerable cost not to direct ${his} cheek at you, ${he} still insults your other slaves, and worse, will be sarcastic to members of the public ${he} encounters. You've worked on it, but it remains unsolved. Today, however, ${he} crossed the line. You were doing business in your office with a respected female slave drug wholesaler. The woman is in her late forties, and though she's something of a plastic surgery addict she has permitted her hair to go a becoming steel grey. Passing your office, ${eventSlave.slaveName} audibly commented on how old she looked to`);
		if (canStand(eventSlave)) {
			t.push(`another slave.`);
		} else {
			t.push(`${his} aide.`);
		}
		t.push(`Anger flashes in the businesswoman's eyes.`);

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

		App.Events.addResponses(node, [
			new App.Events.Result("Beg her pardon and offer to loan the bitch to her", loan),
			new App.Events.Result("Offer to spitroast the bitch between the two of you", spitroast, analVirginWarning()),
			V.arcade > 0
				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
				: new App.Events.Result()
		]);

		function loan() {
			t = [];

			t.push(`The businesswoman's anger turns to malicious anticipation as you call ${eventSlave.slaveName} over and inform ${him} that you and the businesswoman have decided ${eventSlave.slaveName} will be spending the night with her. Now that you look at your business partner, she has certain signs of a sadist. ${eventSlave.slaveName} notices too, and begins to cry ${eventSlave.bellyPreg >= 1500 ? `and shield ${his} pregnancy` : ""} as the businesswoman promises that there will be "no permanent damage." ${eventSlave.slaveName} is unceremoniously returned in the early hours of the morning. ${His} back and buttocks have been meticulously flogged right up to the very edge of damage, leaving angry marks across ${his} ${eventSlave.skin} skin. ${His} mouth lolls open, as though ${he}'s been doing little but give cunnilingus.`);
			if (eventSlave.vagina !== -1) {
				t.push(`${His} pussy,`);
			} else if (eventSlave.dick === 0) {
				t.push(`${His} shamefully featureless groin with its tiny little hole,`);
			} else {
				t.push(`${His} dick,`);
			}
			t.push(`anus, ${eventSlave.belly >= 10000 ? "popped navel," : ""} and even ${his} nipples show signs of torture. Whenever ${he} thinks of a sharp remark in the future, ${he}'ll remember the pain and keep ${his} mouth shut.`);

			eventSlave.behavioralFlaw = "none";
			seX(eventSlave, "oral", "public", "penetrative", 5);

			return t;
		}

		function spitroast() {
			t = [];

			t.push(`The businesswoman grins slowly and reaches into ${his} purse as you inform ${eventSlave.slaveName} that you and the businesswoman will punish ${him} together. ${eventSlave.slaveName}'s eyes widen as the businesswoman fishes a massive strap-on out of ${his} bag. The surprise turns to fear as the businesswoman begins to slap it against ${eventSlave.slaveName}'s buttocks as you`);
			if (!isAmputee(eventSlave)) {
				if (eventSlave.belly >= 300000) {
					t.push(`push ${him} onto ${his} ${belly} belly.`);
				} else {
					t.push(`pull ${him} down on ${hasAllLimbs(eventSlave) ? "all fours." : "the ground."}`);
				}
			} else {
				t.push("arrange your bitchy little sex toy between you and your guest.");
			}
			t.push(`The businesswoman clearly wants ${his} ass, so you ${!canDoAnal(eventSlave) ? `quickly unfasten ${his} anal chastity. You` : ""} ${PC.vagina !== -1 ? `ride ${eventSlave.slaveName}'s face` : `facefuck ${eventSlave.slaveName}`} roughly as ${eventSlave.slaveName} takes a painful anal raping from the huge dildo. The businesswoman winks at you companionably and extracts squeals from ${eventSlave.slaveName} that feel especially delicious ${PC.vagina !== -1 ? "against your cunt" : "along your dick"}.`);
			if (canMove(eventSlave)) {
				t.push(`${eventSlave.slaveName} collapses ${eventSlave.belly >= 5000 ? `and rolls onto ${his} side` : ""} after a long punishment fuck;`);
			} else {
				t.push(`${eventSlave.slaveName} ends the day a sore toy;`);
			}
			t.push(`${his} <span class="hotpink">submission</span> to you and <span class="gold">fear of you</span> have both increased.`);

			if (eventSlave.anus === 0) {
				t.push(`The businesswoman considered ${his} <span class="lime">anal cherry</span> a <span class="green">respectable offer.</span>`);
				eventSlave.anus++;
				repX(500, "event", eventSlave);
			}

			eventSlave.devotion += 3;
			eventSlave.trust -= 3;
			seX(eventSlave, "anal", "public", "penetrative");
			seX(eventSlave, "oral", PC, "penetrative");
			return t;
		}

		function arcade() {
			t = [];

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

			assignJob(eventSlave, "be confined in the arcade");
			eventSlave.sentence = 4;
			return t;
		}

		function analVirginWarning() {
			if (eventSlave.anus === 0) {
				return "This option will take anal virginity and ignore anal chastity";
			}
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.assignment !== "work as a servant",
				s => canDoAnal(s) || canDoVaginal(s),
				s => s.butt < 3,
				s => s.boobs < 500,
				s => s.weight <= 10,
				s => s.muscles <= 30,
				s => s.trust >= -20,
				s => s.devotion > 20,
				s => s.devotion <= 50
			]
		];
	}

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

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

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		if (eventSlave.bellyPreg >= 1500) {
			t.push(`is nice and slim as ${he} can be given ${his} pregnancy,`);
		} else if (eventSlave.bellyImplant >= 1500) {
			t.push(`is nice and slim as ${he} can be given the implant rounding out ${his} middle,`);
		} else if (eventSlave.bellyFluid >= 1500) {
			t.push(`is nice and slim as ${he} can be given the amount of ${eventSlave.inflationType} distending ${his} middle,`);
		} else {
			t.push("is nice and slim,");
		}
		t.push(`with a trim chest, narrow hips and not much of an ass to speak of. Despite the myriad ways a Free Cities slaveowner can give his property tits and asses, you've held off for now, keeping ${him} lithe.`);
		if (canMove(eventSlave)) {
			if (hasAnyArms(eventSlave)) {
				t.push(`${He} comes before you for a routine nude inspection, obediently ${canStand(eventSlave) ? "standing" : "kneeling"} before your desk with ${his} ${hasBothArms(eventSlave) ? "hands crossed" : "hand placed"}`);
				if (eventSlave.belly >= 30000) {
					t.push(`atop ${his} ${belly} stomach.`);
				} else if (eventSlave.belly >= 1500) {
					t.push(`over ${his} rounded stomach.`);
				} else {
					t.push(`over ${his} flat stomach.`);
				}
			} else {
				t.push(`${He} comes before you for a routine nude inspection, obediently ${canStand(eventSlave) ? "standing" : "kneeling"} before your desk.`);
			}
		} else if (!hasAnyLegs(eventSlave)) {
			t.push(`Another slave strips ${him} and leaves ${his} naked torso on your desk for a routine inspection.`);
		} else {
			t.push(`Another slave helps ${him} in, aids in undressing ${him}, and leaves ${him} for your routine inspection.`);
		}
		t.push(`A perfectly devoted slave might display ${himself}, and a rebellious one might try to cover ${himself}: ${he}'s neither. `);
		if (eventSlave.dick > 0) {
			t.push(`Though ${he}'s not sexually aroused, ${his} cock is visible and contributes greatly to ${his} androgyny.`);
		} else if (eventSlave.vagina === -1) {
			t.push(`The smooth featureless skin between ${his} legs makes ${him} look like a doll, not a girl.`);
		} else {
			t.push(`${His} bare pussy completes the picture of simultaneous innocence and availability.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} get dressed and spend some quality time with ${him}`, dress, virginityWarning(1)),
			canDoAnal(eventSlave)
				? new App.Events.Result(`Dominate ${his} narrow ass`, dominate, virginityWarning(0))
				: new App.Events.Result()
		]);

		function dress() {
			t = [];

			t.push(`You let ${eventSlave.slaveName} don a nice dress and take ${him} out${!canWalk(eventSlave) ? ` in a wheelchair` : ``}. ${He}'s a little suspicious at first but when you reach the first balcony on your lazy route around the huge building the sun on ${his} face and the gentle breeze around ${his} ears convince ${him} there's no trick. ${He} watches you shyly as you lead ${him} around, soaking in the sights and relaxing. Though you still speak as ${his} ${getWrittenTitle(eventSlave)}, you chat about goings on around the arcology, and you buy ${him} a fresh fruit from a vendor. The unexpected show of care and compassion has ${him} quite agog. By the time you take ${him} out onto another park-like balcony and fuck ${him} on a bench,`);
			if (eventSlave.dick > 0 && eventSlave.chastityPenis === 1 && eventSlave.chastityAnus === 1) {
				t.push(`${his} combined chastity cage and anal chastity belt makes ${him} move awkwardly.`);
			} else if (eventSlave.dick > 0 && eventSlave.chastityPenis === 1) {
				t.push(`${his} chastity cage is dribbling precum, a sign ${he} wouldn't mind having to take it up the ass.`);
			} else if (eventSlave.dick > 0 && eventSlave.chastityAnus === 1) {
				t.push(`${his} dick is tenting the front of ${his} dress, through ${his} anal chastity belt.`);
			} else if (eventSlave.dick > 0 && canAchieveErection(eventSlave)) {
				t.push(`${his} dick is tenting the front of ${his} dress and ${he}'s happy to take it up the ass.`);
			} else if (eventSlave.dick > 6) {
				t.push(`${he}'s happy to take it up the ass; there's even a steady stream of pre dripping from ${his} monstrous cock.`);
			} else if (eventSlave.dick > 0) {
				t.push(`${he}'s happy to take it up the ass, though there's no sign of an erection from ${his} useless sissy dick.`);
			} else if (!canDoVaginal(eventSlave)) {
				t.push(`${he}'s obviously ready and willing to get buttfucked, even if ${his} body has no physically obvious way to show it off.`);
			} else {
				t.push(`${he}'s wet and ready and moans happily as you enter ${him}.`);
			}
			if (canDoVaginal(eventSlave)) {
				t.push(VCheck.Vaginal(eventSlave, 1));
			} else {
				t.push(VCheck.Anal(eventSlave, 1));
			}
			t.push(`There's no hesitation or fear at all on ${his} face when ${he} ${canSee(eventSlave) ? "sees" : "notices"} you're returning ${him} to your penthouse; ${his} trust in you has increased.`);

			eventSlave.trust += 4;
			return t;
		}

		function dominate() {
			t = [];

			t.push(`You make a show of examining ${him} with a critical air that makes ${him} aware of ${his} modest endowments. Finished, you announce in a serious tone that you're concerned that you can't tell if ${he}'s a girl, since girls have breasts and butts. ${eventSlave.belly >= 1500 ? `${He} should do something about that bulbous gut too, you mock.` : ""}`);
			if (!canTalk(eventSlave)) {
				t.push(`${He} protests wordlessly, gesturing desperately at ${himself}.`);
			} else {
				if (eventSlave.lips > 70) {
					t.push(`${He} protests through ${his} huge lips,`);
				} else if (eventSlave.piercing.lips.weight + eventSlave.piercing.tongue.weight > 2) {
					t.push(`${He} protests through ${his} piercings,`);
				} else {
					t.push(`${He} protests,`);
				}
				t.push(Spoken(eventSlave, `"${Master}, I'm a slave girl! Please, just look at me, ${Master}!"`));
			}
			t.push(`${canSee(eventSlave) ? "Shaking your head" : "Tutting"} with pretended doubt, you say that since you're not sure you'll have to make do. Your order ${him} to`);
			if (eventSlave.belly >= 300000) {
				t.push(`lean over ${his} ${belly} belly${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
			} else if (eventSlave.belly >= 5000) {
				t.push(`lean face-down into the couch cushions${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
			} else {
				t.push(`lie face-down on the couch${PC.dick === 0 ? " while you don a strap-on" : ""}.`);
			}
			t.push(`${He} does doubtfully, only realizing what you intend when ${he} feels ${PC.dick === 0 ? "the strap-on" : "your dickhead"} forcing its way between ${his} narrow buttcheeks. ${He} whimpers and moans ${eventSlave.belly < 300000 ? "into the couch" : ""} as you roughly sodomize ${him}. It's true, ${he}'s pretty androgynous from this angle, especially while ${he} takes it up the butthole. ${He} has become more submissive to you, but there's some fear there, too.`);
			t.push(VCheck.Anal(eventSlave, 1));

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

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


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canMove,
				hasAnyArms,
				s => s.intelligence + s.intelligenceImplant < -50,
				s => s.devotion <= 50,
				s => s.devotion > -20 || s.trust < -20
			]
		];
	}

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

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

		let t = [];

		t.push(`${capFirstChar(V.assistant.name)} breaks in on your work at your desk.`);
		t.push(App.UI.DOM.combineNodes(`"${V.assistant.personality <= 0 ? properTitle() : "Sweetheart"}," ${heA} says, "`, App.UI.DOM.slaveDescriptionDialog(eventSlave)));
		t.push("is having trouble figuring out the meal dispenser again.\"");
		if (V.assistant.personality <= 0) {
			t.push(`The report is deadpan, but ${heA} brings up a visual feed.`);
		} else {
			t.push(`${HeA} brings up a visual feed. "Poor baby!" ${heA} exclaims.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`Slaves are supposed to place a cup under a spigot, which detects the cup's presence and dispenses the appropriate nutrition for the ${girl}. Unfortunately this concept seems a little tough for ${eventSlave.slaveName}. With no one around to ask for help, ${he} has resorted to trying to suck food out of the spigot with ${his} mouth. With no cup to be detected, ${he}'s not getting very far, and is getting bitterly frustrated.`);
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} something more appropriate to suck on`, suck),
			new App.Events.Result(`Reassure ${him} and get ${him} to slow down`, reassure),
			new App.Events.Result(`Spank the stupid out of ${him}`, spank),
			V.arcade > 0
				? new App.Events.Result(`Sentence ${him} to a month in the arcade`, arcade)
				: new App.Events.Result()
		]);

		function suck() {
			t = [];

			t.push(`${capFirstChar(V.assistant.name)}, as usual, has to give the stupid slut considerable coaching to get ${him} to your office without getting lost. This is a near-miraculous imbecility, as the penthouse is expressly designed to make it nearly impossible to get anywhere from anywhere else without passing by the office door. ${He} understands orders to`);
			if (PC.dick === 0) {
				t.push(`perform cunnilingus, though, and gets down to it eagerly enough. When ${he} finishes the job, ${he} wipes ${his} mouth and then looks up at you doubtfully.`);
			} else {
				t.push(`suck a dick, though, and gets down to it eagerly enough. When ${he} finishes the job, ${he} busily swallows every drop of your ejaculate and then looks up at you doubtfully.`);
			}
			if (!canTalk(eventSlave)) {
				t.push(`${He} slowly spells out a question with ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"}, asking if ${he}'s a good slave.`);
			} else {
				t.push(`${He} mumbles a hesitant question:`);
				t.push(Spoken(eventSlave, `"${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}, am I a good slave?"`));
			}
			t.push(`You tell ${him} that ${he} is, running a hand ${eventSlave.hStyle.includes("bald") ? `across ${his} bald scalp` : `through ${his} hair`}. ${He} seems <span class="devotion inc">reassured,</span> and <span class="trust inc">thankful</span> when you give ${him} a cup of ${his} proper rations from your own hand.`);

			eventSlave.devotion += 2;
			eventSlave.trust += 2;
			seX(eventSlave, "oral", PC, "penetrative");
			return t;
		}

		function reassure() {
			t = [];

			t.push(`${He}'s so intent on trying to suck off the food dispenser that ${he} doesn't ${canHear(eventSlave) ? "hear" : "notice"} you enter the room. ${He} starts with surprise when you encircle ${his}`);
			if (eventSlave.belly >= 1500) {
				t.push(`${belly} ${eventSlave.bellyPreg >= 1500 ? "pregnant" : ""} belly`);
			} else {
				t.push("waist");
			}
			t.push(`with your arms and ${canHear(eventSlave) ? `murmur reassuringly in ${his} ear` : `give ${him} a reassuring squeeze`}.`);
			if (canTalk(eventSlave)) {
				t.push(`${He} ${say}s sadly,`);
				t.push(Spoken(eventSlave, `"Sorry ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}. I'm trying to be a good slave but it's hard."`));
			} else {
				t.push(`${He} sadly gestures at the spigot and then flicks ${his} own head.`);
			}
			t.push(`You kindly tell ${him} that you know ${he}'s trying, and that that's what really matters.`);
			if (canTalk(eventSlave)) {
				t.push(Spoken(eventSlave, `"Really, ${eventSlave.rudeTitle === 1 ? PoliteRudeTitle(eventSlave) : Master}?"`));
				t.push(`${he} asks hopefully.`);
			} else {
				if (hasBothArms(eventSlave)) {
					t.push(`${His} hands awkwardly ask, "Really?"`);
				} else {
					t.push(`${His} hand awkwardly asks, "Really?"`);
				}
			}
			t.push(`You whisper into ${his} ear that yes, ${he} will be all right as long as ${he} does ${his} best. ${He} wiggles ${his} butt against you a little and giggles`);
			if (PC.dick !== 0) {
				t.push(`at the responding stiffness ${he} feels between ${his} buttocks. ${He} shimmies down and takes you into ${his} mouth${PC.vagina > -1 ? ` and does ${his} best to reach the top of your pussy with the tip of ${his} tongue` : ""},`);
			} else {
				t.push(`as you shove ${him} to ${his} knees. ${He} shimmies down and eats you out,`);
			}
			t.push(`${canSee(eventSlave) ? "looking you in the eyes the whole time and" : ""} <span class="hotpink">smiling</span> as much as ${he} can manage with ${PC.dick !== 0 ? `a dick in ${his} mouth` : `${his} tongue working your clit`}.`);

			eventSlave.devotion += 4;
			seX(eventSlave, "oral", PC, "penetrative");
			return t;
		}

		function spank() {
			t = [];

			t.push(`${He}'s so intent on trying to suck off the food dispenser that ${he} doesn't ${canHear(eventSlave) ? "hear" : "notice"} you enter the room. ${He} starts with surprise when you seize ${him} and push ${him}`);
			if (eventSlave.belly >= 300000) {
				t.push(`over ${his} ${belly} belly, face-down into the counter.`);
			} else {
				t.push(`face-down across the counter.`);
			}
			t.push(`After making ${him} confirm that ${canHear(eventSlave) ? `${he} can hear you` : `${he}'s paying attention`}, you patiently repeat the very simple instructions for getting meals from the kitchen. Then, you tell ${him} to repeat them. ${He} manages the first step fine and has completely forgotten the second. The moment ${he} hesitates, ${he} has an instant to ${canHear(eventSlave) ? "hear" : "feel"} the rush of air trying to get out of the way of your speeding palm before it contacts the ${eventSlave.skin} skin of ${his} buttocks. ${He} writhes and cries and promises to try harder, but ${his} poor rear end is almost raw before ${he} gets it all right. ${He} leaves the kitchen snuffling sadly to ${himself}, but in the coming days ${he} really does seem to do ${his} best to avoid another beating.`);

			eventSlave.trust -= 5;
			return t;
		}

		function arcade() {
			t = [];

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

			assignJob(eventSlave, "be confined in the arcade");
			eventSlave.sentence = 4;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				s => s.rules.release.masturbation !== 0,
				hasAnyArms,
				hasAnyLegs,
				canTalk,
				canDoAnal,
				s => s.devotion <= 50,
				s => s.devotion > 20 || s.trust < -20,
				s => s.vagina < 0,
				s => s.dick > 0,
				s => s.anus > 0,
				s => s.skill.anal <= 30
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`has been doing ${his} best to be a good slave ${girl} recently. Since ${he} doesn't have a pussy, that means ${he}'s been doing ${his} best to take it up the ass like a good slave. ${He} isn't all that used to it yet, but ${he} tries. ${He}'s trying right now, bent over the arm of the couch in your office with your ${PC.dick === 0 ? "vibrating strap-on" : "cock"} pumping in and out of ${him}. ${He} looks like ${he} wants to ask something, so you tell ${him} to spit it out.`);
		if (canTalk(eventSlave)) {
			if (eventSlave.lips > 70) {
				t.push(`${He} begs meekly through ${his} massive dick-sucking lips,`);
			} else if (eventSlave.piercing.lips.weight + eventSlave.piercing.tongue.weight > 2) {
				t.push(`${He} begs meekly through ${his} mouthful of piercings,`);
			} else {
				t.push(`${He} begs meekly,`);
			}
			t.push(`"${Spoken(eventSlave, `${Master}, may I please, please touch myself?`)}"`);
		} else {
			t.push(`${He} uses gestures to ask if ${he} can masturbate while you sodomize ${him}.`);
		}
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him}`, permit),
			new App.Events.Result(`Train ${him} to be a skilled anal bottom`, bottom),
			(eventSlave.fetish !== "buttslut" || eventSlave.fetishKnown !== 1) && eventSlave.prostate > 0
				? new App.Events.Result(`Train ${him} to orgasm anally`, orgasm)
				: new App.Events.Result()
		]);

		function permit() {
			t = [];

			t.push(`${He} moans with gratitude and relief. ${He} masturbates furiously as you continue to use ${his} butt. ${He} was clearly near the edge anyway, and`);
			if (eventSlave.balls > 0) {
				t.push("spatters the couch with cum");
			} else if (eventSlave.prostate > 0) {
				t.push("spatters the couch with ejaculate");
			} else {
				t.push("shakes with release");
			}
			t.push(`after just a few strokes of your ${PC.dick === 0 ? "strap-on" : "cock"} up ${his} butt. ${His} ${anusDesc} ass spasms and tightens with ${his} climax${PC.dick !== 0 ? ", a wonderful sensation" : ""}. You aren't finished with ${him}, but ${he} rubs ${himself} languidly and enjoys the hard anal reaming more than ${he} ever has previously. ${His} devotion to you has increased.`);
			t.push(VCheck.Anal(eventSlave, 1));

			eventSlave.devotion += 4;
			return t;
		}

		function bottom() {
			t = [];

			t.push(`${He} obeys your orders to keep ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} off ${his} dick, but can't hide ${his} disappointment and frustration. You keep a close watch on ${him}, and buttfuck ${him} every chance you get, teaching ${him} the finer points of taking a ${PC.dick === 0 ? "strap-on" : "dick"} up the butt. You focus entirely on your pleasure, teaching ${him} how to use ${his} ${anusDesc} anal ring to extract orgasms from cocks. This experience was hard for ${him} but has increased ${his} anal skill.`);
			t.push(VCheck.Anal(eventSlave, 9));

			slaveSkillIncrease('anal', eventSlave, 10);
			return t;
		}

		function orgasm() {
			t = [];

			t.push(`${He} obeys your orders to keep ${his} ${hasBothArms(eventSlave) ? "hands" : "hand"} off ${his} dick, but can't hide ${his} disappointment and frustration. You keep a close watch on ${him}, and fuck ${his} ${anusDesc} anus every chance you get, keeping ${him} desperately aroused and desperately sodomized. After some days of this, ${he} finally reaches a point of desperate arousal that permits ${him} to orgasm to prostate stimulation alone.`);
			if (fetishChangeChance(eventSlave) > jsRandom(1, 100)) {
				t.push(`Before ${he} realizes what's happening, <span class="lightcoral">${he}'s getting aroused at the thought of anal sex.</span>`);

				eventSlave.fetishStrength = 10;
				eventSlave.fetish = "buttslut";
				eventSlave.fetishKnown = 1;
			} else {
				t.push(`Despite being used as an anal slut for a whole week, ${he} was not significantly affected.`);
			}

			t.push(VCheck.Anal(eventSlave, 9));
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canWalk,
				canTalk,
				s => s.devotion > 50,
				s => s.trust > 50,
				s => s.health.condition > 90,
				s => s.muscles > 5,
				s => s.weight >= -30,
				s => s.weight <= 30,
				s => s.health.tired <= 30
			]
		];
	}

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

		App.Events.drawEventArt(node, eventSlave);

		let t = [];

		t.push("As you manage your empire from your office, a constant traffic of slaves passes by its door. The glass walls allow a good view of them, and since you naturally own what you find appealing, the passing chattel often draws your eye. For example, this morning you notice");
		t.push(contextualIntro(V.PC, eventSlave, true));
		t.push(`almost bounce into view. ${He}'s physically fit, at a healthy weight,`);
		if (eventSlave.belly >= 10000) {
			if (eventSlave.bellyPreg >= 3000) {
				t.push(`heavily pregnant,`);
			} else if (eventSlave.bellyImplant >= 3000) {
				t.push(`despite ${his} ${belly} fake belly,`);
			} else {
				t.push(`completely full of ${eventSlave.inflationType},`);
			}
		}
		if (eventSlave.physicalAge > 35) {
			t.push(`and is getting such excellent modern medical care that despite ${his} age, ${he} has the energy of a teenager.`);
		} else if (eventSlave.physicalAge > 19) {
			t.push(`is full of youth and vigor, and is in truly perfect health due to the miracles of modern medicine.`);
		} else if (eventSlave.physicalAge > 12) {
			t.push(`and is a teenager, not to mention the perfect health ${he} owes to the miracles of modern medicine.`);
		} else {
			t.push(`and is a little ${girl}, not to mention the perfect health ${he} owes to the miracles of modern medicine.`);
		}
		if (eventSlave.energy > 95) {
			t.push(`Apart from ${his} absurd sex drive,`);
		} else if (eventSlave.energy > 40) {
			t.push(`In addition to ${his} very healthy libido,`);
		} else {
			t.push(`Despite ${his} mediocre libido,`);
		}
		t.push(`${he}'s overflowing with energy. ${He} half-runs, half-skips down the hallway, slowing in the doorway as ${he} feels your gaze. Without stopping, ${he} turns to meet your eyes, winks trustingly, and bursts out, "${Spoken(eventSlave, `Hi ${Master}! Love you!`)}" Then ${he} continues on ${his} merry way.`);
		App.Events.addParagraph(node, t);
		t = [];

		t.push(`Someone's a happy ${desc} today.`);
		App.Events.addParagraph(node, t);
		t = [];

		App.Events.addResponses(node, [
			new App.Events.Result(`Follow ${him}`, follow),
			new App.Events.Result(`Play with ${him}`, play),
			new App.Events.Result(`Punish ${him}`, punish)
		]);

		function follow() {
			t = [];

			t.push(`${His} sheer 'joie de vivre' is irresistible, and it certainly draws you out of your office. You're not slow, and of course you know where ${he}'s going, so you catch up quickly. ${He} gives you the careful measuring glance of a devoted sex slave who's checking whether ${his} owner wants to fuck ${him} right now, and correctly decides that that isn't your intent, at least right this minute. Instead, you continue the direction ${he} was going, and ${he} follows. "${Master}," ${he} ${say}s hesitantly, "I hope that was an okay thing for me to do." You assure ${him} it was. "Thanks, ${Master}," ${he} beams, grinning like an idiot. Smiling at ${his} infectious enthusiasm for life, you ask ${him} why ${he}'s so happy this morning. ${He} looks momentarily ${eventSlave.intelligence + eventSlave.intelligenceImplant > 50 ? `perplexed, not a common look for a slave as smart as ${him}` : "perplexed"}.`);
			t.push(`"${Spoken(eventSlave, `I don't know! I just woke up this morning feeling really, really good. ${eventSlave.intelligence + eventSlave.intelligenceImplant > 50 ? `I'm sure the fact that I'm benefiting from incredibly advanced medicine has something to do with it; thank you very much for that, ${Master}. Other than that,` : ""} I just feel happy.`)}" This has to be some sort of milestone for ${him}, and for you, and maybe for slavery in general: if ${he} can be this pleased with life, something must be going right. You walk ${him} to where ${he}'s going`);
			switch (eventSlave.assignment) {
				case "whore":
					t.push(`(one of the arcology's nicer streets, where ${he}'ll spend the day selling ${his} body),`);
					break;
				case "serve the public":
					t.push(`(one of the arcology's nicer streets, where ${he}'ll spend the day flirting with citizens and having sex with anyone that's willing),`);
					break;
				case "work a glory hole":
					t.push(`(a wall mounting that will render ${him} a helpless target for dicks all day),`);
					break;
				case "get milked":
					t.push(`(${his} favorite milker in the penthouse),`);
					break;
				case "take classes":
					t.push(`(a quiet area with a touchscreen where ${he} can review material from the slave etiquette class ${he}'s working on),`);
					break;
				case "please you":
					t.push(`(the wardrobe, where ${he}'ll get dressed before attending to you for the rest of the day),`);
					break;
				case "be a subordinate slave":
					t.push(`(the living area of the slave ${he}'s been assigned to serve),`);
					break;
				case "work as a servant":
				case "be a servant":
					t.push(`(the closet that contains the cleaning items ${he}'ll use to dust and polish the penthouse today),`);
					break;
				case "work as a nanny":
					t.push(`(${V.nurseryName}, where ${he} is tending to the children),`);
					break;
				case "stay confined":
					t.push(`(${his} cell),`);
					break;
				case "guard you":
					t.push(`(the armory where ${his} weapons are kept),`);
					break;
				case "be your Head Girl":
					t.push(`(the assignment location of a slave who needs some hands-on guidance from your Head Girl),`);
					break;
				case "recruit girls":
					t.push(`(the camera station ${he} uses to convince people from the old world that becoming your slave is a good idea),`);
					break;
				case "serve in the master suite":
					t.push(`(your bedroom, where ${he}'ll ready ${himself} for later),`);
					break;
				case "be the DJ":
					t.push(`(the back of ${V.clubName} where ${he} decides the playlist for the day),`);
					break;
				case "be the Attendant":
					t.push(`(the back of ${V.spaName}, where ${he}'ll decide the perfect mixture for today's baths),`);
					break;
				case "be the Madam":
					t.push(`(${his} office in ${V.brothelName}, where ${he}'ll decide the slaves on display),`);
					break;
				case "be the Schoolteacher":
					t.push(`(${his} office in ${V.schoolroomName}, where ${he}'ll decide today's lesson),`);
					break;
				case "be the Stewardess":
					t.push(`(${his} office in ${V.servantsQuartersName}, where ${he}'ll divvy out today's tasks),`);
					break;
				case "be the Milkmaid":
					t.push(`(${V.dairyName}, to check on the cattle),`);
					break;
				case "be the Farmer":
					t.push(`(${V.farmyardName}, to tend to the crops),`);
					break;
				case "be the Wardeness":
					t.push(`(${V.cellblockName}, to oversee the inmates),`);
					break;
				case "be your Concubine":
					t.push(`(your bed),`);
					break;
				case "be the Nurse":
					t.push(`(${V.clinicName}, to check on the patients),`);
					break;
				case "be the Matron":
					t.push(`(${V.nurseryName}, where ${he} is managing children and nannies),`);
					break;
				case "live with your Head Girl":
					break;
				default:
					t.push(`(a waiting area for further assignment),`);
			}
			t.push(`and when you get there, ${he} gives you a peck on the cheek. ${eventSlave.height < 170 ? `The short ${desc} has to go up on tiptoe to reach.` : ""} <span class="hotpink">"${Spoken(eventSlave, "I really do love you")},</span> ${Master}," ${he} ${say}s, ${canSee(eventSlave) ? `${App.Desc.eyesColor(eventSlave)} shining` : "face filled with joy"}.`);

			eventSlave.devotion += 5;
			return t;
		}

		function play() {
			t = [];

			t.push(`You're not a slave, so you can't understand ${his} inner workings through direct empathy. But in your experience, a quick orgasm never fails to make a good day better. You're not slow, and of course you know where ${he}'s going, so you catch up to ${him} on quiet feet and`);
			if (eventSlave.butt > 12) {
				t.push(`sink both hands into ${his} immense rear.`);
			} else if (eventSlave.butt > 6) {
				t.push(`set ${his} enormous ass jiggling with a smack.`);
			} else if (eventSlave.butt > 3) {
				t.push(`give ${his} womanly bottom a squeeze.`);
			} else {
				t.push(`pinch ${his} cute rear.`);
			}
			t.push(`${He} squeals and whirls around, ${eventSlave.energy > 60 ? `eagerly flinging ${himself} into your arms, ready for some action` : `trustingly throwing ${himself} into your arms`}. Feeling spontaneous, you decide to get everyone off quickly and cleanly, right here.`);
			switch (eventSlave.fetish) {
				case "submissive":
					t.push(`You place a dominant hand around ${his} throat, firmly but not harshly, almost sending the submissive to ${his} knees. Your other hand`);
					break;
				case "cumslut":
					t.push(`You kiss ${him}, sliding your tongue all the way into ${his} mouth. ${He} melts into you, rhapsodically entranced by the intense oral stimulation, and ${his} tongue presses against yours with frankly sexual significance. Your hand`);
					break;
				case "humiliation":
					t.push(`Slaves are constantly passing the two of you, and you constantly turn ${him} to show ${his} body to each of them, spreading ${him} to display ${his} most intimate parts. ${His} cheeks flush with arousal and delicious shame. Your hand`);
					break;
				case "buttslut":
					t.push(`You slide a hand all the way under ${him}, pulling the flesh of ${his} buttock to one side and then nestling possessive fingers over ${his} anus, teasing and stimulating, but not penetrating. Your other hand`);
					break;
				case "boobs":
					t.push(`${He} gasps as your hot mouth finds one of ${his} ${eventSlave.nipples} nipples, and then moans openly as one of your hands mauls ${his} other breast. Your other hand`);
					break;
				case "pregnancy":
					t.push(`One of your hands begins to caress ${his} ${belly} ${eventSlave.pregKnown === 1 ? "pregnant" : ""} belly, worshipping its curve. Your other hand`);
					break;
				case "dom":
				case "sadist":
					t.push(`You press yourself aggressively against ${him}, and ${he} presses back; you grind harder still, letting ${him} know that ${he} can let ${himself} be a little aggressive, too. Groaning with pleasure and satisfaction, ${he} kisses you furiously. One of your hands`);
					break;
				case "masochist":
					t.push(`You caress one of ${his} nipples, ${eventSlave.nipples !== "fuckable" ? "bringing it completely erect before gripping it firmly. You twist it, pull it, pinch it" : "letting it swell completely shut before driving your entire fist into it"}; ${he} moans with masochistic pleasure. Your other hand`);
					break;
				default:
					t.push(`Your hand`);
			}
			if (canDoVaginal(eventSlave)) {
				t.push(`finds ${his} pussy`);
			} else if (canDoAnal(eventSlave)) {
				t.push(`reaches around behind ${him} to tease ${his} ass and play with ${his} sensitive perineum`);
			} else {
				t.push(`traces ${his} chastity`);
			}
			t.push(`and you press your groin towards ${him}. Getting the idea, ${he} begins to ${PC.dick !== 0 ? "jack you off" : "finger your clit"} energetically, taking the pace from your lusty demeanor and ${his} own feeling of energy and well-being. The two of you orgasm almost together. ${PC.dick !== 0 ? "You angle your hips to shoot your seed onto the floor" : "You climax so violently that some of your femcum makes it onto the floor"}.`);
			if (eventSlave.chastityPenis === 1) {
				t.push(`${His} ejaculate steadily drips from ${his} chastity cage,`);
			} else if (canAchieveErection(eventSlave)) {
				t.push(`${He} blows ${his} own load right after,`);
			} else if (eventSlave.balls > 0) {
				t.push(`${His} limp dick pours cum,`);
			} else if (eventSlave.dick > 0) {
				t.push(`${His} bitchclit produces a little watery fluid,`);
			} else if (eventSlave.vaginaLube > 1) {
				t.push(`${He} squirts copiously,`);
			} else {
				t.push(`Unusually for ${him}, ${he} manages to squirt a little,`);
			}
			t.push(`adding to the mess. You tell ${him} another slave will clean up, and order ${him} to go about ${his} business. ${He} turns to go, smiling with sexual satisfaction.`);

			eventSlave.trust += 5;
			return t;
		}

		function punish() {
			t = [];

			t.push(`That was not quite the prescribed way of greeting you, there was no need to greet you as ${he} passed, and most importantly, ${he}'s simply too cheery. Resolving to crush ${his} happiness, you call ${him} back to the office in a thunderous voice you know will reach ${him}. ${He} knows ${he}'s made a mistake, but comes promptly, lower lip quivering. ${His} feelings are plain to see on ${his} face: surprise, betrayal, fear. ${He} thought ${he} could be friendly, and now ${he} knows ${he} was wrong. What's more, ${he} thought ${he} could be happy, and now ${he}'s realizing that that was also wrong. As you`);
			switch (eventSlave.rules.punishment) {
				case "confinement":
					t.push(`close ${him} into a confinement cell,`);
					break;
				case "whipping":
					t.push(`tie ${him} up for a brief whipping,`);
					break;
				case "chastity":
					t.push(`lock ${him} into harsh chastity,`);
					break;
				default:
					t.push(`gag ${him} for speaking out of turn,`);
			}
			t.push(`a wail of despair tears its way out of ${his} throat, far out of proportion to the standard punishment you're applying. It's perhaps the saddest sound you've ever heard a slave make. Slaves cry all the time, but usually they already understand that happiness is out of their reach. This one just woke up thinking that ${he} could be happy and was happy, and now ${he}'s realizing it isn't allowed.`);

			eventSlave.devotion -= 10;
			eventSlave.trust -= 10;
			return t;
		}
	}
};


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

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				canStand,
				canTalk,
				s => s.assignment !== Job.QUARTER,
				s => s.clothes === "a penitent nuns habit",
				s => s.devotion >= -20 && s.devotion <= 50
			]
		];
	}

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

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

		let r = [];
		r.push(`As`);
		r.push(contextualIntro(V.PC, eventSlave, true));
		r.push(`comes before you for routine inspection, it is obvious that ${his} penitent habit is having an effect. ${He} moves with exquisite care, desperate to minimize the`);
		if (eventSlave.pregKnown === 1 && eventSlave.belly >= 1500) {
			r.push(`chafing, especially on ${his} growing pregnancy.`);
		} else {
			r.push(`chafing.`);
		}
		r.push(`${He} seems totally concentrated on obedience: the constant discomfort often has the effect of forcing a slave to marshal all ${his} mental faculties in the service of pain avoidance.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`${His} responses to your routine questions are so mechanical and honest that you make an impromptu confession of it. You require ${him} to tell the full tale of all ${his} minor infractions against the rules, and even order ${him} to confess ${his} resistant thoughts to you as well. Past the ability to resist, ${he} pours out a stream of ${his} inner fears, hopes, and feelings about ${his} life as a sex slave.`);

		App.Events.addParagraph(node, r);
		App.Events.addResponses(node, [
			new App.Events.Result(`Require ${him} to self-flagellate`, flagellate),
			(canImpreg(eventSlave, V.PC) && (eventSlave.mpreg === 1 && canDoAnal(eventSlave)) || (eventSlave.ovaries === 1 && canDoVaginal(eventSlave)))
				? new App.Events.Result(`Put a baby in ${him} while ${he} prays`, babyPray, virginityWarning())
				: new App.Events.Result(),
			(canDoVaginal(eventSlave))
				? new App.Events.Result(`Fuck ${him} while ${he} prays`, fuckPray, (eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null))
				: new App.Events.Result(),
			(canDoAnal(eventSlave))
				? new App.Events.Result(`Sodomize ${him} while ${he} prays`, analPray, (eventSlave.anus === 0 ? `This option will take ${his} anal virginity` : null))
				: new App.Events.Result(),
		]);

		function flagellate() {
			r = [];
			// replace slave art
			$(artDiv).empty();
			App.Events.drawEventArt(artDiv, eventSlave, "no clothing");

			r.push(`You tell ${him} that you will offer ${him} a method of expiating ${his} deep and troubling sin. ${He} looks almost hopeful at this, until you lead ${him} out onto a balcony and order ${him} to strip before handing ${him} a simple length of hempen rope. ${He} already knows what's coming next, but ${he} breaks down as ${he} obeys your orders to kneel. ${He} sobs abjectly, but you don't even have to give the next order: ${he}'s already flogging the rope against ${his} own back in the hope of earning a reprieve by obedience. You count the strokes aloud, stopping at one in disapproval of how light ${he}'s hitting ${himself}. ${He} flogs ${himself} harder and harder, screaming a little and crying in pain and fear as you obstinately refuse to say "two." When ${he} strikes so hard that ${he} draws a little blood, you finally say the terrible word. When you're finally satisfied with ${his} self-torture, ${he}'s so exhausted that you carry ${his} limp,`);
			if (V.seePee === 1) {
				r.push(`bloody, vaguely urine-scented`);
			} else {
				r.push(`bloody`);
			}
			if (eventSlave.bellyPreg >= 1500) {
				r.push(r.pop() + `, gravid`);
			}
			r.push(`form into the shower, wash ${him}, and apply curatives, though ${he}'s still quite injured. ${He} wakes to find ${himself} curled up in your lap, and ${he} stiffens for a brief moment before relaxing against your chest, weeping softly.`);
			if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			}
			if ((eventSlave.behavioralFlaw !== "odd") && (random(1, 100) > 50)) {
				eventSlave.behavioralFlaw = "odd";
				r.push(`The terrible experience has left ${him} with <span class="flaw gain">unpleasant nervous tics.</span>`);
			}
			eventSlave.devotion += 10;
			healthDamage(eventSlave, 10);
			return r;
		}

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

		function babyPray() {
			r = [];
			r.push(`${eventSlave.slaveName} finds ${himself} standing in front of you, feeling you roughly using two fingers to finger ${his}`);
			if (eventSlave.mpreg === 1) {
				r.push(`asspussy.`);
			} else {
				r.push(`pussy.`);
			}
			r.push(`${He} gasps out:`);
			r.push(Spoken(eventSlave, `"Oh ${Master}, owner, protector, and father of my children, forgive my sins, just as you forgave my sisters in slavery before me. Count not my transgressions against your rules, but, rather, the tears of my womb. Remember not my iniquities but my willingness to be bred by you. I long to serve your`));
			if (V.PC.vagina !== -1) {
				r.push(`futa`);
			}
			r.push(Spoken(eventSlave, `dick, and beg that you will use me and bless my body with your offspring. I promise to submit to you as your breeding slut all the days of my servitude, and to grow heavy with child, again and again."`));
			r.push(`${He} moans with relief when ${he} feels you withdraw your penetrating digits partway through ${his} recitation, but by the time ${he}'s finished, you've shoved your dick up ${his} waiting`);
			if (eventSlave.mpreg === 1) {
				r.push(`asshole`);
			} else {
				r.push(`pussy`);
			}
			r.push(`and are close to blessing ${him} with a load of cum. ${He} <span class="devotion inc">does ${his} best</span> to relax and resumes,`, Spoken(eventSlave, `"Oh, ${Master}..."`));
			if (eventSlave.mpreg === 1) {
				r.push(VCheck.Anal(eventSlave, 1));
			} else {
				r.push(VCheck.Vaginal(eventSlave, 1));
			}
			knockMeUp(eventSlave, 100, 2, -1);
			if (eventSlave.fetish !== "humiliation" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">humiliation</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "pregnancy" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "pregnancy";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">carrying your children</span> with sexual fulfillment.`);
			}
			eventSlave.devotion += 4;
			return r;
		}

		function fuckPray() {
			r = [];
			r.push(`${eventSlave.slaveName} finds ${himself} standing in front of you, feeling you roughly using two fingers to finger ${his} pussy. ${He} gasps out:`);
			r.push(Spoken(eventSlave, `"Oh ${Master}, owner and protector, forgive my sins, just as you forgave my sisters in slavery before me. Count not my transgressions against your rules, but, rather, my tears of service. Remember not my iniquities but my willingness to be raped by you. I long to serve your`));
			if (V.PC.dick === 0) {
				r.push(Spoken(eventSlave, `pussy,`));
			} else {
				if (V.PC.vagina !== -1) {
					r.push(`futa`);
				}
				r.push(Spoken(eventSlave, `dick,`));
			}
			r.push(Spoken(eventSlave, `and beg that you will use me and make your dwelling place within my`));
			if (eventSlave.vagina === 0) {
				r.push(Spoken(eventSlave, `virgin folds.`));
			} else {
				r.push(Spoken(eventSlave, `feminine slit.`));
			}
			r.push(Spoken(eventSlave, `I promise to submit to you as your vaginal slut all the days of my servitude."`));
			r.push(`${He} moans with relief when ${he} feels you withdraw your penetrating digits partway through ${his} recitation, but by the time ${he}'s finished, you've shoved`);
			if (V.PC.dick === 0) {
				r.push(`a strap-on`);
			} else {
				r.push(`your dick`);
			}
			r.push(`up ${his} waiting pussy. ${He} <span class="devotion inc">does ${his} best</span> to relax and resumes,`, Spoken(eventSlave, `"Oh ${Master}..."`));
			r.push(VCheck.Vaginal(eventSlave, 1));
			if (eventSlave.fetish !== "humiliation" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">humiliation</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			}
			eventSlave.devotion += 4;
			return r;
		}

		function analPray() {
			r = [];
			r.push(`${eventSlave.slaveName} finds ${himself} standing in front of you, feeling you roughly probe ${his} ass with two fingers. ${He} gasps out:`);
			r.push(Spoken(eventSlave, `"Oh ${Master}, owner and protector, forgive my sins, just as you forgave my sisters in slavery before me. Count not my transgressions against your rules, but, rather, my tears of anal service. Remember not my iniquities but my willingness to be assraped by you. I long to serve your`));
			if (V.PC.dick === 0) {
				r.push(Spoken(eventSlave, `pussy,`));
			} else {
				if (V.PC.vagina !== -1) {
					r.push(`futa`);
				}
				r.push(Spoken(eventSlave, `dick,`));
			}
			r.push(Spoken(eventSlave, `and beg that you will use me and make your dwelling place within my butthole. I promise to submit to you as your anal slut all the days of my servitude."`));
			r.push(`${He} moans with relief when ${he} feels you withdraw your penetrating digits partway through ${his} recitation, but by the time ${he}'s finished, you've shoved`);
			if (V.PC.dick === 0) {
				r.push(`a strap-on`);
			} else {
				r.push(`your dick`);
			}
			r.push(`up ${his} loosened ass. ${He} <span class="devotion inc">does ${his} best</span> to relax and resumes,`, Spoken(eventSlave, `"Oh ${Master}..."`));
			r.push(VCheck.Anal(eventSlave, 1));
			if (eventSlave.fetish !== "humiliation" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "humiliation";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">humiliation</span> with sexual fulfillment.`);
			} else if (eventSlave.fetish !== "submissive" && fetishChangeChance(eventSlave) > random(1, 100)) {
				eventSlave.fetish = "submissive";
				eventSlave.fetishKnown = 1;
				eventSlave.fetishStrength = 10;
				r.push(`${He} has come to associate <span class="fetish gain">submission</span> with sexual fulfillment.`);
			}
			eventSlave.devotion += 4;
			return r;
		}
	}
};