code:
App.Events.PELonelyBodyguard = class PELonelyBodyguard extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Bodyguard,
			() => S.Bodyguard.rules.relationship === "permissive",
			() => S.Bodyguard.relationship === 0,
			() => S.Bodyguard.fetish !== "mindbroken",
		];
	}

	actorPrerequisites() {
		return [[
			s => s.ID !== V.BodyguardID,
			s => s.relationship === 0,
			s => s.devotion >= -20,
			s => V.seeIncest === 1 || !areRelated(s, S.Bodyguard)
		]];
	}

	execute(node) {
		let r = [];

		const BG = S.Bodyguard;
		const {
			He, His, Hers,
			he, his, him, himself, girl, wife, wives
		} = getPronouns(BG);
		const {say: say, title: Master} = getEnunciation(BG);

		const crush = getSlave(this.actors[0]);
		const {
			He2, His2,
			he2, him2, his2, wife2
		} = getPronouns(crush).appendSuffix("2");

		App.Events.drawEventArt(node, [BG, crush]);

		App.Events.addParagraph(node, [
			`You take an unusually close interest in`,
			App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(BG), `'s`),
			`health and mental well-being, since your health and mental well-being may rely on ${his} combat effectiveness. ${He} performs ${his} duties acceptably, difficult though they are. ${Hers} is a life of long hours and constant vigilance, and ${he} has very little time to ${himself}. The daily wear hasn't really affected ${him} yet, but it may.`
		]);

		r.push(`On a whim, you ask ${him} whether ${he} feels lonely. Caught off guard, ${he}`);
		if (!canTalk(BG)) {
			r.push(`says in hesitant gestures that ${he}'s all right, and that ${his} ${getWrittenTitle(BG)}'s companionship is enough for ${him}.`);
		} else {
			r.push(`${say}s hesitantly "I'm all right, ${Master}. I love being near you; that's enough for me."`);
		}
		r.push(`The slight hesitation is explained the next time`,
			App.UI.DOM.slaveDescriptionDialog(crush),
			`comes to your office. ${BG.slaveName} watches everyone who sees you, of course, but you catch ${his} eye running appreciatively up and down ${crush.slaveName}'s body as ${he2} leaves.`);

		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Make no mention of it`, no));
		choices.push(new App.Events.Result(`Set them up`, setUp));
		choices.push(new App.Events.Result(`Marry them`, marry));
		App.Events.addResponses(node, choices);

		function no() {
			return `${BG.slaveName} is a big ${girl} and can look after ${himself}, you reflect. You take no particular action to favor ${his} interest in ${crush.slaveName}.`;
		}

		function setUp() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You decide to amuse yourself by engaging in a game of subtle matchmaking. You carefully rearrange ${crush.slaveName}'s schedule and duties so ${he2} and ${BG.slaveName} spend as much time as possible with one another. At the same time, you gradually reduce ${crush.slaveName}'s access to sexual outlets. After letting the situation marinate for a few days, you decide that the time is ripe, and without any further explanation assign ${crush.slaveName} to spend the day in ${BG.slaveName}'s armory. It's barely midmorning before they're making out on ${BG.slaveName}'s workout mat, and by the afternoon ${crush.slaveName} is under ${BG.slaveName}'s workbench, orally servicing ${his2} new fuckbuddy as ${he} maintains ${his} machine pistol.`);
			crush.relationship = 3;
			crush.relationshipTarget = BG.ID;
			BG.relationship = 3;
			BG.relationshipTarget = crush.ID;
			V.oralTotal += 1;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function marry() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You order ${crush.slaveName} in and brusquely inform ${him2} ${he2}'ll be marrying ${BG.slaveName}. ${crush.slaveName} is too surprised to react much, and even ${BG.slaveName} looks shocked, but there is a gleam of wild glee in ${his} eyes. You give them a few minutes to get dressed in special outfits you make available: they're lacy lingerie designed to resemble old world wedding dresses, but without concealing anything.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`${BG.slaveName} is`);
			if (BG.vagina === 0) {
				r.push(`a virgin, so ${he}'s wearing white`);
			} else if (BG.vagina < 0 && BG.dick > 0) {
				r.push(`a sissy slave, so ${he}'s wearing light blue`);
			} else if (BG.vagina < 0 && BG.dick < 1) {
				r.push(`a null, so it's wearing black`);
			} else {
				r.push(`is an experienced sex slave, so ${he}'s wearing light pink`);
			}
			r.push(`against ${his} ${BG.skin} skin.`);
			if (canPenetrate(BG)) {
				r.push(`The sight of ${crush.slaveName} has ${him} stiffly erect, and ${he}'s wearing a little bow around ${his} cockhead.`);
			} else if (canAchieveErection(BG)) {
				r.push(`${He}'s wearing a little bow over ${his} caged girldick.`);
			} else if (BG.dick > 0) {
				r.push(`${He}'s impotent, but ${he}'s wearing a little bow around ${his} useless cockhead.`);
			} else if (BG.clit > 0) {
				r.push(`${His} prominent clit is engorged, and ${he}'s wearing a tiny bow on it.`);
			} else if (BG.vagina >= 0) {
				r.push(`${He}'s wearing a demure little bow just over ${his} pussy.`);
			}
			if (BG.anus > 1) {
				r.push(`${His} lacy panties are designed to spread ${his} buttocks a little and display ${his} big butthole.`);
			} else if (BG.anus === 0) {
				r.push(`${His} lacy panties cover ${his} virgin anus, for once.`);
			}
			if (BG.boobs > 1000) {
				r.push(`${His} bra makes no attempt to cover or even support ${his} huge breasts, simply letting them through holes in the lace to jut proudly out.`);
			} else if (BG.boobs > 500) {
				r.push(`${His} bra supports and presents ${his} big breasts, leaving ${his} stiffening nipples bare.`);
			} else {
				r.push(`${His} bra supports and presents ${his} breasts, giving ${him} more cleavage than ${he} usually displays.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`${crush.slaveName} is`);
			if (crush.vagina === 0) {
				r.push(`a virgin, so ${he2}'s wearing white`);
			} else if (crush.vagina < 0 && crush.dick > 0) {
				r.push(`a sissy slave, so ${he2}'s wearing light blue`);
			} else if (crush.vagina < 0 && crush.dick < 1) {
				r.push(`a null, so it's wearing black`);
			} else {
				r.push(`is an experienced sex slave, so ${he2}'s wearing light pink`);
			}
			r.push(`against ${his2} ${crush.skin} skin.`);
			if (canPenetrate(crush)) {
				r.push(`The sight of ${BG.slaveName} has ${him2} stiffly erect, and ${he2}'s wearing a little bow around ${his2} cockhead.`);
			} else if (canAchieveErection(crush)) {
				r.push(`${He2}'s wearing a little bow over ${his2} caged girldick.`);
			} else if (crush.dick > 0) {
				r.push(`${He2}'s impotent, but ${he2}'s wearing a little bow around ${his2} useless cockhead.`);
			} else if (crush.clit > 0) {
				r.push(`${His2} prominent clit is engorged, and ${he2}'s wearing a tiny bow on it.`);
			} else if (crush.vagina >= 0) {
				r.push(`${He2}'s wearing a demure little bow just over ${his2} pussy.`);
			}
			if (crush.anus > 1) {
				r.push(`${His2} lacy panties are designed to spread ${his2} buttocks a little and display ${his2} big butthole.`);
			} else if (crush.anus === 0) {
				r.push(`${His2} lacy panties cover ${his2} virgin anus, for once.`);
			}
			if (crush.boobs > 1000) {
				r.push(`${His2} bra makes no attempt to cover or even support ${his2} huge breasts, simply letting them through holes in the lace to jut proudly out.`);
			} else if (crush.boobs > 500) {
				r.push(`${His2} bra supports and presents ${his2} big breasts, leaving ${his2} stiffening nipples bare.`);
			} else {
				r.push(`${His2} bra supports and presents ${his2} breasts, giving ${him2} more cleavage than ${he2} usually displays.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`The procedure is simple. The two of them prostrate themselves on the ground and beg your indulgence, though ${crush.slaveName} is running on pure autopilot by this point. You state that you grant it, and hand each of them a simple gold band to be worn on the little finger in advertisement of the inferiority of their union. In turn, each of them gives the other a ring, and ${BG.slaveName} kisses ${his} stunned bride. You pronounce them slave`);
			if (wife === wife2) {
				r.push(`${wives},</span>`);
			} else {
				r.push(`spouses,</span>`);
			}
			r.push(`and send them to the armory for their honeymoon. ${BG.slaveName} is so enthusiastic that in the coming days ${his} obvious devotion wins ${crush.slaveName} over to the arrangement.`);
			crush.devotion = Math.max(20, crush.devotion + 10); /* to accepting or better */
			crush.relationship = 5;
			crush.relationshipTarget = BG.ID;
			BG.relationship = 5;
			BG.relationshipTarget = crush.ID;
			V.oralTotal += 2;

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


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

	actorPrerequisites() {
		return [];
	}

	execute(node) {
		let r = [];
		V.nextButton = "Continue";
		const slave = S.Bodyguard;
		const {
			He, His,
			he, him, his, himself
		} = getPronouns(slave);

		const deadlinessValue = deadliness(slave);

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

		r.push(
			`It's time for the private fight you entered your Bodyguard in. It will take place in a back room of a well respected club. There is a ring set into the floor, and space for a handful of spectators, but the setup is quite spartan. The sport is just getting off the ground.`,
			App.UI.DOM.slaveDescriptionDialog(slave),
			`is first to walk into the ring. ${He}'s stark naked and is carrying a simple single-edged straight sword, identical to the one ${his} opponent will be using. The fight will be fair.`
		);

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

		r.push(`Across the ring, ${his} opponent's owner nods civilly to you and examines ${slave.slaveName}.`);

		if (slave.skill.combat > 0) {
			r.push(`${His} combat skills greatly increase ${his} deadliness.`);
		}

		if (V.AgePenalty !== 0) {
			if (slave.physicalAge >= 100) {
				r.push(`${He} seems prepared for death, in a way.`);
			} else if (slave.physicalAge >= 85) {
				r.push(`${He} tries not to waste ${his} strength before the fight, knowing that ${his} extreme age won't allow ${him} a second wind.`);
			} else if (slave.physicalAge >= 70) {
				r.push(`${He} steadies ${himself} as well as ${he} can in ${his} advanced age.`);
			}
		}

		if (slave.muscles > 95 && slave.height >= 185) {
			r.push(`${His} huge muscles are an intimidating sight and, despite their massive size, ${he} is tall enough to not be hindered by them.`);
		} else if (slave.muscles > 95) {
			r.push(`${His} huge muscles are an intimidating sight, but may hinder ${his} flexibility.`);
		} else if (slave.muscles > 30) {
			r.push(`${His} muscles are a trim and powerful sight.`);
		} else if (slave.muscles < -95) {
			r.push(`${He} can barely stand, let alone ready ${his} weapon. ${His} feeble attempts elicit a roar of laughter from the spectators.`);
		} else if (slave.muscles < -30) {
			r.push(`${He} struggles to raise ${his} weapon. ${His} feeble attempts elicit a roar of laughter from the spectators.`);
		} else if (slave.muscles < -5) {
			r.push(`${He} is rather unfit; ${he} will likely be outmatched by near any real opponent.`);
		}

		if (slave.height >= 170) {
			r.push(`${His} height gives ${him} a reach advantage with ${his} sword.`);
		}

		if (slave.health.condition > 50) {
			r.push(`${His} shining health makes ${him} a better combatant.`);
		}

		if (slave.weight > 190) {
			r.push(`${His} extreme weight nearly immobilizes ${him}. ${He} struggles to move let alone fight.`);
		} else if (slave.weight > 160) {
			r.push(`${His} extreme weight limits ${his} mobility and range of motion, making ${him} an easy target.`);
		} else if (slave.weight > 130) {
			r.push(`${His} extreme weight holds ${him} back as a pit fighter.`);
		} else if (slave.weight > 30) {
			r.push(`${His} heavy weight is an impediment as a pit fighter.`);
		} else if (slave.weight < -10) {
			r.push(`${His} light weight is an impediment as a pit fighter.`);
		}

		if (slave.health.condition < -50) {
			r.push(`${His} poor health makes ${him} a weaker combatant.`);
		}

		if (slave.health.tired > 90) {
			r.push(`${He} is exhausted and can barely stay awake; ${he} won't put up a fight.`);
		} else if (slave.health.tired > 60) {
			r.push(`${He} is fatigued and will most likely never see it coming.`);
		} else if (slave.health.tired > 30) {
			r.push(`${He} is tired and more likely to take a hit then to give one.`);
		}

		if (slave.pregKnown === 1 || slave.bellyPreg >= 1500) {
			if (slave.bellyPreg >= 750000) {
				r.push(`${His} monolithic pregnancy guarantees ${his} loss; not only is ${he} on the verge of splitting open, but it is an unmissable, indefensible target that threatens to drag ${him} to the ground. ${He} has no hope of attacking around the straining mass, let alone stopping ${his} opponent.`);
			} else if (slave.bellyPreg >= 600000) {
				r.push(`${His} titanic pregnancy is practically a guaranteed loss; ${he} can barely stand let alone fight.`);
			} else if (slave.bellyPreg >= 450000) {
				r.push(`${His} gigantic pregnancy is nearly a guaranteed loss; it presents an unmissable, indefensible target for ${his} adversary.`);
			} else if (slave.bellyPreg >= 300000) {
				r.push(`${His} massive pregnancy obstructs ${his} movement and greatly hinders ${him}. ${He} struggles to think of how ${he} could even begin to defend ${his} bulk.`);
			} else if (slave.bellyPreg >= 150000) {
				r.push(`${His} giant pregnancy obstructs ${his} movement and greatly slows ${him} down.`);
			} else if (slave.bellyPreg >= 100000) {
				r.push(`${His} giant belly gets in ${his} way and weighs ${him} down.`);
			} else if (slave.bellyPreg >= 10000) {
				r.push(`${His} huge belly is unwieldy and hinders ${his} efforts.`);
			} else if (slave.bellyPreg >= 5000) {
				r.push(`${His} advanced pregnancy makes ${him} much less effective.`);
			} else if (slave.bellyPreg >= 1500) {
				r.push(`${His} growing pregnancy distracts ${him} from the fight.`);
			} else {
				r.push(`The life just beginning to grow inside ${him} distracts ${him} from the fight.`);
			}
		} else if (slave.bellyImplant >= 1500) {
			if (slave.bellyImplant >= 750000) {
				r.push(`${His} monolithic, ${slave.bellyImplant}cc implant filled belly guarantees ${his} loss; not only is ${he} on the verge of splitting open, but it is an unmissable, indefensible target that threatens to drag ${him} to the ground. ${He} has no hope of attacking around the straining mass, let alone stopping ${his} opponent.`);
			} else if (slave.bellyImplant >= 600000) {
				r.push(`${His} titanic, ${slave.bellyImplant}cc implant filled belly is practically a guaranteed loss; ${he} can barely stand let alone fight. Not only is it cripplingly heavy, unwieldy and an easy target, but ${he} can feel it straining to hold the sheer amount of filler forced into it.`);
			} else if (slave.bellyImplant >= 450000) {
				r.push(`${His} gigantic, ${slave.bellyImplant}cc implant filled belly is nearly a guaranteed loss; it presents an unmissable, indefensible target for ${his} adversary.`);
			} else if (slave.bellyImplant >= 300000) {
				r.push(`${His} massive, ${slave.bellyImplant}cc implant filled belly is extremely heavy, unwieldy and an easy target, practically damning ${him} in combat.`);
			} else if (slave.bellyImplant >= 150000) {
				r.push(`${His} giant, ${slave.bellyImplant}cc implant filled belly obstructs ${his} movement and greatly slows ${him} down.`);
			} else if (slave.bellyImplant >= 100000) {
				r.push(`${His} giant, ${slave.bellyImplant}cc implant filled belly is very heavy and unwieldy, throwing off ${his} weight and making ${him} far less effective.`);
			} else if (slave.bellyImplant >= 10000) {
				r.push(`${His} huge, ${slave.bellyImplant}cc implant filled belly is very heavy and unwieldy, throwing off ${his} weight and making ${him} far less effective.`);
			} else if (slave.bellyImplant >= 5000) {
				r.push(`${His} large, ${slave.bellyImplant}cc implant filled belly is heavy and unwieldy, rendering ${him} less effective.`);
			} else if (slave.bellyImplant >= 1500) {
				r.push(`${His} swollen, ${slave.bellyImplant}cc implant filled belly is heavy and makes ${him} less effective.`);
			}
		}
		if (isInLabor(slave)) {
			r.push(`${He}'s feeling labor pains. ${His} ${slave.pregType > 1 ? "children" : "child"} ready to be born.`);
		} else if (slave.preg >= slave.pregData.normalBirth && slave.pregControl !== "labor suppressors") {
			r.push(`${He}'ll be going into labor any time now and ${he} knows it.`);
		}

		if (slave.bellyFluid >= 10000) {
			r.push(`${His} hugely bloated, ${slave.inflationType}-filled belly is taut and painful, hindering ${his} ability to fight.`);
		} else if (slave.bellyFluid >= 5000) {
			r.push(`${His} bloated, ${slave.inflationType}-stuffed belly is constantly jiggling and moving, distracting ${him} and throwing off ${his} weight.`);
		} else if (slave.bellyFluid >= 2000) {
			r.push(`${His} distended, ${slave.inflationType}-belly is uncomfortable and heavy, distracting ${him}.`);
		}

		if (slave.teeth === "pointy") {
			r.push(`${His} sharp teeth add nothing to ${his} actual effectiveness, but they're certainly intimidating.`);
		}

		if (!canSee(slave)) {
			r.push(`${His} lack of eyesight means certain death.`);
		} else if (!canSeePerfectly(slave)) {
			r.push(`${His} poor eyesight makes ${him} a weaker fighter.`);
		}

		if (!canHear(slave)) {
			r.push(`${His} lack of hearing is a major detriment.`);
		} else if (
			(slave.hears === -1 && slave.earwear !== "hearing aids") ||
			(slave.hears === 0 && slave.earwear === "muffling ear plugs")
		) {
			r.push(`${His} lack of hearing is a minor detriment.`);
		}

		if (deadlinessValue > 5) {
			r.push(`${slave.slaveName} seems supremely confident, even eager to please you.`);
		} else if (deadlinessValue > 3) {
			r.push(`${slave.slaveName} seems nervous, but steels ${himself} to fight for you.`);
		} else if (deadlinessValue > 1) {
			r.push(`${slave.slaveName} seems terrified, and barely controls ${himself}.`);
		} else {
			r.push(`${slave.slaveName} is obviously terrified, and might flee if there were a way out of the pit.`);
		}

		r.push(`Finally, ${his} opponent enters as well.`);

		const randomOpponent = random(1, 120);
		const {
			HeU,
			himU, hisU, heU, womanU, girlU
		} = getNonlocalPronouns(V.seeDicks).appendSuffix("U");
		let opponent;
		if (randomOpponent > 100) {
			r.push(`${HeU} is a hulking, musclebound ${girlU} with a wasp waist and immense rear. ${HeU} seems nothing short of excited.`);
			opponent = 6;
		} else if (randomOpponent > 80) {
			r.push(`${HeU} is a huge, muscular Amazon filled with confidence.`);
			opponent = 5;
		} else if (randomOpponent > 60) {
			r.push(`${HeU} is a short but muscular ${girlU}, trying ${hisU} best to look confident.`);
			opponent = 4;
		} else if (randomOpponent > 40) {
			r.push(`${HeU} is a tall, thin ${womanU} covered in ropy muscle, trying to hide ${hisU} terror.`);
			opponent = 3;
		} else if (randomOpponent > 20) {
			r.push(`${HeU} is a decent-looking slave, physically fit but obviously scared.`);
			opponent = 2;
		} else {
			r.push(`${HeU} is an average looking slave, so frightened`);
			if (V.seePee === 1) {
				r.push(`there's urine running down ${hisU} leg.`);
			} else {
				r.push(`${hisU} teeth are audibly chattering.`);
			}
			r.push(`${HeU} must have really annoyed ${hisU} master to earn this.`);
			opponent = 1;
		}

		r.push(`The umpire announces gravely that the fight is to the death and rings a bell.`);

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

		let damage;
		if (deadlinessValue > (opponent + 1)) {
			r.push(`${slave.slaveName} senses that ${he} is greatly superior, and decides to make a quick end before ${his} opponent can try something foolish. ${He} feints high and stabs low; ${his} enemy just manages to parry the low stab, but is so much weaker that ${slave.slaveName} simply overpowers ${himU}, so that ${heU} falls onto ${hisU} back with the force of the clash. ${slave.slaveName} takes one step forward and runs ${his} sword through the prostrate slave's heart. This victory has won you some renown and a sum of money from each of the spectators.`);
			repX(500, "pit", slave);
			cashX(5000, "pit", slave);
			damage = 0;
			slave.counter.pitWins += 1;
			slave.counter.pitKills += 1;
			V.pitKillsTotal += 1;
		} else if (deadlinessValue > (opponent)) {
			r.push(`The combat is long and exhausting. ${slave.slaveName} and ${his} opponent are closely matched in terms of skill, so neither takes foolish risks and a protracted, bloody fight results as both slaves take horrible but non-life-threatening cuts. Finally, ${slave.slaveName}'s superior physical condition wins out and ${his} opponent falls from exhaustion and blood loss. ${slave.slaveName} stumbles over to open ${hisU} throat. This victory has won you some renown and a sum of money from each of the spectators, though`);
			repX(500, "pit", slave);
			cashX(5000, "pit", slave);
			damage = 50;
			slave.counter.pitWins += 1;
			slave.counter.pitKills += 1;
			V.pitKillsTotal += 1;
		} else if (deadlinessValue > (opponent-1)) {
			r.push(`The combat is long and exhausting. ${slave.slaveName} and ${his} opponent are closely matched in terms of skill, so neither takes foolish risks and a protracted, bloody fight results as both slaves take horrible but non-life-threatening cuts. Finally, ${slave.slaveName}'s inferior physical condition fails ${him} and ${he} falls from exhaustion and blood loss. As ${he} slumps ${he} catches your eye with a look of apology. ${His} opponent stumbles over to open ${his} throat.`);
			damage = 1000;
		} else {
			r.push(`${slave.slaveName} is outmatched from the start. In the first pass, ${his} opponent moves beyond ${him}, opening a long gash in ${his} thigh as ${heU} goes. Thus injured, ${slave.slaveName} fails to block a slash that severs ${his} Achilles tendon on the other side. On ${his} knees, ${he} barely manages to ward off one more blow before the second one opens ${his} belly.`);
			damage = 1000;
		}

		healthDamage(slave, damage);
		if (slave.health.health < -90) {
			r.push(`${slave.slaveName} <span class="health dec">has been killed.</span>`);
			removeSlave(slave);
		} else if (damage) {
			r.push(`${slave.slaveName} is <span class="health dec">badly hurt.</span>`);
		}

		V.pitFightsTotal++;
		App.Events.addParagraph(node, r);
	}
};

