code:
App.Events.PEHeadgirlConcubine = class PEHeadgirlConcubine extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => !!S.HeadGirl,
			() => !!S.Concubine,
			() => fuckSlavesLength() > 1,
			() => canTalk(S.Concubine),
			() => canSee(S.Concubine),
			() => canHear(S.Concubine),
			() => S.Concubine.fetish !== Fetish.MINDBROKEN,
			() => canHold(S.Concubine),
			() => canWalk(S.Concubine),
		];
	}

	actorPrerequisites() {
		return [];
	}

	execute(node) {
		let r = [];
		const {
			He, His,
			he, him, his, girl
		} = getPronouns(S.HeadGirl);
		const belly = bellyAdjective(S.HeadGirl);

		const {
			His2, He2,
			his2, he2, him2, wife2, girl2
		} = getPronouns(S.Concubine).appendSuffix("2");
		const bellyCon = bellyAdjective(S.Concubine);

		const {
			HeA,
			heA, hisA, himA, himselfA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.drawEventArt(node, [S.HeadGirl, S.Concubine]);

		const buttReady = (slave) => canDoAnal(slave) && slave.anus > 0;
		const vagReady = (slave) => canDoVaginal(slave) && slave.vagina > 0;

		const canDo = {
			anal: {
				HG: buttReady(S.HeadGirl),
				conc: buttReady(S.Concubine),
			},
			vaginal: {
				HG: vagReady(S.HeadGirl),
				conc: vagReady(S.Concubine),
			}
		};

		r.push(`You wake up one morning to find`, contextualIntro(V.PC, S.HeadGirl, true), `and`, contextualIntro(S.HeadGirl, S.Concubine, true), `waiting next to your bed. It's immediately obvious that they both have a minor item of business for you, since nothing was urgent enough to wake you early, and they evidently both came in to catch you at your normal hour of rising. They're kneeling side by side next to the`);
		if (S.HeadGirl.boobs >= 10000 && S.Concubine.boobs >= 10000) {
			r.push(`bed (a position that smashes their massive breasts together on one side),`);
		} else if (S.HeadGirl.belly >= 45000 && S.Concubine.belly >= 45000) {
			r.push(`bed (a position that forces their swollen middles to compete for space),`);
		} else if (S.HeadGirl.butt > 5 && S.Concubine.butt > 5) {
			r.push(`bed (a position that smashes their massive asses together on one side),`);
		} else {
			r.push(`bed,`);
		}
		r.push(`and it's also obvious that they've been filling the few minutes they've been waiting for you to wake up by making out. Their lips are moist, ${S.Concubine.slaveName}'s ${S.Concubine.skin} cheeks are a little flushed, and there's even a little unnoticed strand of saliva running from ${his2} mouth to ${S.HeadGirl.slaveName}'s. They both look at you expectantly, wondering whether to speak up or save their questions for after you take a moment to get ready for your day.`);

		App.Events.addParagraph(node, r);

		const choices = [];
		choices.push(new App.Events.Result(`Get right to work`, work));
		choices.push(new App.Events.Result(`Tease them while they meet with you`, tease));
		if (
			(canDo.anal.HG || canDo.vaginal.HG) &&
			(canDo.anal.conc || canDo.vaginal.conc) &&
			V.PC.belly + S.Concubine.belly < 50000 &&
			V.PC.belly + S.HeadGirl.belly < 50000
		) {
			choices.push(new App.Events.Result(`Double penetrate them while they meet with you`, double));
		}
		App.Events.addResponses(node, choices);

		function work() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You didn't get to where you are by lying around on the job. You`);
			if (V.PC.belly < 5000) {
				r.push(`spring`);
			} else if (V.PC.belly < 10000) {
				r.push(`pull yourself`);
			} else {
				r.push(`slowly slip your gravid bulk`);
			}
			r.push(`out of bed and head straight towards your office and its desk to get some work done with your first rush of morning energy before your ablutions. Your Head Girl and Concubine follow along behind you; ${S.HeadGirl.slaveName} does ${his} best to keep up, because the sight of your`);

			if (S.HeadGirl.fetish === "pregnancy" && V.PC.belly >= 10000) {
				r.push(`increasingly large baby bump and motherly waddle`);
			} else if (S.HeadGirl.fetish === "cumslut" && V.PC.balls >= 20) {
				r.push(`over-burdened scrotum in motion as you walk`);
			} else if (S.HeadGirl.attrXX > 65 && S.HeadGirl.attrXY > 65 && V.PC.dick !== 0 && (V.PC.boobs >= 650 || V.PC.title === 0 || V.PC.vagina !== -1)) {
				r.push(`dangling penis`);
				if (V.PC.boobs >= 650) {
					r.push(`and bouncing boobs`);
				} else if (V.PC.vagina !== -1) {
					r.push(`and a hint of the pussy under it`);
				} else {
					r.push(`on such a feminine body`);
				}
				r.push(`in motion as you walk`);
			} else if (S.HeadGirl.attrXY > 65) {
				if (V.PC.dick !== 0) {
					r.push(`dangling penis`);
				} else if (V.PC.title === 1) {
					r.push(`masculine body nude`);
				} else {
					r.push(`beloved body nude`);
				}
				r.push(`in motion as you walk`);
			} else if (S.HeadGirl.attrXX > 65) {
				if (V.PC.boobs >= 300) {
					if (V.PC.boobs >= 1400) {
						r.push(`huge boobs from behind`);
					} else {
						r.push(`bare boobs`);
					}
				} else if (V.PC.vagina !== -1 && V.PC.dick === 0) {
					r.push(`bare pussy`);
				} else if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
					r.push(`bare pussy under your maleness`);
				} else if (V.PC.title === 0) {
					r.push(`feminine body`);
				} else {
					r.push(`beloved body nude`);
				}
				r.push(`in motion as you walk`);
			} else {
				r.push(`beloved body nude in motion as you walk`);
			}
			r.push(`is something ${he} openly enjoys, while ${S.Concubine.slaveName} at least tries to be a little more modest. You sit down at your desk, taking in the situation in your domain at a glance as ${V.assistant.name}`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`springs into monstrous life on the glass desktop, eyes flashing and hair writhing.`);
					break;
				case "shemale":
					r.push(`pops up on the glass desktop, helicoptering ${hisA} dick while ${heA} waits for instructions.`);
					break;
				case "amazon":
					r.push(`appears to smash through the glass desktop, landing in a crouch to wait for orders.`);
					break;
				case "businesswoman":
					r.push(`appears on the glass desktop, sitting primly in ${hisA} own chair and waiting for instructions.`);
					break;
				case "fairy":
					r.push(`appears on the glass desktop, pressing ${hisA} face against the screen.`);
					break;
				case "pregnant fairy":
					r.push(`appears on the glass desktop, gingerly pressing ${hisA} face and belly against the screen.`);
					break;
				case "goddess":
					r.push(`gleams into existence on the glass desktop, reclining in a glow of maternal glory while ${heA} waits for direction.`);
					break;
				case "hypergoddess":
					r.push(`gleams into existence on the glass desktop, shifting ${hisA} gravid bulk so that it rests firmly on your desk.`);
					break;
				case "loli":
					r.push(`appears on the glass desktop, facing away from you. ${HeA} spins around with a start, a finger up ${hisA} nose, before quickly brushing ${himselfA} off and pretending ${heA} wasn't doing anything.`);
					break;
				case "preggololi":
					r.push(`appears on the glass desktop, idly stroking ${hisA} pregnancy as ${heA} awaits your command.`);
					break;
				case "schoolgirl":
					r.push(`appears on the glass desktop, sitting in ${hisA} own chair and waiting for instructions with ${hisA} legs spread a little wide for such a short skirt.`);
					break;
				case "angel":
					r.push(`appears on the glass desktop, spreads ${hisA} wings and stretches before taking a seat and waiting for instructions.`);
					break;
				case "cherub":
				case "imp":
					r.push(`flutters into view on the glass desktop, hovering above the ground while awaiting instructions.`);
					break;
				case "incubus":
					r.push(`appears on the glass desktop, idly stroking ${hisA} erection and trying to catch your attention.`);
					break;
				case "succubus":
					r.push(`appears on the glass desktop and presses ${hisA} tits against the screen.`);
					break;
				case "witch":
					r.push(`suddenly appears on the glass desktop; ${heA} gasps and covers ${himselfA} when ${heA} realizes ${hisA} clothes didn't teleport with ${himA}.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`slowly coalesces together to form ${hisA} usual feminine figure and standing their blankly waiting for instruction.`);
					break;
				default:
					r.push(`appears as a glowing icon on the glass desktop, awaiting instructions.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You look at ${S.HeadGirl.slaveName}, standing across the desk from you, and ${he} takes the cue and goes first. ${He} asks your permission to make a couple of last-minute changes to slaves' assignments for the day, and you ask about a couple of minor efficiency issues before giving ${him} the go ahead. Meanwhile, ${S.Concubine.slaveName} kneels beside your chair, resting ${his2}`);
			if (S.Concubine.bald === 0 && S.Concubine.hLength > 0) {
				r.push(S.Concubine.hColor);
			} else {
				r.push(`smooth`);
			}
			r.push(`head on your knee, ${his2}`);
			if (S.Concubine.dick > 8) {
				r.push(`limp, monstrous cock resting softly against one of your ankles.`);
			} else if (S.Concubine.boobs > 10000) {
				r.push(`titanic udders a nice cushion against your calves.`);
			} else if (S.Concubine.weight > 30) {
				r.push(`soft body cushioning nicely against your leg.`);
			} else if (S.Concubine.belly >= 100000) {
				r.push(`${bellyCon} belly resting warmly against your leg.`);
			} else if (S.Concubine.boobs > 1000) {
				r.push(`heavy breast resting against your calf on that side.`);
			} else {
				r.push(`chest warm against your calf on that side.`);
			}
			r.push(`${He2} places a`);
			if (S.Concubine.muscles > 50) {
				r.push(`strong`);
			} else {
				r.push(`soft`);
			}
			r.push(`hand on the inside of your shin and hugs your lower leg, sensual, but companionable rather than sexually insistent.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`Your Head Girl exits, performing the proper formalities and then hurrying off to make sure the reassigned slaves get going. As ${he} withdraws ${he}`);
			if (S.HeadGirl.relationship <= -2) {
				r.push(`has eyes only for you; ${he}`);
			} else if (S.HeadGirl.relationship === -1) {
				r.push(`gives ${S.Concubine.slaveName} a look up and down, which ${his} slutty nature obliges ${him} to give everyone; then ${he}`);
			} else if (S.HeadGirl.relationshipTarget === V.ConcubineID) {
				if (S.HeadGirl.relationship === 1) {
					r.push(`gives ${his} friend ${S.Concubine.slaveName} a smile; then ${he}`);
				} else if (S.HeadGirl.relationship === 2) {
					r.push(`gives ${his} best friend ${S.Concubine.slaveName} a smile and a little wave; then ${he}`);
				} else if (S.HeadGirl.relationship === 3) {
					r.push(`gives ${his} fuckbuddy ${S.Concubine.slaveName} a flirty wink; then ${he}`);
				} else if (S.HeadGirl.relationship === 4) {
					r.push(`blows ${his} lover ${S.Concubine.slaveName} a kiss; then ${he}`);
				} else {
					r.push(`mouths "I love you" at ${his} ${wife2} ${S.Concubine.slaveName}; then ${he}`);
				}
			}
			switch (S.HeadGirl.fetish) {
				case "submissive":
					r.push(`catches ${his} lower lip behind ${his} teeth and gives you a blushing, sexually submissive look`);
					break;
				case "cumslut":
					if (V.PC.dick !== 0) {
						r.push(`focuses on your cock`);
					} else {
						r.push(`looks you in the eye`);
					}
					r.push(`and licks ${his} lips lasciviously`);
					break;
				case "humiliation":
					r.push(`flashes you and blushes artfully`);
					break;
				case "buttslut":
					if (canDoAnal(S.HeadGirl)) { // TODO: do we care about virginity?
						r.push(`cocks ${his} hips, pulls one buttock aside, and winks ${his} asshole in your direction`);
					} else {
						r.push(`looks you in the eye and gives ${his} booty a slap`);
					}
					break;
				case "boobs":
					r.push(`looks you in the eye and gives ${his} boobs a little bounce`);
					break;
				case "pregnancy":
					r.push(`looks you in the eye and traces a hand across ${his} ${belly} belly`);
					break;
				case "dom":
					r.push(`gives you a cheerful, sexually challenging wink`);
					break;
				case "sadist":
					r.push(`gives you a significant glance, as between sadists,`);
					break;
				case "masochist":
					r.push(`looks at you and gives ${his} own butt a light slap`);
					break;
				default:
					r.push(`looks at you and adds a bit of extra sway to ${his} hips`);
			}
			r.push(`on ${his} way out the door. When ${he}'s gone, your Concubine speaks up from ${his2} adoring embrace of your leg. ${He2} asks a little aesthetic question about one of your other bedslaves, ${his2}`);
			if (S.Concubine.voice < 2) {
				r.push(`deep voice rumbling against your knee.`);
			} else if (S.Concubine.voice > 2) {
				r.push(`high voice humming against your knee.`);
			} else {
				r.push(`feminine voice purring against your knee.`);
			}
			r.push(`You chat with ${him2} about how you'd like the bedslave to look and act, ideally, and do other work while running your fingers`);
			if (S.Concubine.bald === 0 && S.Concubine.hLength > 0) {
				r.push(`through your Concubine's`);
				if (S.Concubine.hLength < 10) {
					r.push(`short`);
				}
				r.push(`hair.`);
			} else {
				r.push(`along your Concubine's`);
				if (S.Concubine.bald === 1) {
					r.push(`bald`);
				} else {
					r.push(`shaved`);
				}
				r.push(`head.`);
			}
			r.push(`Your Head Girl's confident assistance managing your chattel and your Concubine's devoted comfort as you work allows you to <span class="cash inc">be unusually productive</span> all morning.`);
			cashX(5000, "event", S.HeadGirl);

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

		function tease() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You tell them to go ahead, ${S.HeadGirl.slaveName} first, but you flip the sheet back and pat the soft mattress on either side of you while you do. They laugh and clamber on up, ${S.HeadGirl.slaveName} first, and ${he} manages to drag a ${S.HeadGirl.nipples} nipple across your`);
			if (V.PC.boobs >= 300) {
				r.push(`own bare breasts`);
			} else if (V.PC.title === 0) {
				r.push(`flat chest`);
			} else {
				r.push(`chest`);
			}
			r.push(`as ${he}`);
			if (V.PC.belly >= 10000 || S.HeadGirl.boobs > 10000 || S.HeadGirl.belly >= 5000 || S.HeadGirl.dick > 20 || S.HeadGirl.balls > 20) {
				r.push(`struggles to get`);
			} else {
				r.push(`climbs`);
			}
			r.push(`over you. Once ${he}'s situated under the crook of your arm,`);
			if (S.HeadGirl.boobs > 25000) {
				r.push(`the huge weight of ${his} boobs pressing against your ribcage,`);
			} else if (S.HeadGirl.belly >= 10000) {
				r.push(`the huge weight of ${his} ${belly} middle pressing against your body,`);
			} else if (S.HeadGirl.dick > 4 && canAchieveErection(S.HeadGirl)) {
				r.push(`which presses ${his} absurd erection against your hip,`);
			} else if (S.HeadGirl.dick > 5) {
				r.push(`which leaves ${his} absurd dick resting across your lap,`);
			} else if (S.HeadGirl.energy > 95) {
				r.push(`making the eager heat between the nympho's legs quite noticeable against your hip,`);
			} else {
				r.push(`${his} body warm against you,`);
			}
			r.push(`${he} clears ${his} throat and asks your permission to make a couple of last-minute changes to slaves' assignments for the day.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`As ${he} did so, you were encircling your`);
			if (girl === girl2) {
				r.push(`${girl}s`);
			} else {
				r.push(`lovers`);
			}
			r.push(`in your`);
			if (FutureSocieties.isActive('FSPhysicalIdealist')) {
				r.push(`powerful arms.`);
			} else if (V.PC.title === 1) {
				r.push(`dominant grip.`);
			} else {
				r.push(`loving grip.`);
			}
			r.push(`Cupping your Head Girl's butt in your left hand and your Concubine's in your right, you give them a good squeeze as ${S.HeadGirl.slaveName} finishes ${his} question. ${His} voice rises cutely as your marauding hand moves over the`);
			if (S.HeadGirl.butt > 10) {
				r.push(`endless expanse of ${his} backside. ${He} manages to finish, but trails off into a groan, the`);
				if (Math.floor(S.HeadGirl.buttImplant / S.HeadGirl.butt) > .60) {
					r.push(`firm`);
				} else {
					r.push(`soft`);
				}
				r.push(`flesh quivering against your palm.`);
			} else {
				r.push(`place between ${his}`);
				if (S.HeadGirl.butt > 6) {
					r.push(`huge`);
				} else if (S.HeadGirl.butt > 3) {
					r.push(`healthy`);
				} else {
					r.push(`cute`);
				}
				r.push(`buttocks and you slowly`);
				if (canDoAnal(S.HeadGirl)) {
					r.push(`press a single malicious finger in against ${his}`);
					if (S.HeadGirl.anus > 2) {
						r.push(`loose asspussy.`);
					} else if (S.HeadGirl.butt > 0) {
						r.push(`practiced asshole.`);
					} else {
						r.push(`virgin pucker.`);
					}
					r.push(`${He} manages to finish, but trails off into a groan, the warm, crinkled skin spasming against the teasing digit.`);
				} else {
					r.push(`trace the perimeter of ${his} chastity. ${He} manages to finish, but trails off into a groan, ${his} rump tightening around the invading hand.`);
				}
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`${S.Concubine.slaveName} laughs at ${him} and asks ${his2} own question, a little aesthetic question about one of your other bedslaves, but something you like to exercise artistic control over. ${His2} giggling is cut off as ${he2} has to concentrate on getting ${his2} words out as you use two fingers to massage and tease the sensitive skin between ${his2} ass and`);
			if (S.Concubine.vagina > -1) {
				r.push(`the start of ${his2} cunt.`);
			} else if (S.Concubine.scrotum > 0) {
				r.push(`${his2} ballsack.`);
			} else {
				r.push(`the base of ${his2} dick.`);
			}
			r.push(`It's ${S.HeadGirl.slaveName}'s turn to laugh, which ${he} does throatily, ${his} warm breath gusting deliciously across your`);
			if (V.PC.boobs >= 300 || V.PC.title === 0) {
				r.push(`hardening nipples.`);
			} else {
				r.push(`pecs.`);
			}
			r.push(Spoken(S.HeadGirl, `"See, it's not easy,"`));
			r.push(`${he} breathes across you at your Concubine.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`They soon get their revenge as you give them their orders, though, moving their expert hands between your legs to give you a handjob. They do it cooperatively as you continue to play with them, letting you enjoy the delightful sensation of`);
			if (V.PC.dick !== 0) {
				r.push(`two hands working your shaft while`);
				if (V.PC.vagina !== -1) {
					r.push(`another massages your petals and a fourth delves two fingers inside you.`);
				} else {
					r.push(`another tickles your frenulum and a fourth massages your balls.`);
				}
			} else {
				r.push(`a hand massaging your petals on either side while another delves two fingers inside you and a fourth pleasures your clit.`);
			}
			r.push(`They crane their necks to rain kisses on your chin, neck,`);
			if (V.PC.boobs >= 300) {
				r.push(`breasts, and nipples,`);
			} else if (V.PC.title === 0) {
				r.push(`and nipples,`);
			} else {
				r.push(`and chest,`);
			}
			r.push(`and on each other's mouths. You`);
			if (V.PC.belly < 5000) {
				r.push(`spring`);
			} else if (V.PC.belly < 10000) {
				r.push(`pull yourself`);
			} else {
				r.push(`slowly tip your gravid bulk`);
			}
			r.push(`out of bed when you're satisfied, pulling your leadership with you towards the shower, and they <span class="trust inc">trustingly bounce up to follow.</span>`);
			S.HeadGirl.trust += 4;
			S.Concubine.trust += 4;
			seX(S.HeadGirl, "oral", S.Concubine, "oral");

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

		function double() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You sit up and order ${S.HeadGirl.slaveName} up onto the bed, on ${his} back, and while ${he}'s`);
			if (S.HeadGirl.energy > 95) {
				r.push(`eagerly obeying,`);
			} else {
				r.push(`obediently getting situated,`);
			}
			r.push(`you tell ${S.Concubine.slaveName} to ride ${him}, reverse cowgirl. ${He2} straddles your Head Girl,`);
			if (S.Concubine.butt > 6) {
				r.push(`using ${his2} hands to situate ${his2} huge buttocks.`);
			} else if (S.Concubine.belly >= 10000) {
				r.push(`making sure ${his2} ${bellyCon} belly is comfortably positioned.`);
			} else if (S.Concubine.boobs > 4000) {
				r.push(`making ${his2} heavy boobs sway deliciously.`);
			} else {
				r.push(`carefully situating ${his2} legs astride ${S.HeadGirl.slaveName}'s hips.`);
			}
			r.push(`You plant a hard kiss on ${S.Concubine.slaveName}'s mouth, pressing ${him2} backwards`);
			if (S.HeadGirl.belly >= 10000) {
				r.push(`into ${S.HeadGirl.slaveName}'s taut belly`);
			}
			r.push(`as you maneuver yourself into place${(V.PC.dick === 0) ? " and don a strap-on, since there isn't enough space for tribbing to work here" : ""}.`);
			if (canDo.vaginal.conc) {
				/* this is up here to give the PC priority on pregnancy */
				if (canImpreg(S.Concubine, V.PC)) {
					knockMeUp(S.Concubine, 10, 0, -1);
				}
				seX(S.Concubine, "vaginal", V.PC);
				r.push(`${He2} moans into you as ${he2} feels you run`);
				if (V.PC.dick === 0) {
					r.push(`the cool head of the phallus`);
				} else {
					r.push(`your cockhead`);
				}
				r.push(`along ${his2}`);
				if (S.Concubine.labia > 0) {
					r.push(`generous`);
				}
				r.push(`labia before plunging it inside ${him2}. Getting the idea, ${S.HeadGirl.slaveName}`);
				if (canPenetrate(S.HeadGirl)) {
					if (canDo.anal.conc) {
						if (S.HeadGirl.dick - S.Concubine.anus > 2) {
							r.push(`gently pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine's anus will be a little tight around ${his} imposing dick.`);
						} else if (S.HeadGirl.dick - S.Concubine.anus > 0) {
							r.push(`pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick without too much trouble.`);
						} else {
							r.push(`shoves ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick with ease.`);
						}
						if (V.PC.dick !== 0) {
							r.push(`You feel the penetration through ${S.Concubine.slaveName}'s vaginal walls, an incredible sensation.`);
						}
						if (canImpreg(S.Concubine, S.HeadGirl)) {
							knockMeUp(S.Concubine, 10, 1, S.HeadGirl.ID);
						}
						seX(S.Concubine, "anal", V.PC);
						seX(S.Concubine, "anal", S.HeadGirl);
					} else {
						r.push(`gently eases ${his} cock in beside you.`);
						if (V.PC.dick !== 0) {
							r.push(`The added friction against you in ${S.Concubine.slaveName}'s vagina feels incredible.`);
						}
						seX(S.Concubine, "vaginal", V.PC);
						seX(S.Concubine, "vaginal", S.HeadGirl);
						if (canImpreg(S.Concubine, S.HeadGirl)) {
							knockMeUp(S.Concubine, 10, 0, S.HeadGirl.ID);
						}
					}
				} else {
					r.push(`slides a hand down and`);
					if (canDo.anal.conc) {
						if (S.Concubine.anus > 3) {
							r.push(`fists ${S.Concubine.slaveName}'s loose ass, since that's what it takes to fill your Concubine's gaping asspussy.`);
						} else if (S.Concubine.anus === 3) {
							r.push(`starts to fuck ${S.Concubine.slaveName}'s soft anus with three fingers.`);
						} else if (S.Concubine.anus === 2) {
							r.push(`starts to fuck ${S.Concubine.slaveName}'s asspussy with two fingers.`);
						} else {
							r.push(`starts to fuck ${S.Concubine.slaveName}'s tight little backdoor with a finger.`);
						}
						if (V.PC.dick !== 0) {
							r.push(`You feel the penetration through ${S.Concubine.slaveName}'s vaginal walls, an incredible sensation.`);
						}
						seX(S.Concubine, "anal", V.PC);
					} else {
						r.push(`gently eases a few fingers in beside you.`);
						if (V.PC.dick !== 0) {
							r.push(`The added sensation in ${S.Concubine.slaveName}'s vagina feels incredible.`);
						}
						seX(S.Concubine, "vaginal", V.PC);
					}
				}
			} else {
				/* this is up here to give the PC priority on pregnancy */
				if (canImpreg(S.Concubine, V.PC)) {
					knockMeUp(S.Concubine, 10, 1, -1);
				}
				seX(S.Concubine, "anal", V.PC);
				seX(S.Concubine, "anal", S.HeadGirl);
				r.push(`Getting the idea, ${S.HeadGirl.slaveName}`);
				if (canPenetrate(S.HeadGirl)) {
					if (S.HeadGirl.dick - S.Concubine.anus > 2) {
						r.push(`gently pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine's anus will be a little tight around ${his} imposing dick.`);
					} else if (S.HeadGirl.dick - S.Concubine.anus > 0) {
						r.push(`pushes ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick without too much trouble.`);
					} else {
						r.push(`shoves ${his} cock up ${S.Concubine.slaveName}'s ass, since ${he} knows your Concubine can take ${his} dick with ease.`);
					}
					r.push(`Then ${he} grabs ${S.Concubine.slaveName}`);
					if (!hasAnyLegs(S.Concubine)) {
						r.push(`by the stumps`);
					} else {
						r.push(`behind the ${hasBothLegs(S.Concubine) ? "knees" : "knee"}`);
					}
					r.push(`and spreads ${his2}`);
					if (hasBothLegs(S.Concubine)) {
						r.push(`legs`);
					} else {
						r.push(`cheeks`);
					}
					r.push(`as far as they'll go, rotating ${his2} hips to position ${him2} for another phallus up the butt.`);
					if (canImpreg(S.Concubine, S.HeadGirl)) {
						knockMeUp(S.Concubine, 10, 1, S.HeadGirl.ID);
					}
				} else {
					r.push(`slides a hand down and`);
					if (S.Concubine.anus > 3) {
						r.push(`fists ${S.Concubine.slaveName}'s loose ass, since that's what it takes to fill your Concubine's gaping asspussy.`);
					} else if (S.Concubine.anus === 3) {
						r.push(`starts to fuck ${S.Concubine.slaveName}'s soft anus with three fingers.`);
					} else if (S.Concubine.anus === 2) {
						r.push(`starts to fuck ${S.Concubine.slaveName}'s asspussy with two fingers.`);
					} else {
						r.push(`starts to fuck ${S.Concubine.slaveName}'s tight little backdoor with a finger.`);
					}
					r.push(`Then ${he} grabs ${S.Concubine.slaveName} behind a knee with ${his} other hand and rotates ${his2} hips to position ${him2} for additional anal penetration.`);
				}
				r.push(`Your Concubine shivers and moans as ${his2} sphincter accommodates`);
				if (V.PC.dick !== 0) {
					r.push(`your cock,`);
				} else {
					r.push(`the strap-on,`);
				}
				r.push(`too.`);
			}
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`You start to fuck ${him2}, and then ask ${him2} what ${he2} needed from you. The poor ${girl2} has to concentrate hard to remember why ${he2}'s here through the waterfall of sensations, but ${he2} manages it eventually, gasping out a little aesthetic question about one of your other bedslaves. You give ${him2} ${his2} answer and make ${him2} repeat it back. When you're satisfied, you grab ${his2}`);
			if (!hasAnyLegs(S.Concubine)) {
				r.push(`hips`);
			} else {
				r.push(hasBothLegs(S.Concubine) ? `ankles` : `ankle`);
			}
			r.push(`and pull them up, sliding ${him2} off your`);
			if (V.PC.dick !== 0) {
				r.push(`pole`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`and ${S.HeadGirl.slaveName}'s`);
			if (canPenetrate(S.HeadGirl)) {
				r.push(`dick`);
			} else {
				r.push(`penetrating fingers`);
			}
			r.push(`with a lovely lewd noise. After appreciating the sight of ${his2} well-fucked`);
			if (canDo.anal.conc && canDo.vaginal.conc) {
				r.push(`holes,`);
			} else {
				r.push(`hole,`);
			}
			r.push(`you swing ${his2} ass over and deposit it on the bed, producing a grunt as the drop forces the wind out of ${him2}. Grabbing your Head Girl in turn, you yank ${him} towards you, give the giggling slave a kiss, seize ${his}`);
			if (S.HeadGirl.hips > 2) {
				r.push(`breeding`);
			} else if (S.HeadGirl.weight > 95) {
				r.push(`padded`);
			} else if (S.HeadGirl.weight > 10) {
				r.push(`plush`);
			} else if (S.HeadGirl.hips > 1) {
				r.push(`broad`);
			} else if (S.HeadGirl.hips >= 0) {
				r.push(`curvy`);
			} else {
				r.push(`trim`);
			}
			r.push(`hips and lift ${him} onto ${S.Concubine.slaveName}'s lap. ${He} takes`);
			if (canDo.vaginal.HG) {
				if (canDo.vaginal.conc) {
					if (canDo.anal.HG) {
						r.push(`${his} own double pounding, pussy and ass,`);
					} else {
						r.push(`${his} own double pounding,`);
					}
				} else {
					if (canDo.anal.HG) {
						r.push(`double penetration instead, since unlike your Concubine ${he} has two lower fuckholes,`);
					} else {
						r.push(`${his} own double pounding,`);
					}
				}
			} else {
				if (canDo.vaginal.HG) {
					r.push(`double anal instead, since unlike your Concubine`);
					if (S.HeadGirl.vagina === -1) {
						r.push(`${he} only has the one lower fuckhole,`);
					} else {
						r.push(`${his} pussy is off limits,`);
					}
				} else {
					r.push(`${his} own double anal pounding,`);
				}
			}
			r.push(`while taking ${his} turn getting instructions. ${He} manages to ask your permission to make a couple of last-minute changes to slaves' assignments for the day. Having thus given your leadership guidance, you jump up for a shower, crooking a finger to indicate that they should follow. They <span class="devotion inc">trail obediently after you,</span> a bit sore, their holes dripping`);
			if (S.HeadGirl.vagina > -1 || S.Concubine.vagina > -1) {
				if (V.PC.balls > 0 || S.HeadGirl.balls > 0 || S.Concubine.balls > 0) {
					r.push(`cum, pussyjuice, and lube.`);
				} else {
					r.push(`pussyjuice and lube.`);
				}
			} else {
				if (V.PC.balls > 0 || S.HeadGirl.balls > 0 || S.Concubine.balls > 0) {
					r.push(`cum and lube.`);
				} else {
					r.push(`lube.`);
				}
			}
			S.HeadGirl.devotion += 4;
			S.Concubine.devotion += 4;
			/* sex count cleanup for S.HeadGirl since the above block is not pretty */
			if (canDo.vaginal.HG) {
				if (canImpreg(S.HeadGirl, V.PC)) {
					knockMeUp(S.HeadGirl, 10, 0, -1);
				}
				seX(S.HeadGirl, "vaginal", V.PC);
				if (canPenetrate(S.Concubine)) {
					if (canDo.anal.HG) {
						if (canImpreg(S.HeadGirl, S.Concubine)) {
							knockMeUp(S.HeadGirl, 10, 1, V.ConcubineID);
						}
						seX(S.HeadGirl, "anal", S.Concubine);
					} else {
						if (canImpreg(S.HeadGirl, S.Concubine)) {
							knockMeUp(S.HeadGirl, 10, 0, V.ConcubineID);
						}
						seX(S.HeadGirl, "vaginal", S.Concubine);
					}
				} else {
					if (canDo.anal.HG) {
						seX(S.HeadGirl, "anal", V.PC);
					}
				}
			} else {
				if (canImpreg(S.HeadGirl, V.PC)) {
					knockMeUp(S.HeadGirl, 10, 1, -1);
				}
				seX(S.HeadGirl, "anal", V.PC);
				if (canPenetrate(S.Concubine)) {
					seX(S.HeadGirl, "anal", S.Concubine);
					if (canImpreg(S.HeadGirl, S.Concubine)) {
						knockMeUp(S.HeadGirl, 10, 1, V.ConcubineID);
					}
				}
			}

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


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 !== 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;
		}
	}
};

repo_name: Arkerthan/fc

license: mit


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).value;

		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 > 30) {
			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 than 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);
	}
};


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 > 0) ? " to the death" : ""}, but there's something extra special about attending these outside fights${(V.pit.lethal > 0) ? ", 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 > 30) {
			choices.push(new App.Events.Result(`${He} fights him hand to hand`, fight));
		} else {
			choices.push(new App.Events.Result(null, null, `Your bodyguard lacks the combat skill required to fight him hand to hand.`));
		}

		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 > 30
		];
	}

	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 (V.PC.boobs >= 300) {
				if (S.Concubine.boobs > 2000) {
					r.push(`lies close to you with one of ${his} breasts resting half against your own breasts, 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 own.`);
				} else if (S.Concubine.boobs > 300) {
					r.push(`snuggles under your arm, ${his} breasts softly colliding with your own.`);
				} else {
					r.push(`fits ${himself} under your arm, your breasts lying alongside ${his} flat chest.`);
				}
			} else {
				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;
		}
	}
};