repo_name: Mirarara/fc

license: mit


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

	execute(node) {
		let r = [];
		const slave = S.Bodyguard;
		const {he} = getPronouns(slave);

		r.push(`Gladiatorial combat between slaves has not yet reached the level of social acceptability it once enjoyed in Rome, but it's growing in popularity. For now, most fights are discreet affairs limited to select guests. Displaying a slave bodyguard is an excellent way to get yourself invited to participate, and ${V.assistant.name} has just passed on an invitation to a private fight next week, should you be willing to hazard a bodyguard.`);
		App.Events.addParagraph(node, r);
		r = [];
		if (V.pit) {
			r.push(`Of course, ${capFirstChar(V.pit.name)} in ${V.arcologies[0].name} sees regular fights${(V.pit.lethal) ? " to the death" : ""}, but there's something extra special about attending these outside fights${(V.pit.lethal) ? ", especially with the very real risk of violent death" : ""}.`);
		}
		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Enter your bodyguard as a gladiatrix`, enterBG),
			new App.Events.Result(`Politely decline`, decline),
		]);

		function enterBG() {
			App.Events.drawEventArt(node, S.Bodyguard);
			App.Events.queueEvent(1, new App.Events.PEPitFight());
			return `You receive a brief confirmation. It looks like ${he}'s got a fight.`;
		}

		function decline() {
			return `You decline the invitation.`;
		}
	}
};


code:
App.Events.pessBodyguardBeatdown = class pessBodyguardBeatdown extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Bodyguard,
			() => S.Bodyguard.devotion > 45
		];
	}

	execute(node) {
		const {
			He,
			he, his, him, woman
		} = getPronouns(S.Bodyguard);
		App.Events.drawEventArt(node, S.Bodyguard);

		App.Events.addParagraph(node, [
			App.UI.DOM.slaveDescriptionDialog(S.Bodyguard),
			`is a constant fixture by your side in your excursions outside the penthouse, as is befitting ${his} position as your personal bodyguard. Largely the position is ceremonial; there are few citizens with a survival instinct compromised enough to risk attacking an arcology owner in the middle of their arcology. This evening, however, you run into one of those scant few citizens — a drunkard so inebriated that he doesn't seem to understand the danger in invading your personal space. Before your personal security can be further jeopardized, your bodyguard steps in.`
		]);

		const choices = [];
		if (S.Bodyguard.muscles < 30) {
			choices.push(new App.Events.Result(null, null, "Your bodyguard lacks the musculature required to manhandle him."));
		} else {
			choices.push(new App.Events.Result(`${He} uses ${his} muscles to manhandle him`, manhandle));
		}

		if (S.Bodyguard.height < 170) {
			choices.push(new App.Events.Result(null, null, "Your bodyguard lacks the height required to tower over and intimidate him."));
		} else {
			choices.push(new App.Events.Result(`${He} intimidates him with ${his} towering height`, height));
		}

		if (S.Bodyguard.face < 95) {
			choices.push(new App.Events.Result(null, null, `Your bodyguard lacks the beauty required to distract him with ${his} wiles.`));
		} else {
			choices.push(new App.Events.Result(`${He} distracts him with ${his} beautiful face`, face));
		}

		if (S.Bodyguard.intelligence + S.Bodyguard.intelligenceImplant < -15) {
			choices.push(new App.Events.Result(null, null, `Your bodyguard lacks the intellect required to de-escalate the situation with tact.`));
		} else {
			choices.push(new App.Events.Result(`${He} de-escalates the situation with tact`, persuade));
		}

		if (S.Bodyguard.skill.combat < 1) {
			choices.push(new App.Events.Result(null, null, `Your bodyguard lacks the combat skill required to fight him hand to hand.`));
		} else {
			choices.push(new App.Events.Result(`${He} fights him hand to hand`, fight));
		}

		choices.push(new App.Events.Result(`${He} fires a few dozen warning shots`, warn));

		App.Events.addResponses(node, choices);

		function manhandle() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`${S.Bodyguard.slaveName} stomps over to the drunken delinquent, who finds himself sobering up with each step the muscular ${woman} makes in his direction. Soon he finds himself`);
			if (S.Bodyguard.height > 170) {
				r.push(`staring up at ${his} ${S.Bodyguard.faceShape} face`);
			} else if (S.Bodyguard.height > 150) {
				r.push(`eye to eye with ${his} ${S.Bodyguard.faceShape} face`);
			} else {
				r.push(`looking down at ${his} ${S.Bodyguard.faceShape} face`);
			}
			r.push(`as ${he} grips him by the shoulders and lifts him bodily off of the ground. The man squeals with terror as he begs forgiveness for his affront to you, but ${S.Bodyguard.slaveName} simply tosses him away from your presence as if discharging him from a bar. Word of your herculean protector is soon the talk of ${V.arcologies[0].name} and beyond, with many in the old world mistakenly believing you are guarded by a warrior so strong ${he} can throw any man the breadth of a room in a single heave.`);
			repX(2500, "event", S.Bodyguard);
			if (S.Bodyguard.prestige < 1) {
				S.Bodyguard.prestige = 1;
				S.Bodyguard.prestigeDesc = "Word in the arcology is $he can throw a man the breadth of a room in a single heave.";
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function height() {
			repX(2500, "event", S.Bodyguard);
			if (S.Bodyguard.prestige < 1) {
				S.Bodyguard.prestige = 1;
				S.Bodyguard.prestigeDesc = "Word in the arcology is $he is twice the height of any man.";
			}
			return `${S.Bodyguard.slaveName} calmly strides over to the drunken delinquent and simply towers over him with a glower on ${his} ${S.Bodyguard.faceShape} face. The man quickly finds himself sobering up and moves to run from the scene with all the drunken haste he can muster. Unfortunately for him, ${S.Bodyguard.slaveName} matches his pace with a brisk power-walk, and the citizen soon finds himself face-down on the pavement after a swift strike to the back of the head. Word of your giant protector is soon the talk of ${V.arcologies[0].name} and beyond, with many in the old world mistakenly believing you are guarded by a warrior twice the height of any man.`;
		}

		function face() {
			repX(2500, "event", S.Bodyguard);
			if (S.Bodyguard.prestige < 1) {
				S.Bodyguard.prestige = 1;
				S.Bodyguard.prestigeDesc = "Word in the arcology is $his beauty is unmatched by any $woman in the world.";
			}
			return `${S.Bodyguard.slaveName} seductively saunters over to the drunken delinquent and poses alluringly nearby. The man can't help but become entranced by ${his} gorgeous ${S.Bodyguard.faceShape} face, and follows ${him} like a lost puppy as ${he} beckons with one outstretched finger. ${S.Bodyguard.slaveName} lures ${his} prey into a nearby alley before slamming ${his} fist into the unsuspecting drunkard's face, leaving him knocked out cold on the floor before returning to guard you. Word of your beautiful protector is soon the talk of ${V.arcologies[0].name} and beyond, with many in the old world mistakenly believing you are guarded by a warrior unmatched by any ${woman} in the world in ${his} good looks.`;
		}

		function persuade() {
			repX(2500, "event", S.Bodyguard);
			if (S.Bodyguard.prestige < 1) {
				S.Bodyguard.prestige = 1;
				S.Bodyguard.prestigeDesc = "$His silver tongue is the envy of many in the arcology.";
			}
			return `${S.Bodyguard.slaveName} walks over to the man, puts an arm about his shoulders and explains to him ${canTalk(S.Bodyguard) ? "in hushed whispers" : "with rapid sign language"} the severity of the situation. The man sobers up quickly as the reality of his actions set in and he soon beats a hasty exit from the scene as ${S.Bodyguard.slaveName} returns to guard your body. Word of your tactful protector is soon the talk of ${V.arcologies[0].name} and beyond, with many in the old world mistakenly believing you are guarded by a warrior whose silver tongue is the envy of many politicians.`;
		}

		function fight() {
			repX(2500, "event", S.Bodyguard);
			if (S.Bodyguard.prestige < 1) {
				S.Bodyguard.prestige = 1;
				S.Bodyguard.prestigeDesc = "Word in the arcology is $his hands are deadlier than many weapons.";
			}
			return `${S.Bodyguard.slaveName} quickly maneuvers over to the man and strikes him low in the stomach, robbing him of breath in a single strike. The man sobers up somewhat and raises his arms to defend himself, but finds himself outmatched by ${S.Bodyguard.slaveName}'s skillful attacks. It doesn't take long for ${S.Bodyguard.slaveName} to reduce the man to a battered heap on the ground with ${his} hands alone, after which ${he} soon returns to you to guard your body. Word of your martial protector is soon the talk of ${V.arcologies[0].name} and beyond, with many in the old world mistakenly believing you are guarded by a warrior whose hands are deadlier than many weapons.`;
		}

		function warn() {
			repX(500, "event", S.Bodyguard);
			return `${S.Bodyguard.slaveName} draws ${his} firearm and blasts the pavement between yourself and the delinquent with a hail of bullets. The man sobers up immediately at the excessive use of firepower and flees the scene in fear of ${S.Bodyguard.slaveName} turning ${his} weapon on him. ${S.Bodyguard.slaveName} holsters ${his} weapon and returns to your side to guard you. Word of your trigger happy protector is soon the talk of ${V.arcologies[0].name} and you find most citizens are keen to avoid causing you offense with ${S.Bodyguard.slaveName} around.`;
		}
	}
};


code:
App.Events.pessBodyguardBedtime = class pessBodyguardBedtime extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Bodyguard,
			() => S.Bodyguard.skill.combat !== 0
		];
	}

	execute(node) {
		const {
			He,
			he, his, him, himself, girl
		} = getPronouns(S.Bodyguard);
		App.Events.drawEventArt(node, S.Bodyguard, "no clothing");

		const r = [];
		r.push(
			App.UI.DOM.slaveDescriptionDialog(S.Bodyguard),
			`is accustomed to sleep on a bedroll placed across the bottom of the door to your bedroom. In this way, no one could enter the room without going past your bodyguard, even as ${he} lies resting. As you watch, the breath in ${his}`
		);
		if (S.Bodyguard.muscles > 30) {
			r.push(`muscular`);
		} else if (S.Bodyguard.muscles <= 5) {
			r.push(`thin`);
		} else if (S.Bodyguard.boobs < 500 && S.Bodyguard.butt < 3) {
			r.push(`androgynous`);
		} else if (S.Bodyguard.height >= 170) {
			r.push(`tall`);
		} else if (S.Bodyguard.height < 150) {
			r.push(`short`);
		} else {
			r.push(`feminine`);
		}
		if (V.seeRace === 1) {
			r.push(`${S.Bodyguard.race}`);
		}
		r.push(`form slowly raises and lowers the sheet over ${him}.`);
		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Let ${him} up in bed with you`, inBed),
			new App.Events.Result(`Commend and reward ${him} the next morning`, morning, (S.Bodyguard.anus === 0 || S.Bodyguard.vagina === 0) ? `This option will take ${his} virginity` : ``)
		]);

		function inBed() {
			S.Bodyguard.devotion -= 5;
			return `Of course, ${S.Bodyguard.slaveName} promptly obeys your order that ${he} come up and join you in bed. After you have gone to sleep, however, ${he} does not feel that ${he} can sleep ${himself}, since ${he} is no longer blocking the door. ${He} spends the rest of the night in sleepless watch, agonizing over this disruption of ${his} protection of your person. ${He} is confused and unhappy.`;
		}

		function morning() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`The next morning, you sit at your desk to do business as usual, and ${S.Bodyguard.slaveName} takes up station just behind your left shoulder. You thank ${him} for ${his} vigilance as ${he} does. ${He} looks almost confused to be thanked for doing ${his} proper duty, so you settle on a more direct method of communicating your closeness to ${him}.`);
			if (S.Bodyguard.vagina === 0 && !canDoVaginal(S.Bodyguard)) {
				r.push(`Since ${he}'s wearing chastity, you take ${him} out onto the balcony, arm an extra security system so ${he} can relax, remove ${his} protection, and have gentle, loving sex with ${him} until ${he}'s climaxed twice.`);
				S.Bodyguard.chastityVagina = 0;
				r.push(VCheck.Vaginal(S.Bodyguard, 1));
			} else if ((S.Bodyguard.anus === 0) && !canDoAnal(S.Bodyguard)) {
				r.push(`Since ${he}'s wearing chastity, you take ${him} out onto the balcony, arm an extra security system so ${he} can relax, remove ${his} protection, and have gentle, loving anal sex with ${him} until ${he}'s climaxed twice.`);
				S.Bodyguard.chastityAnus = 0;
				r.push(VCheck.Anal(S.Bodyguard, 1));
			} else if (!canDoVaginal(S.Bodyguard) && !canDoAnal(S.Bodyguard)) {
				r.push(`You take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and firmly massage ${his} neck and shoulders to work out all the tension.`);
			} else if (S.Bodyguard.vagina === 0) {
				r.push(`You take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and have gentle, loving sex with ${him} until ${he}'s climaxed twice, once to your gentle massaging of ${his} mons while you fuck ${him}, and once to hard rubbing of ${his} pussy while you have enthusiastic anal sex.`);
				r.push(VCheck.Both(S.Bodyguard, 2, 1));
			} else if (canDoAnal(S.Bodyguard)) {
				if (S.Bodyguard.hormoneBalance >= 100) {
					r.push(`Since ${he}'s doped up on hormones, you take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and have gentle, loving anal sex with ${him} until ${he}'s climaxed twice.`);
				} else if (S.Bodyguard.chastityPenis === 1) {
					r.push(`Since ${he}'s a caged dick ${girl}, you take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and use ${his} anus until ${he}'s exhausted.`);
				} else if (S.Bodyguard.dick > 0 && S.Bodyguard.ballType === "sterile") {
					r.push(`Since ${he}'s chemically castrated, you take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and have gentle, loving anal sex with ${him} until ${he}'s climaxed twice.`);
				} else if (S.Bodyguard.dick > 0 && S.Bodyguard.balls === 0) {
					r.push(`Since ${he}'s a gelding, you take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and have gentle, loving anal sex with ${him} until ${he}'s climaxed twice.`);
				} else if (canAchieveErection(S.Bodyguard)) {
					r.push(`Since ${he}'s a virile slave, you take ${him} and another slave out onto the balcony, arm an extra security system so ${he} can relax, and set the other slave to orally servicing ${his} erect member. Meanwhile, you have gentle, loving anal sex with ${him} until ${he}'s climaxed twice.`);
				} else {
					r.push(`You take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and have gentle, loving anal sex with ${him} until ${he}'s climaxed twice.`);
				}
				r.push(VCheck.Anal(S.Bodyguard, 1));
			} else {
				r.push(`You take ${him} out onto the balcony, arm an extra security system so ${he} can relax, and have gentle, loving sex with ${him} until ${he}'s climaxed twice, once to your gentle massaging of ${his} mons while you fuck ${him}, and once to hard rubbing of ${his} pussy while you have enthusiastic anal sex.`);
				r.push(VCheck.Both(S.Bodyguard, 2, 1));
			}
			r.push(`<span class="devotion inc">${He} is grateful</span> that you allowed ${him} to relax in this way and <span class="trust inc">respects your judgment</span> in how you set things up.`);
			S.Bodyguard.devotion += 4;
			S.Bodyguard.trust += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.pessDjPublicity = class pessDjPublicity extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.DJ,
			() => App.Entity.facilities.club.employeesIDs().size >= 5,
			() => S.DJ.face > 95,
			() => S.DJ.skill.entertainment >= 100,
		];
	}

	execute(node) {
		const {
			He,
			he, his, him, himself, girl
		} = getPronouns(S.DJ);
		App.Events.drawEventArt(node, S.DJ);

		App.Events.addParagraph(node, [
			`Your DJ`,
			App.UI.DOM.slaveDescriptionDialog(S.DJ),
			`is a terribly pretty ${girl}. Very few of your tenants, male or female, would turn down a night in ${V.clubName} with ${him}. Demand is such that ${he} must carefully confine ${himself} to the most important, leaving the lesser of your citizens with the sight of ${his} body and the sound of ${his} beats. A few of them are so smitten as to consider earning ${his} favors the primary benefit of advancement, looking forward to the day when ${S.DJ.slaveName} will deign to mark their success in life by giving them attention on the floor. In many ways, ${S.DJ.slaveName}'s face is the face of ${V.arcologies[0].name}.`
		]);
		const faceCash = 1000;
		const prestigeCash = 10000;
		const choices = [];
		choices.push(new App.Events.Result(`Make ${him} the face of an ad campaign`, face, `This option will cost ${cashFormat(faceCash)}`));
		choices.push(new App.Events.Result(`Keep ${him} to yourself for a week`, selfish));
		if (S.DJ.prestige === 0) {
			choices.push(new App.Events.Result(`Put public emphasis on ${him} with the objective of making ${him} famous`, prestige, `This option will cost ${cashFormat(prestigeCash)}`));
		}

		App.Events.addResponses(node, choices);

		function face() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You bring ${him} out to a pretty balcony and put ${him} through an extended photo shoot. ${He} has no idea what you're planning, but ${he}'s skilled enough not to need to. ${He} dons different outfits, changes makeup, and even shifts personas for the camera, producing hundreds of elegant, sensual and eye-catching images. You dismiss ${him} back to the club when you're done, and ${he} clearly thinks little of it. The next day, however, you walk ${him} out onto the club in the morning. When the two of you, ${getWrittenTitle(S.DJ)} and DJ, reach the main club,`);
			if (canSee(S.DJ)) {
				r.push(`${he} stops short when ${he} catches sight of`);
			} else {
				r.push(`you make sure to describe to ${him}, in explicit detail, what's displayed on`);
			}
			r.push(`the main billboard screen. There ${he} is, resplendent and opulent,`);
			if (V.showInches === 2) {
				r.push(`thirty feet`);
			} else {
				r.push(`ten meters`);
			}
			r.push(`tall, giving the viewer a sultry look. ${He} only breaks down for a single moment, but it's quite a moment: ${he} cries rather inelegantly,`);
			if (canTalk(S.DJ)) {
				const {say: say, title:Master} = getEnunciation(S.DJ);
				r.push(
					`${say}ing a sobbing`,
					Spoken(S.DJ, `"I love you, ${Master}" into your ear`)
				);
			}
			r.push(`before giving you a wet kiss. Then ${he} runs over to stand under the screen, looking back at you to give you a picture-perfect imitation of the billboard ${he}'s standing under before laughing at ${himself} a little.`);
			cashX(-faceCash, "event", S.DJ);
			repX(2500, "event", S.DJ);
			S.DJ.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function selfish() {
			S.DJ.devotion += 4;
			S.DJ.trust += 4;
			repX(500, "event", S.DJ);
			return `Exclusivity and slavery interact in ways more than merely complex. ${S.DJ.slaveName}'s most passionate devotees are devastated to find ${him} nowhere but by your side for the whole week. Their reaction is mixed: awe, envy, resentment; but mostly renewed respect that ${he} is your creature, and yours alone. A lesser slave might show off the particularity you show ${him}, bringing shame on you by giving the impression that you care for ${him} as more than a slave. ${He} is no lesser slave, though, and thoroughly understands the fine line the two of you must walk as ${getWrittenTitle(S.DJ)} and slave. ${He} makes painstakingly clear, through every public glance and gesture, that ${he} is yours as a matter of trust rather than as a matter of love.`;
		}

		function prestige() {
			cashX(-10000, "event", S.DJ);
			repX(2500, "event", S.DJ);
			S.DJ.prestige = 1;
			return `For the coming week, ${he} does the publicity rounds. It's a little different than a free celebrity might do, but the mere act of letting ${him} be interviewed is enough of a display of your confidence in ${his} loyalty that people take notice. ${He} will be forever remembered as one of the first slaves to go before the press and articulately explain why ${he} loves being your property. ${He} looks good doing it, too.`;
		}
	}
};


code:
App.Events.pessHeadgirlDickgirl = class pessHeadgirlDickgirl extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.HeadGirl,
			() => canPenetrate(S.HeadGirl),
			() => S.HeadGirl.balls > 0
		];
	}

	actorPrerequisites() {
		return [[
			s => s.ID !== V.HeadGirlID,
			s => s.devotion <= 20
		]];
	}

	execute(node) {
		const {
			He,
			he, his, him, himself, girl
		} = getPronouns(S.HeadGirl);
		const subSlave = getSlave(this.actors[0]);
		const {
			he2, his2, him2, himself2,
		} = getPronouns(subSlave).appendSuffix("2");

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

		App.Events.addParagraph(node, [
			App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(S.HeadGirl), ","),
			`despite being a loyal and sexually receptive slave ${girl}, still has a virile cock. ${He} certainly isn't shy about using it in pursuit of ${his} Head Girl duties. ${subSlave.slaveName} has apparently committed some minor sin, and is now being made to pay. ${S.HeadGirl.slaveName} has ${him2} lying on ${his2} back on a table with ${his2} helpless`
		]);
		const r = [];
		if (V.seeRace === 1) {
			r.push(`${subSlave.race}`);
		}
		r.push(`throat serving as a hole for ${S.HeadGirl.slaveName} to fuck`);
		if (V.seeRace === 1) {
			r.push(`with ${his2} ${S.HeadGirl.race} cock`);
		}
		r.push(`while ${S.HeadGirl.slaveName} rains light slaps on poor ${subSlave.slaveName}'s nipples, breasts, and`);
		if (subSlave.dick > 0 && !canAchieveErection(subSlave)) {
			r.push(`limp dick.`);
		} else if (subSlave.dick > 0) {
			r.push(`defenseless dick.`);
		} else if (subSlave.clit > 0) {
			r.push(`big clit.`);
		} else {
			r.push(`mons.`);
		}
		r.push(`All the while, your Head Girl expounds on ${subSlave.slaveName}'s shortcomings and the ways in which ${he2} must apply ${himself2} to better serve you.`);
		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Compliment your Head Girl's efforts, and encourage ${him}`, encourage),
			new App.Events.Result(`Instruct your Head Girl to give that slave special attention`, special)
		]);

		function encourage() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`As you walk into the room to offer ${S.HeadGirl.slaveName} some positive reinforcement, ${he} groans, arches ${his} back, and shoots ${his} load down ${subSlave.slaveName}'s retching`);
			if (V.seeRace === 1) {
				r.push(`${subSlave.race}`);
			}
			r.push(`throat. ${S.HeadGirl.slaveName} immediately greets you with perfect decorum, despite ${his} recent orgasm, and delivers ${subSlave.slaveName}`);
			if (subSlave.earShape === "none") {
				r.push(`a quick slap to the back of the head`);
			} else {
				r.push(`an agonizing flick to the ear`);
			}
			r.push(`when ${he2} does not, in ${S.HeadGirl.slaveName}'s opinion, follow suit with sufficient speed. You inform ${S.HeadGirl.slaveName} that ${he} is a fine Head Girl, and that if ${he} continues to apply ${himself} ${he} will bring credit to you as a slaveowner. ${He} looks a little surprised, but thanks you correctly. It is only due to the arcology's monitoring system that you know that, as you turn your back and go, a single tear escapes from ${his} eye and rolls down ${his} pretty`);
			if (V.seeRace === 1) {
				r.push(`${S.HeadGirl.race}`);
			}
			r.push(`cheek. In the coming week, no shirker is safe from ${his} wrath. <span class="devotion inc">Every single slave in your penthouse has become better broken to your will.</span>`);
			seX(S.HeadGirl, "oral", V.PC, "penetrative");
			for (const slave of V.slaves) {
				if (assignmentVisible(slave)) {
					slave.devotion += 2;
				}
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function special() {
			subSlave.devotion += 15;
			seX(S.HeadGirl, "oral", subSlave, "penetrative", 5);
			return `The next time you see ${S.HeadGirl.slaveName}, you ask what ${subSlave.slaveName} did. It seems ${he2} did not complete ${his2} assigned duty with sufficient speed, and compounded ${his2} sin by talking back to ${S.HeadGirl.slaveName} when ${he} pointed this out. You observe that if ${he2} continues to fail to clean, ${he2} can do it with ${his2} tongue; and that if ${he2} continues to fail to be polite, ${he2} can clean ${S.HeadGirl.slaveName}'s${(V.seeRace === 1) ? ` ${S.HeadGirl.race}` : ``} body with ${his2} tongue. Your Head Girl nods ${his} understanding with a grin. This is one week the disobedient bitch won't soon forget.`;
		}
	}
};


code:
App.Events.pessLovingConcubine = class pessLovingConcubine extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Concubine,
			() => canWalk(S.Concubine),
			() => canSee(S.Concubine)
		];
	}

	execute(node) {
		const {
			He, His,
			he, his, him, himself, hers
		} = getPronouns(S.Concubine);
		const {say: say, title: Master} = getEnunciation(S.Concubine);
		App.Events.drawEventArt(node, S.Concubine, "no clothing");

		const r = [];
		r.push(`It's been a long, harassing day as owner of the arcology. You're composing an angry communication to a couple of imbecile tenants who seem to think they're still in their old world shithole of a homeland, insist on acting like it, and are also wealthy enough to make it unwise to simply defenestrate them from the nearest window. Not that you aren't tempted. Suddenly, you feel a moist,`);
		if (S.Concubine.lips > 70) {
			r.push(`massive`);
		} else if (S.Concubine.lips > 40) {
			r.push(`pillowlike`);
		} else {
			r.push(`girlish`);
		}
		r.push(`pair of lips nibbling their way along your ear, and a`);
		if (S.Concubine.muscles > 95) {
			r.push(`powerful`);
		} else if (S.Concubine.muscles > 30) {
			r.push(`strong`);
		} else {
			r.push(`feminine`);
		}
		r.push(`hand over your shoulder. Its owner`);
		if (canTalk(S.Concubine)) {
			r.push(
				`whispers`,
				Spoken(S.Concubine, `"It can wait, ${Master}."`)
			);
		} else {
			r.push(`passes you a handwritten note: "? ? It can wait, ${getWrittenTitle(S.Concubine)}? ?"`);
		}

		r.push(
			`You turn to see your concubine`,
			App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(S.Concubine), "'s ")
		);

		if (S.Concubine.butt > 5) {
			r.push(`massive, nude ass`);
		} else if (S.Concubine.butt > 2) {
			r.push(`big naked butt`);
		} else {
			r.push(`nice, nude rear`);
		}
		r.push(`vanishing back into your suite.`);
		if (S.Concubine.boobs > 2000) {
			r.push(`As ${he} sways away from you, you can clearly see the sides of ${his} massive tits, sticking out on either side of ${his} torso.`);
		}
		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`It cannot wait`, cannot));
		choices.push(new App.Events.Result(`It can wait until after some lovemaking with the Concubine`, can));
		if (S.Concubine.anus > 0) {
			choices.push(new App.Events.Result(`It can wait until after some rough sex with the Concubine`, rough));
		}

		App.Events.addResponses(node, choices);

		function cannot() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Your responsibilities will not wait. You keep at it, composing a firm yet even-handed message that puts the miscreants in their place without ruffling feathers. ${S.Concubine.slaveName} has gone to sleep by the time you enter your suite, but ${he} wakes at your entrance and sleepily holds the sheets open so you can climb in. Once you're bedded down ${he}`);
			if (S.Concubine.boobs > 2000) {
				r.push(`lies close to you with one of ${his} breasts resting half on your chest, since ${he} can't fit under your arm with ${his} ridiculous tits.`);
			} else if (S.Concubine.boobs > 1000) {
				r.push(`burrows softly under your arm, ${his} breasts heavy against your chest.`);
			} else if (S.Concubine.boobs > 300) {
				r.push(`snuggles under your arm, ${his} breasts against your chest.`);
			} else {
				r.push(`fits ${himself} under your arm, ${his} flat chest letting ${him} mold ${himself} to your torso perfectly.`);
			}
			repX(500, "event", S.Concubine);
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function can() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`When you enter your suite, the dim light reveals ${S.Concubine.slaveName} waiting with ${his} beautiful body laid across the bed. When ${he}`);
			if (canSee(S.Concubine)) {
				r.push(`sees`);
			} else {
				r.push(`figures out`);
			}
			r.push(`the kind of lovemaking you're in the mood for, ${he}`);
			if (hasAnyArms(S.Concubine)) {
				r.push(`spreads ${his} ${hasBothArms(S.Concubine) ? "arms" : "arm"}`);
			} else {
				r.push(`presents ${himself}`);
			}
			r.push(`for you, smiling gently. ${He} kisses you lovingly,`);
			if (!canTalk(S.Concubine) && hasAnyArms(S.Concubine)) {
				r.push(`taking your hand in ${hers} and drawing a heart on your palm with one finger.`);
			} else if (canTalk(S.Concubine)) {
				r.push(
					`${say}ing,`,
					Spoken(S.Concubine, `"${capFirstChar(Master)}, I love you."`)
				);
			} else {
				r.push(`giving you a sultry look`);
			}
			if (V.PC.vagina !== -1) {
				r.push(`${He} lies on ${his} side`);
				if (hasBothLegs(S.Concubine)) {
					r.push(`and raises one leg for you so you can straddle the other,`);
				} else if (!hasAnyLegs(S.Concubine)) {
					r.push(`wiggles ${his} hips,`);
				} else {
					r.push(`motions for you to straddle ${his} leg,`);
				}
				r.push(`sliding up to press your pussy against ${his} submissive groin. You grind against ${him}; the stimulation is so strong that ${he} writhes into the sheets, panting and whining.`);
				if (V.PC.dick !== 0) {
					r.push(`Your stiff dick, unused for once, slides deliciously between your warm bodies.`);
				}
			} else {
				if (S.Concubine.vagina > 0) {
					r.push(`${His} pussy is warm and very wet, making penetration easy; ${he} gasps and arches ${his} back, clasping you between ${his} legs${(canSee(S.Concubine)) ? ` as ${his} ${App.Desc.eyesColor(S.Concubine)} look deep into yours` : ``}.`); // TODO: clean legs
					seX(S.Concubine, "vaginal", V.PC, "penetrative");
				} else if (S.Concubine.anus > 0) {
					r.push(`${His} butt is relaxed and welcoming, and ${he} holds ${his} legs back to take missionary anal loving${(canSee(S.Concubine)) ? ` as ${his} ${App.Desc.eyesColor(S.Concubine)} look deep into yours` : ``}.`);
					seX(S.Concubine, "anal", V.PC, "penetrative");
				} else {
					r.push(`${He} holds ${his} thighs together for frottage so ${he} can love you without losing ${his} virginity.`);
				}
			}
			r.push(`You both know each other quite well, and maintain the gentle communion for a long time. When ${he} senses your climax building, ${he} lets ${himself} climb to orgasm with you, holding`);
			if (V.PC.dick === 0) {
				r.push(`your hips in ${his} hands.`);
			} else {
				r.push(`you in ${his} arms.`);
			}
			r.push(`${He} quickly cleans you with ${his} mouth and heads to the shower. When ${he} gets out you're back at work, but ${he} comes out to <span class="devotion inc">plant another kiss on you.</span>`);
			S.Concubine.devotion += 10;
			seX(S.Concubine, "oral", V.PC, "penetrative");
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function rough() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`When you enter your suite, the dim light reveals ${S.Concubine.slaveName} waiting with ${his} beautiful body laid across the bed. When ${he} sees`);
			if (V.PC.dick === 0) {
				r.push(`the big strap-on you're wearing,`);
			} else {
				r.push(`the kind of sex you're in the mood for,`);
			}
			r.push(`${he} turns over and pushes ${his} face down into the sheets. ${He}`);
			if (hasAnyLegs(S.Concubine)) {
				r.push(`pulls ${his} ${hasBothLegs(S.Concubine) ? "knees" : "knee"} under ${himself} and`);
			}
			if (hasAnyArms(S.Concubine)) {
				r.push(`reaches back to pull`);
			} else {
				r.push(`presents`);
			}
			r.push(`${his}`);
			if (S.Concubine.butt > 5) {
				r.push(`huge`);
			} else if (S.Concubine.butt > 2) {
				r.push(`sizable`);
			} else {
				r.push(`pretty`);
			}
			r.push(`buttocks apart, relaxing and then clenching ${his}`);
			if (S.Concubine.anus > 2) {
				r.push(`gaping`);
			} else if (S.Concubine.anus > 1) {
				r.push(`big`);
			} else {
				r.push(`tight`);
			}
			r.push(`asshole invitingly. ${He} starts`);
			if (canTalk(S.Concubine)) {
				r.push(
					`to beg`,
					Spoken(S.Concubine, `"Please assrape me, ${Master.charAt(0)}-"`),
					`into the sheets,`);
			} else {
				r.push(`to point an inviting finger at ${his} backdoor,`);
			}
			r.push(`but you interrupt ${him} by shoving ${him} forward so that ${he}'s all the way face-down on the bed. ${He} knows how you like it and starts to wriggle, struggle, and whine as you roughly sodomize ${him},`);
			if (V.PC.dick === 0) {
				r.push(`the strap-on`);
			} else {
				r.push(`your cock`);
			}
			r.push(`ramming straight up ${his} ass despite the uncomfortable angle,`);
			if (S.Concubine.butt > 5) {
				r.push(`which ${his} huge ass makes easier for ${him} by limiting how deeply you can fuck ${him} without ${his} buttocks spread wide.`);
			} else if (S.Concubine.butt > 2) {
				r.push(`which ${his} big behind makes easier for ${him} by limiting how deeply you can fuck ${him}.`);
			} else {
				r.push(`which ${his} modest ass makes harder for ${him} by allowing you to get really deep inside ${his} anus.`);
			}
			r.push(`${He} continues to wrestle with you, sometimes even managing to dislodge`);
			if (V.PC.dick === 0) {
				r.push(`the strap-on,`);
			} else {
				r.push(`your dick,`);
			}
			r.push(`allowing you the`);
			if (V.PC.dick === 0) {
				r.push(`cruel delight`);
			} else {
				r.push(`delicious sensation`);
			}
			r.push(`of pushing it back up ${his} butt each time. Despite the pretense ${his} enjoyment is obvious;`);
			if (S.Concubine.chastityPenis === 1) {
				r.push(`though ${his} cock has been placed in a chastity cage, ${he}'s grinding against you as eagerly as if it wasn't there at all.`);
			} else if (S.Concubine.dick > 0 && S.Concubine.hormoneBalance >= 100) {
				r.push(`though ${his} hormone-filled body can't get ${his} dick hard any more, ${he}'s leaking precum all over the bed.`);
			} else if (S.Concubine.dick > 0 && S.Concubine.balls > 0 && S.Concubine.ballType === "sterile") {
				r.push(`though ${his} useless balls can't muster the effort to get ${his} dick hard any more, ${he}'s leaking precum all over the bed.`);
			} else if (S.Concubine.dick > 0 && S.Concubine.balls === 0) {
				r.push(`though ${his} gelded body can't get ${his} dick hard any more, ${he}'s leaking precum all over the bed.`);
			} else if (canAchieveErection(S.Concubine)) {
				r.push(`${he} can't stop ${himself} from humping ${his} rock-hard cock against the sheets below ${him}.`);
			} else if (S.Concubine.dick > 7) {
				r.push(`though ${his} oversized dick has grown too large to even dream of becoming erect, ${he}'s leaking precum all over the bed.`);
			} else if (S.Concubine.dick > 0) {
				r.push(`though ${he} can't get hard, ${he}'s leaking precum all over the bed.`);
			} else if (S.Concubine.clit > 1) {
				r.push(`${he} can't stop ${himself} from humping ${his} erect clit against the sheets below ${him}.`);
			} else {
				r.push(`${his} pussy is so wet ${he}'s leaving a wet spot on the sheets beneath ${him}.`);
			}
			r.push(`${He} finally orgasms, sobbing with overstimulation when you pound ${him} for a while longer before`);
			if (V.PC.dick === 0) {
				r.push(`finding your own climax.`);
			} else {
				r.push(`shooting rope after rope of cum into ${him}.`);
			}
			r.push(`${He} quickly cleans you with ${his} mouth and heads to the shower. When ${he} gets out you're back at work, but ${he} comes out to <span class="hotpink">plant a kiss on you.</span>`);
			S.Concubine.devotion += 10;
			seX(S.Concubine, "oral", V.PC, "penetrative");
			seX(S.Concubine, "anal", V.PC, "penetrative", 1);

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


code:
App.Events.pessLovingHeadgirl = class pessLovingHeadgirl extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.HeadGirl,
			() => S.HeadGirl.devotion > 95,
			() => V.slaves.length > 4
		];
	}

	execute(node) {
		const {
			He, His,
			he, his, him, himself, wife
		} = getPronouns(S.HeadGirl);
		const {title: Master} = getEnunciation(S.HeadGirl);
		const art = App.UI.DOM.appendNewElement("span", node);
		App.Events.drawEventArt(art, S.HeadGirl);
		const subSlave = V.slaves.find((s) => s.ID !== V.HeadGirlID && s.devotion <= 20);

		App.Events.addParagraph(node, [
			`You and`,
			App.UI.DOM.slaveDescriptionDialog(S.HeadGirl),
			`see one another less than one might expect, for a slaveowner and their Head Girl. You both lead very busy lives, for one. Furthermore, ${S.HeadGirl.slaveName} often functions as a second set of eyes, ears, and castigating hands for you, so it would be a waste for the two of you to be in the same place at the same time. Today, the two of you saw almost nothing of one another, so ${he} comes to your office for a quick review of the day before ${he} turns in for the night.`
		]);
		const r = [];
		r.push(`The business is brief and inconsequential, but it's good to speak with ${him}. When you're done, ${he} gets halfway to the door before coming quickly back to give you a light kiss on the cheek.`);
		if (S.HeadGirl.lips > 70) {
			r.push(`"Ah love you, ${Master}," ${he} lisps, huge lips grazing your ear,`);
		} else if (S.HeadGirl.piercing.lips.weight + S.HeadGirl.piercing.tongue.weight > 2) {
			r.push(`"Ah love you, ${Master}," ${he} lisps, oral piercings grazing your ear,`);
		} else {
			r.push(`"I love you, ${Master}," ${he} whispers into your ear,`);
		}
		r.push(`${his} breasts brushing against your shoulder as ${he} does.`);
		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Spend a night as equals`, equals));
		choices.push(new App.Events.Result(`Pull ${him} in to keep you company as you work`, company, (S.HeadGirl.anus === 0) ? `This will take anal virginity` : null));
		if (subSlave && canDoAnal(subSlave)) {
			choices.push(new App.Events.Result(`Victimize something together`, victimize, subSlave.anus === 0 ? "This will take anal virginity" : null));
		}

		App.Events.addResponses(node, choices);

		function equals() {
			if (V.seeImages) {
				$(art).empty();
				App.Events.drawEventArt(art, S.HeadGirl, "no clothing");
			}

			S.HeadGirl.devotion += 4;
			seX(S.HeadGirl, "oral", V.PC, "penetrative");
			seX(S.HeadGirl, "anal", V.PC, "penetrative");
			if (V.policies.mixedMarriage === 1 && S.HeadGirl.relationship === -3 && V.arcologies[0].FSPaternalist >= 60) {
				repX(500, "event", S.HeadGirl);
				return `You instruct your slave-${wife} ${S.HeadGirl.slaveName} to put on ${his} best dress and meet you at the door. You spend a nice night out with ${him}, taking in the sights before heading to a nice restaurant, where you receive the occasional admiring glance from your paternalistic citizens. Afterwards, you attend a show at a venue known for its respectful plays acted out by talented slaves, and you conclude the evening by returning to your penthouse to have loving sex in your master bed. When you wake the next morning, you're greeted with a long kiss and an adoring look, before ${S.HeadGirl.slaveName} slides out of bed to begin ${his} morning duties.`;
			} else {
				repX(-100, "event", S.HeadGirl);
				return `You instruct ${S.HeadGirl.slaveName} to put on ${his} best dress and meet you at the door. You spend a nice night out with ${him}, walking along the club to a nice restaurant and then seeing a show before returning home for loving sex in your master bed. ${He} nestles under your arm, falling to sleep well before you, a contented smile on ${his} face. There's a reason ${he} gets to sleep much quicker than you do. You lie awake for some time, remembering the doubting and disapproving faces of other prosperous citizens whenever they realized that you were treating a slave as an equal this evening.`;
			}
		}

		function company() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`${He} giggles happily as you seize ${his} ${S.HeadGirl.skin} wrist and pull ${him} down to the floor. ${He} nestles under your desk, between your legs to serve you with ${his} mouth for a while, gently playing with ${his}`);
			if (canDoVaginal(S.HeadGirl) && canPenetrate(S.HeadGirl)) {
				r.push(`wonderfully strange bits`);
			} else if (canDoAnal(S.HeadGirl)) {
				r.push(`anus`);
			} else if ((S.HeadGirl.dick > 0) && !canAchieveErection(S.HeadGirl)) {
				r.push(`limp cock`);
			} else if (S.HeadGirl.dick > 0) {
				r.push(`hard cock`);
			} else if (S.HeadGirl.clit > 0) {
				r.push(`huge, hard clit`);
			} else if (S.HeadGirl.vagina > -1) {
				r.push(`soaking-wet cunt`);
			} else {
				r.push(`nipples`);
			}
			r.push(`and moaning into you. ${He}'s down there for a long time, so long that you climax twice. The third time ${he} softly sucks you`);
			if (V.PC.dick === 0) {
				r.push(`to full arousal,`);
			} else {
				r.push(`hard,`);
			}
			r.push(`it naturally takes a bit longer. When done, ${he} slithers up into your lap without obscuring your work, stroking you lightly with a hand the whole time — a miracle of dexterity. ${He} gently runs ${his} hips over your crotch a few times, giving`);
			if (V.PC.dick === 0) {
				r.push(`you`);
			} else {
				r.push(`your dickhead`);
			}
			r.push(`a nice tactile tour of everything ${he} has to offer,`);
			if (V.PC.dick === 0) {
				r.push(`before gently turning around to wrap ${his} legs around you and rub ${himself} against you until you climax a third time.`);
			} else {
				r.push(`before gently lowering ${his} butt onto your cock with a sigh. ${His} devoted ass brings you to orgasm a third time, and instead of getting up and off your softening dick, ${he} just relaxes into you and bends ${himself} backward so ${he} can nibble your neck and whisper ${his} adoration into your ear.`);
			}
			r.push(`It would be hard for ${him} to get much more trusting of you, <span class="trust inc">but ${he} does.</span>`);
			S.HeadGirl.trust += 4;
			seX(S.HeadGirl, "oral", V.PC, "penetrative");
			r.push(VCheck.Anal(S.HeadGirl, 1));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function victimize() {
			const frag = new DocumentFragment();
			let r = [];
			const {
				His2,
				his2, him2,
			} = getPronouns(subSlave).appendSuffix("2");

			// art
			if (V.seeImages) {
				$(art).empty();
				App.Events.drawEventArt(art, [S.HeadGirl, subSlave], [null, "no clothing"]);
			}

			r.push(`${He} giggles happily as you seize ${his} ${S.HeadGirl.skin} wrist and pull ${him} towards where your other slaves are mostly already asleep. ${He} jokingly points out`);
			r.push(App.UI.DOM.combineNodes(App.UI.DOM.slaveDescriptionDialog(subSlave, subSlave.slaveName), `, fast asleep. You nod, and ${S.HeadGirl.slaveName} pounces. ${subSlave.slaveName} wakes in terror and confusion to find ${his2} head and neck pinned in a leg-lock that holds ${his2} mouth hard against ${S.HeadGirl.slaveName}'s`));
			if (canDoAnal(S.HeadGirl)) {
				r.push(`anus.`);
			} else if (canDoVaginal(S.HeadGirl) && canPenetrate(S.HeadGirl)) {
				r.push(`cock and cunt.`);
			} else if (S.HeadGirl.dick > 0 && !canAchieveErection(S.HeadGirl)) {
				r.push(`limp cock.`);
			} else if (S.HeadGirl.dick > 0 && S.HeadGirl.balls > 0 && S.HeadGirl.scrotum > 0) {
				r.push(`cock and balls.`);
			} else if (S.HeadGirl.clit > 0) {
				r.push(`huge, hard clit.`);
			} else if (!canDoVaginal(S.HeadGirl)) {
				r.push(`soft perineum.`);
			} else {
				r.push(`soaking-wet cunt.`);
			}
			r.push(`${subSlave.slaveName} only manages one kick of ${his2} legs before you pin them and ram yourself up ${his2} butt. ${His2} howl of protest, directed against ${S.HeadGirl.slaveName}'s privates, sends a shiver through your Head Girl.`);
			if (S.HeadGirl.lips > 70) {
				r.push(`"Oh pleathe make ${him2} moan, ${Master}," ${he} lisps through ${his} huge lips.`);
			} else if (S.HeadGirl.piercing.lips.weight+S.HeadGirl.piercing.tongue.weight > 2) {
				r.push(`"Oh pleathe make ${him2} moan, ${Master}," ${he} lisps through ${his} face full of piercings.`);
			} else {
				r.push(`"I love it when you make ${him2} moan, ${Master}," ${he} groans.`);
			}
			r.push(`Poor ${subSlave.slaveName}'s asshole takes quite a beating before ${S.HeadGirl.slaveName} finally convulses with naughty pleasure. Meanwhile, all around the nighttime rape, slaves have been woken by ${subSlave.slaveName}'s struggles. They realize how completely your Head Girl has involved ${himself} in your sexual pursuits and lie as still as they can.`);
			App.Events.addParagraph(frag, r);

			seX(subSlave, "oral", S.HeadGirl, "penetrative");
			seX(subSlave, "anal", V.PC, "penetrative");
			if (subSlave.anus === 0) {
				subSlave.anus = 1;
			}
			for (const slave of V.slaves) {
				slave.devotion += 4;
				slave.trust -= 4;
			}
			return frag;
		}
	}
};


code:
App.Events.pessMadamStrategy = class pessMadamStrategy extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Madam,
			() => App.Entity.facilities.brothel.employeesIDs().size >= 5,
			() => S.Madam.actualAge >= 35 || V.AgePenalty === 0,
			() => S.Madam.skill.whoring >= 100
		];
	}

	execute(node) {
		const {
			He,
			he, his, him, himself
		} = getPronouns(S.Madam);
		App.Events.drawEventArt(node, S.Madam);

		App.Events.addParagraph(node, [
			`Your madam`,
			App.UI.DOM.slaveDescriptionDialog(S.Madam),
			`is a perceptive whore mistress. You are a clever and well-informed manager, of course, and ${V.assistant.name} is as well-informed as it is physically possible to be about anything that happens within ${his} sensor net, but the madam has special insight. ${He} sees more sex in person than anyone in the arcology, not excepting you, and may even know some of your brothel slaves better than you do. This certainly extends to their sexualities and skills; if ${he} ever has any doubts about any of them, ${he} usually fucks them ${himself} to get at the truth.`
		]);

		const choices = [];
		choices.push(new App.Events.Result(`Review ${his} charges' skills with ${him}`, review));
		choices.push(new App.Events.Result(`Talk over the whores' appearance and correct any deficiencies`, surgery, "This option will have incidental surgical costs"));

		App.Events.addResponses(node, choices);

		function review() {
			S.Madam.devotion += 4;
			for (const slave of V.slaves) {
				if (slave.assignment === Job.BROTHEL) {
					if (slave.skill.oral < 100) {
						slave.skill.oral += 5;
					} else if (slave.skill.anal < 100) {
						slave.skill.anal += 5;
					} else if (slave.skill.vaginal < 100 && slave.vagina > 0) {
						slave.skill.vaginal += 5;
					}
				}
			}
			return `You call ${S.Madam.slaveName} up to your office; ${he} enters with the clear anticipation of being thrown over your desk, but instead finds ${himself} sitting across it from you, taking part in a three-way strategy session between you and ${V.assistant.name}. The three of you carefully review the sexual advantages and disadvantages of each of ${his} whores. ${He} is properly deferential, but definitely has insight to offer about how many of them satisfy customers. With ${his} input, you put together a plan to address their deficiencies with instruction and hands-on correction.`;
		}

		function surgery() {
			S.Madam.devotion += 4;
			for (const slave of V.slaves) {
				if (slave.assignment === Job.BROTHEL) {
					if (slave.boobs < 400) {
						slave.boobs += 200;
						slave.boobsImplant += 200;
						if (slave.boobsImplantType === "none") {
							slave.boobsImplantType = "normal";
						}
						cashX(forceNeg(Math.trunc(200*V.upgradeMultiplierMedicine)), "slaveSurgery", slave);
					} else if (slave.butt < 3) {
						slave.butt += 1;
						slave.buttImplant += 1;
						if (slave.buttImplantType === "none") {
							slave.buttImplantType = "normal";
						}
						cashX(forceNeg(Math.trunc(200*V.upgradeMultiplierMedicine)), "slaveSurgery", slave);
					} else if (slave.face < 95 && slave.faceImplant <= 10) {
						slave.face = Math.clamp(slave.face+20, -100, 100);
						slave.faceImplant += 25-5*Math.trunc(V.PC.skill.medicine/100)-5*V.surgeryUpgrade;
						cashX(forceNeg(Math.trunc(200*V.upgradeMultiplierMedicine)), "slaveSurgery", slave);
					} else if (slave.waist > -10) {
						slave.waist -= 20;
						cashX(forceNeg(Math.trunc(200*V.upgradeMultiplierMedicine)), "slaveSurgery", slave);
					} else if (slave.visualAge > 35 && slave.ageImplant === 0 && slave.faceImplant <= 10) {
						applyAgeImplant(slave);
						slave.faceImplant += 25-5*Math.trunc(V.PC.skill.medicine/100)-5*V.surgeryUpgrade;
						cashX(forceNeg(Math.trunc(200*V.upgradeMultiplierMedicine)), "slaveSurgery", slave);
					} else if (slave.lips <= 40) {
						slave.lips += 10;
						slave.lipsImplant += 10;
						cashX(forceNeg(Math.trunc(200*V.upgradeMultiplierMedicine)), "slaveSurgery", slave);
					}
				}
			}
			return `You call ${S.Madam.slaveName} up to your office; ${he} enters with the clear anticipation of being thrown over your desk, but instead finds ${himself} sitting across it from you, taking part in a three-way inventory review with you and ${V.assistant.name}. The three of you carefully review the appearance of each of ${his} whores. ${He} is properly deferential, but definitely has insight to offer about how many of them appeal to customers. With ${his} input, you put together a plan to correct their deficiencies when they can be pulled out of a shift for a quick surgical improvement.`; // TODO: the fuck is a limegreen
		}
	}
};


code:
App.Events.pessTiredCollectrix = class pessTiredCollectrix extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Milkmaid,
			() => App.Entity.facilities.dairy.employeesIDs().size >= 5,
			() => S.Milkmaid.health.condition >= 70,
			() => canAchieveErection(S.Milkmaid),
			() => cumSlaves().length >= 5,
		];
	}

	execute(node) {
		const {
			He,
			he, his, him, himself
		} = getPronouns(S.Milkmaid);
		const {
			heP
		} = getPronouns(V.PC).appendSuffix("P");
		App.Events.drawEventArt(node, S.Milkmaid, "no clothing");

		App.Events.addParagraph(node, [
			`Your milkmaid`,
			App.UI.DOM.slaveDescriptionDialog(S.Milkmaid),
			`worked hard today. ${He}'s clearly exhausted, but ${he} seems to think it below ${him} to show the fatigue. ${He} holds ${his} chin level and ${his} shoulders square as ${he} heads to the bathroom to bathe before bed. After ${his} shower, ${he} inspects ${his} crotch closely before appearing to start masturbating. On closer inspection, however, ${he}'s very gently massaging analgesic lotion into ${his} cock, wincing a little as ${he} does so. ${He} starts a little when you enter the room, but relaxes when you tell ${him} to continue ${his} ministrations and let you know how ${he}'s feeling as ${he} does.`
		]);

		const r = [];
		if (canTalk(S.Milkmaid)) {
			const {say: say, title: Master} = getEnunciation(S.Milkmaid);
			r.push(
				Spoken(S.Milkmaid, `"${Master}, I've fucked a lot of assholes today. There's ${cumSlaves().length} cumslaves in the dairy, and I fucked them all up the butt at least once. Most of them more than once. My poor cock is a little sore, ${Master},"`),
				`${he} ${say}s.`
			);
		} else {
			r.push(`${He} indicates in amusingly graphic gestures that ${his} dick is sore. ${He} painstakingly counts on ${his} fingers, letting you know that ${he}'s fucked ${cumSlaves().length} assholes today, most of them more than once.`);
		}
		r.push(`With so many slaves getting cockmilked, ${he} certainly has to work hard to make sure none of them go unpenetrated.`);
		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Use ${his} ass as ${he} looks after ${himself}`, useHim),
			new App.Events.Result(`Help ${him} with ${his} duties`, helpHim)
		]);

		function useHim() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Wordlessly, you`);
			if (V.PC.dick === 0) {
				r.push(`don a strap-on and`);
			}
			r.push(`come up behind ${him}; the first thing to touch ${him} is`);
			if (V.PC.dick === 0) {
				r.push(`the phallus,`);
			} else {
				r.push(`your rapidly hardening dick,`);
			}
			r.push(`which pokes against`);
			if (S.Milkmaid.height >= 170) {
				r.push(`right up against ${his} asshole, since ${he}'s nice and tall enough for standing anal. ${He} gasps a little and angles ${his} hips to accept your cock.`);
			} else {
				r.push(`${his} lower back, since ${he}'s shorter than you. ${He} gasps a little and hikes ${himself} up on tiptoe to accept your cock.`);
			}
			r.push(`As ${he} feels you slide into ${his} body ${he} whimpers with devotion, turning ${his} upper body so ${he} can kiss ${his} ${getWrittenTitle(S.Milkmaid)} while ${heP} sodomizes ${him}.`);
			if (canTalk(S.Milkmaid)) {
				r.push(
					Spoken(S.Milkmaid, `"So this is how it feels when I do them,"`),
					`${he} whispers.`
				);
			} else {
				r.push(`${He} uses gestures to thank you for making ${him} feel like the milkers do.`);
			}
			r.push(`${He} uses the lotion to masturbate while ${he} takes it, wincing whenever ${he} loses control and squeezes ${his} sore cock too hard. When you're done ${he} sinks to the bathroom floor in a boneless pool of satisfied sexual exhaustion, dripping ejaculate from ${his} front${V.PC.dick === 0 ? "" : " and back"}.`);
			S.Milkmaid.devotion += 4;
			seX(S.Milkmaid, "anal", V.PC, "penetrative");
			App.Events.addParagraph(frag, r);
			return frag;
		}
		function helpHim() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`${S.Milkmaid.slaveName} is surprised to find you in the collection facility when ${he} gets there the next morning. Since you're already`);
			if (V.PC.dick === 0) {
				r.push(`using a strap-on to fuck`);
			} else {
				r.push(`balls deep in`);
			}
			r.push(`a whining milker's ass, ${he} understands immediately that you're there to help. ${He}'s gratified, and does ${his} best to make sure you have a good time. With so many slaves physically restrained to make their backdoors available, it's hard not to. ${S.Milkmaid.slaveName} does ${his} best to use a slave next to you so ${he} can be available for extra amusement at all times as the two of you sodomize away.`);
			S.Milkmaid.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.pessTiredMilkmaid = class pessTiredMilkmaid extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.Milkmaid,
			() => App.Entity.facilities.dairy.employeesIDs().size >= 5,
			() => S.Milkmaid.health.condition >= 70,
			() => S.Milkmaid.muscles > 5,
		];
	}

	execute(node) {
		const {
			He,
			he, his, him
		} = getPronouns(S.Milkmaid);
		App.Events.drawEventArt(node, S.Milkmaid, "no clothing");

		App.Events.addParagraph(node, [
			`Your milkmaid`,
			App.UI.DOM.slaveDescriptionDialog(S.Milkmaid),
			`worked hard today. The cows have it much easier than ${he} does, in many ways: all they have to do is give milk, while ${his} life is one of hard labor. Long after they're asleep, ${he}'s cleaning the dairy and getting ready for the next day. At long last ${he}'s done, and even though ${he}'s exhausted, ${he} takes a few minutes to thoroughly stretch ${his} aching body. ${He}'s a big girl, and the play of ${his} muscles across ${his} back as ${he} works out the kinks is quite eye-catching.`
		]);

		App.Events.addResponses(node, [
			new App.Events.Result(`Give ${him} a businesslike massage`, massage),
			new App.Events.Result(`Share a milk bath with ${him}`, bath)
		]);

		function massage() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`When ${he}`);
			if (canHear(S.Milkmaid)) {
				r.push(`hears you enter ${V.dairyName},`);
			} else {
				r.push(`realizes you've entered ${V.dairyName},`);
			}
			r.push(`${he} turns to you for instructions, but you wordlessly dismiss ${him} back to ${his} stretching. ${He} gets back to it, but is surprised to find ${his} shoulders seized by your powerful hands. ${He} shivers helplessly as you knead ${his} knotted muscles, whimpering with near-orgasmic delight as ${he} feels the day's aches ground away under your grip. When you're done with ${him}, ${he} touches ${his} toes and then smoothly rises to stretch with ${his} hands over ${his} head, groaning with sheer pleasure at the feeling.`);
			if (canTalk(S.Milkmaid)) {
				const {title: Master} =getEnunciation(S.Milkmaid);
				r.push(
					Spoken(S.Milkmaid, `"Thank you ${Master},"`),
					`${he} murmurs.`,
					Spoken(S.Milkmaid, `"Would — would you like to use my body, now?"`)
				);
			} else {
				r.push(`${He} thanks you profusely with gestures, and then hesitantly asks if you'd like to use ${his} body.`);
			}
			r.push(`You shake your head kindly and place a kiss on ${his} forehead before continuing with your evening. As ${he} watches you go, ${he} suppresses <span class="devotion inc">another shiver.</span>`);
			S.Milkmaid.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}
		function bath() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`When ${he}`);
			if (canHear(S.Milkmaid)) {
				r.push(`hears you enter ${V.dairyName},`);
			} else {
				r.push(`realizes you've entered ${V.dairyName},`);
			}
			r.push(`${he} turns to you for instructions, but you wordlessly dismiss ${him} back to ${his} stretching. ${He} gets back to it, but is mystified as ${he} watches you out of the corner of ${his} eye. The milk is held in a large tank before being filtered, pasteurized, and sold. You remove the lid from the tank and climb in. ${He} watches with incomprehension, but understanding dawns when you splash a little, demonstratively, and crook a finger at ${him}. ${He} gives you a deliciously naughty look and hurries to join you in the warm milk, giggling when you pull ${him} in with a slosh of creamy whiteness. ${He} doesn't break the surface after climbing in, kneeling under the milk to suck you off. ${He} has to surface periodically for breath, but the grin ${he} gives you each time makes up for it. ${He} manages to drag ${his} breasts`);
			if (V.PC.boobs >= 300) {
				r.push(`against yours`);
			} else {
				r.push(`up your front`);
			}
			r.push(`each time ${he} rises for air. When you climax, ${he} carefully swallows every drop to keep the filters from getting clogged. When ${he} surfaces for good, ${he} looks you in the eyes briefly before blushing and giving you a muscular hug.`);
			S.Milkmaid.trust += 4;
			seX(S.Milkmaid, "oral", V.PC, "penetrative");
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.pessWorriedHeadgirl = class pessWorriedHeadgirl extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.week > 20,
			() => !!S.HeadGirl,
			() => S.HeadGirl.devotion > 95,
			() => S.HeadGirl.trust > 95,
			() => S.HeadGirl.intelligence + S.HeadGirl.intelligenceImplant > 50
		];
	}

	execute(node) {
		const {
			He, His,
			he, his, him, himself, girl, woman, hers
		} = getPronouns(S.HeadGirl);
		const {title:Master} = getEnunciation(S.HeadGirl);

		App.Events.drawEventArt(node, S.HeadGirl);

		App.Events.addParagraph(node, [
			`Your Head Girl`,
			App.UI.DOM.slaveDescriptionDialog(S.HeadGirl),
			`comes to find you for a routine meeting at the end of the day, and finds your office empty. You're out on its balcony, looking out into the night from the immense height of the arcology's uppermost levels. ${He} comes outside to meet you, notices your reverie, and follows your gaze. Out there, most of the way to the horizon, there's a lightshow underway. In more peaceful times it might have been mistaken for fireworks, but it's not.`
		]);
		App.Events.addParagraph(node, [
			`As the two of you stand there watching, strings of red lights begin to trace lines up into the sky. The guns are manually aimed, to go by their jerky arcs of fire, and they're hopelessly ineffective. Their target comes and goes, unseen and unheard at this distance, the only evidence of its passage a flash of light from the target area followed by a low thump that takes a long time to reach you. The commotion is outside the Free City your arcology is part of, and is of little concern: just a minor dispute of the kind becoming more and more common outside your island of safety and security.`
		]);
		let r = [];
		r.push(`You notice a warmth at your side. ${S.HeadGirl.slaveName} has edged a bit closer to you, and shivers as you glance at ${him}. ${He} crosses ${his} arms`);
		if (S.HeadGirl.boobs > 3000) {
			r.push(`under ${his} massive tits, lifting them a bit as ${he} snuggles ${his} arms into the warm cavern they create against ${his} stomach.`);
		} else if (S.HeadGirl.boobs > 1000) {
			r.push(`over ${his} big boobs, pressing them a bit flatter against ${his} chest as ${he} hugs ${himself}.`);
		} else if (S.HeadGirl.boobs > 400) {
			r.push(`over ${his} breasts, pressing them against ${his} chest as ${he} hugs ${himself}.`);
		} else {
			r.push(`over ${his} chest, hugging ${his} own shoulders and rocking back and forth a little.`);
		}
		r.push(
			Spoken(S.HeadGirl, `"It's very bad out there, isn't it, ${Master}."`),
			`It isn't really a question, but you nod.`,
			Spoken(S.HeadGirl, `"I'm glad I'm here with you,"`),
			`${he} continues,`,
			Spoken(S.HeadGirl, `"and I would be even if I didn't love you."`),
			`${He} nestles in closer to you,`
		);
		if (S.HeadGirl.height >= 185) {
			r.push(`the tall`);
			if (S.HeadGirl.physicalAge > 30) {
				r.push(`${woman}'s`);
			} else {
				r.push(`${girl}'s`);
			}
			r.push(`shoulder brushing against yours.`);
		} else if (S.HeadGirl.hips > 1) {
			r.push(`${his} broad, motherly hips brushing against your thigh.`);
		} else {
			r.push(`the shorter`);
			if (S.HeadGirl.physicalAge > 30) {
				r.push(`${woman}`);
			} else {
				r.push(`${girl}`);
			}
			r.push(`fitting neatly against your side.`);
		}
		r.push(Spoken(S.HeadGirl, `"${Master}, I don't know if the other slaves know how lucky they are, to be safe here."`));
		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Trust ${him} to tell them`, trust),
			new App.Events.Result(`${He}'s more important`, important)
		]);

		function trust() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell ${him} that you're sure ${he}'ll let them know, since ${he} understands the situation and knows them all well. ${His}`);
			if (S.HeadGirl.visualAge > 35) {
				r.push(`mature`);
			} else if (S.HeadGirl.face > 40) {
				r.push(`lovely`);
			} else {
				r.push(`attentive`);
			}
			r.push(`face flicks`);
			if (S.HeadGirl.height >= 185) {
				r.push(`over`);
			} else {
				r.push(`up`);
			}
			r.push(`to look at you, ${his} ${App.Desc.eyesColor(S.HeadGirl)} glittering at the compliment. "Thank you, ${Master}," ${he} murmurs. There's another flash on the horizon, followed by a series of smaller flashes and a low, slowly growing glow as secondaries go off and start a fire. ${S.HeadGirl.slaveName} seems affected, a certain amount of moisture gathering in ${his} eyes, but ${he} turns away to return to ${his} duties when it becomes clear that you intend to keep watching for a while, and aren't going to have sex with ${him} right this minute. ${He} does ${his} best to communicate the new reality to those of your slaves who are obedient enough to understand the truth: though they are slaves, there is safety to be found in slavery.`);
			for (const slave of V.slaves) {
				if (slave.devotion > 20) {
					slave.trust += 1;
				}
			}
			S.HeadGirl.devotion += 4;
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function important() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You shift to stand behind ${him}, your`);
			if (V.PC.boobs >= 300) {
				r.push(`breasts`);
				if (V.PC.boobsImplant > 0) {
					r.push(`firm`);
				} else {
					r.push(`soft`);
				}
				r.push(`and sensual`);
			} else {
				r.push(`chest hard and masculine`);
			}
			r.push(`but not insistently sexual against ${his}`);
			if (S.HeadGirl.muscles > 30) {
				r.push(`muscular`);
			} else if (S.HeadGirl.weight > 10) {
				r.push(`soft`);
			} else {
				r.push(`warm`);
			}
			r.push(`back. You wrap your arms around ${him}, over ${his} own, each of your`);
			if (V.PC.title === 1) {
				r.push(`strong`);
			} else {
				r.push(`feminine`);
			}
			r.push(`hands finding and clasping one of ${hers}.`);
			if (S.HeadGirl.boobs > 3000) {
				r.push(`${His} incredible boobs rest heavily over the top of both of your arms.`);
			}
			r.push(`${He} knows you very well, and shifts ${his} torso ever so slightly from side to side, snuggling in a little closer to you to let you know ${he}'s comfortable and available without being demanding or needy. You speak quietly, your voice a reassuring`);
			if (V.PC.boobs === 0) {
				r.push(`rumble`);
			} else {
				r.push(`hum`);
			}
			r.push(`${he} feels against ${his} back${canHear(S.HeadGirl) ? " as well as hears" : ""}. You let ${him} know that ${he} has a place with you, and ${he} always will. You let ${him} know that you're worried too, and that you don't know what the future will bring. But you do know that ${he}'ll be by your side as you meet it. A silent shake in the pretty`);
			if (S.HeadGirl.physicalAge > 30) {
				r.push(`${woman}`);
			} else {
				r.push(`${girl}`);
			}
			r.push(
				`you've got in your arms is your only indication that <span class="mediumaquamarine">${he}'s crying a little</span> as ${he} whispers,`,
				Spoken(S.HeadGirl, `"Thank you, ${Master}. I'll do my best."`)
			);
			S.HeadGirl.trust += 5;
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.pessWorshipfulImpregnatrix = class pessWorshipfulImpregnatrix extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.week > 20,
			() => !!S.HeadGirl,
			() => canPenetrate(S.HeadGirl),
			() => S.HeadGirl.balls > 0,
			() => S.HeadGirl.devotion > 95,
			() => V.universalRulesImpregnation === "HG"
		];
	}

	execute(node) {
		const {
			He, His,
			he, his, him, himself,
		} = getPronouns(S.HeadGirl);
		const {title: Master} = getEnunciation(S.HeadGirl);
		const desc = SlaveTitle(S.HeadGirl);
		App.Events.drawEventArt(node, S.HeadGirl);

		App.Events.addParagraph(node, [
			App.UI.DOM.slaveDescriptionDialog(S.HeadGirl),
			`comes wearily into your office at the end of ${his} day to check in with you, like a good Head Girl should. You're busy at the moment, so ${he} waits quietly, not wanting to interrupt you. ${He} seems tired, and leans`
		]);
		let r = [];
		if (S.HeadGirl.physicalAge > 35) {
			r.push(`heavily`);
		} else {
			r.push(`lightly`);
		}
		r.push(`against the back of the office couch${hasAnyProstheticArms(S.HeadGirl) ? `, ${his} mechanical hand hard against the leather` : ``}. Your Head Girl is a`);
		if (S.HeadGirl.fetish === "dom") {
			r.push(`very dominant ${desc},`);
		} else if (S.HeadGirl.fetish === "sadist") {
			r.push(`sadistic and dominant ${desc},`);
		} else {
			r.push(`dutiful ${desc} and takes ${his} leadership position seriously,`);
		}
		r.push(`but ${he} knows ${he} doesn't have to pretend to be invincible around you.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`When you've finished your task, you raise your eyes to examine ${him}. ${He}'s standing with ${his}`);
		if (S.HeadGirl.hips > 1) {
			r.push(`broad`);
		} else if (S.HeadGirl.hips < -1) {
			r.push(`narrow`);
		} else {
			r.push(`womanly`);
		}
		r.push(`hips slightly cocked and ${his}`);
		if (S.HeadGirl.muscles > 95) {
			r.push(`incredibly muscular`);
		} else if (S.HeadGirl.weight > 10) {
			r.push(`soft`);
		} else if (S.HeadGirl.muscles > 10) {
			r.push(`hard`);
		} else {
			r.push(`trim`);
		}
		r.push(`thighs bowed a bit wide. You immediately understand why: it's ${his} job to impregnate fertile slaves, a duty ${he} takes very seriously, and ${his} dick must be very sore.`);
		const exposure = App.Data.clothes.get(S.HeadGirl.clothes).exposure;
		if (exposure >= 4) {
			r.push(`${He}'s nude, making it obvious that ${his} poor soft member has done its duty today. It even looks a little moist, as though it bred a fertile slave's pussy only a few minutes ago.`);
		} else if (exposure === 3) {
			r.push(`${His} clothes don't cover ${his} dick, making it obvious that ${his} poor soft member has done its duty today. It even looks a little moist, as though it bred a fertile slave's pussy only a few minutes ago.`);
		} else if (exposure === 2) {
			r.push(`${His} clothes cover ${his} groin, but they're pretty tight, making it clear that ${his} poor soft member has done its duty today.`);
		} else {
			r.push(`${His} clothes are relatively modest, so you can't see it, but it's clear that ${his} poor soft member has done its duty today.`);
		}
		r.push(`${He} sees you examining at ${him}, and looks back at you submissively, too tired to do much else.`);
		App.Events.addParagraph(node, r);

		App.Events.addResponses(node, [
			new App.Events.Result(`Fuck ${him}`, fuck),
			new App.Events.Result(`Give ${him} some loving praise`, praise)
		]);

		function fuck() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You stand up, and from the look on your face, ${he} knows it's ${his} turn to get fucked. ${He}`);
			if (S.HeadGirl.fetish === "dom") {
				r.push(`visibly shelves ${his} dominance,`);
			} else if (S.HeadGirl.fetish === "sadist") {
				r.push(`visibly lets ${his} sadism go,`);
			} else {
				r.push(`softens visibly,`);
			}
			r.push(`looking relieved to be able to let someone else lead. You give ${him} a lustful kiss on the lips and then reach down, taking hold of ${his} thigh and spinning ${him} around, raising ${his} leg so ${his} foot's on the arm of the couch.`);
			if (V.PC.dick !== 0) {
				r.push(`You slide your dick`);
			} else {
				r.push(`${He} reaches under ${himself} and back to stroke your pussy as you press your hips against ${him}, and you slide your fingers`);
			}
			r.push(`inside ${his}`);
			if (canDoVaginal(S.HeadGirl)) {
				r.push(`pussy.`);
			} else {
				r.push(`ass.`);
			}
			r.push(`${He} groans with discomfort as ${his} overtaxed dick tries and fails to become hard again, but relaxes as`);
			if (V.PC.dick !== 0) {
				r.push(`cockhead`);
			} else {
				r.push(`fingertips`);
			}
			r.push(`stimulate the most sensitive place inside ${him}, producing arousal that obscures the soreness. You hold ${him} close,`);
			if (V.PC.dick !== 0) {
				r.push(`one`);
			} else {
				r.push(`your free`);
			}
			r.push(`arm`);
			if (S.HeadGirl.boobs > 4000) {
				r.push(`cradling one of ${his} udders`);
			} else if (S.HeadGirl.boobs > 1000) {
				r.push(`hefting one of ${his} heavy breasts`);
			} else if (S.HeadGirl.boobs > 400) {
				r.push(`holding one of ${his} boobs`);
			} else {
				r.push(`cupped over one of ${his} ${S.HeadGirl.nipples} nipples`);
			}
			r.push(`and hugging ${him} against your`);
			if (V.PC.boobs >= 300) {
				r.push(`bosom.`);
			} else {
				r.push(`hard chest.`);
			}
			r.push(
				`${He} pants exhaustedly in your arms as you take ${him}, and when ${he} climaxes, ${he} manages only a weak ejaculation onto the couch. You have mercy and fuck ${him} harder, bringing yourself to a quicker orgasm and letting ${him} fall into ${his} own mess.`,
				Spoken(S.HeadGirl, `"I`),
				App.UI.DOM.makeElement("span", Spoken(S.HeadGirl, "love you,"), ["devotion", "inc"]),
				Spoken(S.HeadGirl, `${Master},"`),
				`${he} mumbles into the cushions.`
			);
			if (V.PC.dick !== 0) {
				r.push(`Your cum glistens as it begins to drip out of ${his}`);
				if (canDoVaginal(S.HeadGirl)) {
					r.push(`well-fucked pussy.`);
				} else {
					r.push(`loosened asshole, which tightens and relaxes a little with ${his} breathing.`);
				}
			} else {
				if (canDoVaginal(S.HeadGirl)) {
					r.push(`${His} pussy glistens with ${his} pussyjuice and a little of your own, transferred between your hands as you fucked.`);
				} else {
					r.push(`${His} loosened asshole tightens and relaxes a little with ${his} breathing.`);
				}
			}
			r.push(`${He} seems to have absorbed a bit of your approach, and over the next couple of days ${he} drives ${himself} past all ${his} limitations of sexual stamina when fucking slaves in your penthouse, Every single one of your slaves has become better broken to your will.`);
			if (canDoVaginal(S.HeadGirl)) {
				seX(S.HeadGirl, "vaginal", V.PC, "penetrative");
			} else {
				seX(S.HeadGirl, "anal", V.PC, "penetrative");
			}
			S.HeadGirl.devotion += 5;
			for (const slave of V.slaves) {
				if (assignmentVisible(slave)) {
					slave.devotion += 2;
				}
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function praise() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You stand up, give ${him} a kiss, and sit down on the couch, pulling ${him} into your lap. ${His}`);
			if (S.HeadGirl.butt > 8) {
				r.push(`monstrous ass rests heavily on`);
			} else if (S.HeadGirl.muscles > 30) {
				r.push(`heavily muscled ass is hard against`);
			} else if (S.HeadGirl.weight > 10) {
				r.push(`plush bottom is soft against`);
			} else if (S.HeadGirl.muscles > 10) {
				r.push(`toned butt is firm against`);
			} else if (S.HeadGirl.butt > 3) {
				r.push(`healthy butt is soft against`);
			} else {
				r.push(`cute bottom is firm against`);
			}
			r.push(`your toned thighs. ${He} wiggles ${himself} against you briefly, as though to gently remind you ${he}'s available without demanding anything, and then snuggles ${his} ${S.HeadGirl.skin} face into your neck. You run a hand`);
			if (S.HeadGirl.hLength === 0) {
				r.push(`across ${his} bald head,`);
			} else if (S.HeadGirl.hLength < 10) {
				r.push(`through ${his} short hair,`);
			} else {
				r.push(`through ${his} ${S.HeadGirl.hColor} hair,`);
			}
			r.push(`producing a shiver of pleasure as your fingers massage ${his} scalp. As you cuddle with your Head Girl, you praise ${his} hard work, and tell ${him} that the next generation of sex slaves in the Free Cities will owe a lot to ${him}. They'll learn from ${his} leadership, of course, but they'll also have ${his} genes. ${He} stiffens a little, and there's a slight moisture against your skin as tears begin to run down ${his} cheeks. ${He} cranes ${his} neck up and kisses you rapturously. ${He} seems to have absorbed a bit of your vision for the future, and over the next couple of days ${he} takes special care to make sure the slaves in your penthouse know their place in the new world you're building.`);
			S.HeadGirl.devotion += 5;
			for (const slave of V.slaves) {
				if (assignmentVisible(slave)) {
					slave.trust += 2;
				}
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};