code:
App.Events.pLoanshark = class pLoanshark extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.loans.some(loan => loan.name === 'shark' && loan.deadline === V.week)
		];
	}

	execute(node) {
		V.nextButton = " ";

		const loan = V.loans.find(loan => loan.name === 'shark');

		App.Events.addParagraph(node, [`You took out a loan from one of the local loansharks and the time has come to collect. You receive a notification from ${V.assistant.name} that an envoy and a detachment of mercenaries have arrived to see you, and after the group has been escorted in, the shark's representative clears his throat and begins.`]);
		App.Events.addParagraph(node, [`"It states here in my records that you recently borrowed ${cashFormat(Math.trunc(loan.principal))} from my boss. It's time to fulfill your end of the deal."`]);

		App.Events.addResponses(node, [
			V.cash > loan.full
				? new App.Events.Result(`Pay the man`, pay)
				: new App.Events.Result(null, null, `You do not have enough cash to pay the loan back`),
			V.slaves.some(slave => slaveCost(slave) > loan.full)
				? new App.Events.Result(`Offer one of your slaves instead`, slave)
				: new App.Events.Result(null, null, `You do not have any slaves valuable enough to cover the loan`),
			new App.Events.Result(`Refuse`, refuse)
		]);

		function pay() {
			cashX(forceNeg(loan.full), "loan");
			V.loans.delete(V.loans.find(loan => loan.name === 'shark'));

			V.nextButton = "Continue";
			App.Utils.scheduleSidebarRefresh();

			return `No sense in dragging this out. You roll your eyes and order ${V.assistant.name} to transfer the ¤. The envoy, satisfied that all is as it should be, gives a slight bow and a quick nod to his party. Without another word, the men turn on their heels and leave.`;
		}

		function slave() {
			App.Events.addNode(node, [chooseSlave()]);
			V.loans.delete(V.loans.find(loan => loan.name === 'shark'));

			V.nextButton = "Continue";
			App.Utils.scheduleSidebarRefresh();

			return `With a slight tilt of your head, you inquire as to whether your lender would be willing to accept a different type of currency instead. The envoy nods and replies, "Yes, that would be acceptable – my patron has authorized me to make trades on his behalf."`;

			function chooseSlave() {
				const frag = App.UI.DOM.makeElement("div", null, ['margin-top']);

				frag.append(`Choose a slave to send with the group:`);

				V.slaves
					.filter(slave => slaveCost(slave) > loan.full)
					.sort((a, b) => slaveCost(a) - slaveCost(b))
					.forEach(slave => {
						const div = document.createElement("div");
						const {him} = getPronouns(slave);

						App.Events.addNode(div, [
							App.UI.DOM.link(`Send `, () => {
								App.UI.DOM.replace(frag, `You call ${SlaveFullName(slave)} in. After the representative has taken a moment to inspect ${him}, he nods in satisfaction and taps something on his tablet. A moment later you receive a notification that your debt with the lender has been concluded. The man turns to you once more. "It's been a pleasure," he says dryly. With that, the group departs, ${slave.slaveName} in tow.`);

								removeSlave(slave);
							}),
							App.UI.DOM.slaveDescriptionDialog(slave, SlaveFullName(slave)),
							` (worth ${cashFormat(slaveCost(slave))})`,
						], "div", ['indent']);

						frag.append(div);
					});

				return frag;
			}
		}

		function refuse() {
			const text = [];

			if (V.cash > loan.full || V.slaves.some(slave => slaveCost(slave) > loan.full)) {
				text.push(`You simply give the man a cold smile and cross your arms, a clear signal of defiance and refusal. The envoy gives a subtle signal to one of his compatriots, and the large soldier takes a step forward, restraints in hand. "As you know," the representative begins, "Anyone with significant enough debt is subject to enslavement, and the contract you signed with my employer states that you are now a slave. You're coming with us."`);
			} else {
				text.push(`Unfortunately, you're in a little over your head – you have neither the cash needed, nor any slaves valuable enough to cover the cost. Upon hearing this, the envoy nods, his face expressionless. "As you know," he starts, "Anyone with significant enough debt is subject to enslavement, and the contract you signed with my employer states that you are now a slave. You're coming with us."`);
			}

			if (S.Bodyguard) {
				const {his, him} = getPronouns(S.Bodyguard);

				text.push(`Your bodyguard, ${S.Bodyguard.slaveName}, draws ${his} pistol faster than you would have thought possible and manages to put a round into the nearest mercenary before the other soldiers gun ${him} down. Unarmed and defenseless, you have no choice but to surrender.`);
			}

			V.loans.delete(V.loans.find(loan => loan.name === 'shark'));
			V.gameover = "loanshark";
			V.nextButton = "Continue";
			V.nextLink = "Gameover";
			App.Utils.scheduleSidebarRefresh();

			return text.join(' ');
		}
	}
};


code:
App.Events.pRaped = class pRaped extends App.Events.BaseEvent {
	constructor(actors, params) {
		super(actors, params);
	}

	eventPrerequisites() {
		return [
			() => App.Events.effectiveWeek() === 12,
			() => V.raped === -1,
			() => V.arcologyUpgrade.drones !== 1,
			() => V.BodyguardID === 0,
			() => V.PC.career !== "arcology owner",
			() => V.PC.visualAge >= 14
		];
	}

	execute(node) {
		let r = [];
		const {
			hisP, womanP, girlP
		} = getPronouns(V.PC).appendSuffix("P");
		V.raped = 1;

		const genParam = {minAge: 16, race: "nonslave", disableDisability: 1};
		let rapist;
		const contractCost = 1000;
		if (V.PC.vagina >= 0) {
			rapist = GenerateNewSlave("XY", genParam);
			rapist.dick = 6;
			rapist.balls = 5;
			rapist.boobs = 100;
			rapist.waist = 50;
			rapist.skill.oral = 0;
			rapist.skill.anal = 0;
			rapist.pronoun = 1; //janky workaround - reset later by repeating generatePronouns - reexamine in any diversePronouns rework
		} else {
			rapist = GenerateNewSlave("XX", genParam);
			rapist.vagina = 1;
			rapist.preg = 0;
			rapist.weight = random(-20, 30);
			rapist.waist = -20;
		}
		rapist.muscles = Math.max(rapist.muscles, 10);
		rapist.origin = `You sentenced $him to enslavement for the attempted rape of a free ${womanP} - you, to be exact.`;
		rapist.devotion = -100;
		rapist.trust = -100;
		setHealth(rapist, jsRandom(-40, -20), normalRandInt(15, 3), undefined, 1, jsRandom(30, 80));
		rapist.anus = 0;
		rapist.behavioralFlaw = "arrogant";
		rapist.sexualFlaw = "judgemental";

		const {
			He,
			his, he, him, himself, woman
		} = getPronouns(rapist);
		const {say} = getEnunciation(rapist);

		r.push(`While returning from a meeting with a prospective investor, an unfortunate wrong turn has led you into a rather seedy area of your arcology. You feel distinctly uncomfortable for some reason.`);

		if (isPCCareerInCategory("mercenary") || V.PC.skill.warfare >= 85) {
			r.push(`The moment you hear the sound of the knife unsheathe your reflexes take`);
			if (!isHindered(V.PC)) {
				r.push(`over. With a single strike, the ${woman} tailing you lies in a heap on the ground.`);
				V.raped = 0;
			} else {
				r.push(`over, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
			}
		} else if (isPCCareerInCategory("slaver") || V.PC.skill.warfare >= 45) {
			r.push(`The moment you notice an arm coming around from behind you, your training kicks in.`);
			if (!isHindered(V.PC)) {
				r.push(`You quickly disarm the assailant and knock them to the floor before placing them in a choke-hold. Once they are subdued, you stand back to decide what to do next.`);
				V.raped = 0;
			} else {
				r.push(`You quickly try to disarm your assailant, but find your body has become a bit too ponderous as of late. After a short struggle, it is you that ends up pinned with a knife to the throat.`);
			}
		} else if (isPCCareerInCategory("gang")) {
			r.push(`The moment you hear the sound of the knife unsheathe your reflexes take over.`);
			if (!isHindered(V.PC)) {
				r.push(`With a single stab, your own shiv is buried in ${his} chest, incapacitating ${him}.`);
				V.raped = 0;
			} else {
				r.push(`You try to draw your shiv and stab ${him}, but your body has grown a bit too unwieldy as of late, so you find yourself quickly outmaneuvered and held with a knife to your throat.`);
			}
		} else {
			r.push(`You stifle a`);
			if (V.PC.title === 1) {
				r.push(`swear`);
			} else {
				r.push(`scream`);
			}
			r.push(`when you feel your arm grabbed and the knife pressed to your throat, knowing that it will only end badly for you in this place.`);
		}
		App.Events.addParagraph(node, r);
		if (V.raped === 1) {
			r = [];
			V.fcnn.push("...plans for increased security measures, but refused to answer questions regarding...");
			if (V.PC.vagina >= 0) {
				r.push(Spoken(rapist, `"Well, well, well, look what ${(V.PC.belly >= 5000 || V.PC.preg >= 20 || V.PC.weight >= 130) ? `waddled` : `walked`} into my territory. If it isn't ${V.PC.slaveName}, come to grace me with ${hisP} presence."`));
			} else {
				r.push(Spoken(rapist, `"I've been watching you ever since you first moved in, ${V.PC.slaveName}, waiting for the perfect moment to make you mine. We are going to have a little fun, you and I."`));
			}
			r.push(`The ${woman} binds your hands behind you, all the while keeping the knife to your throat.`);
			r.push(Spoken(rapist, `"Smart keeping your mouth shut; maybe I won't have to hurt you. Heh, I know what you're thinking, that you'll find out who I am and punish me. Don't worry, I made sure to not to leave you any trails to follow${V.PC.visualAge < V.minimumSlaveAge ? ", especially with you being so sinfully delectable" : ""}. Now let's see what we have here."`));

			if (V.PC.vagina >= 0) {
				if (V.PC.butt > 4) {
					r.push(Spoken(rapist, `"God, the way your fat ass is hugging my dick, you were just made to be bent over, weren't you?"`));
					r.push(`${he} states matter-of-factly as ${he} pulls you closer.`);
				}
				r.push(`With ${his} free hand, ${he} begins to explore your vulnerable body.`);
				if (V.PC.weight > 130) {
					r.push(Spoken(rapist, `"Normally I don't go for fatties, but for you, I think I can make an exception,"`));
					r.push(`${he} chides as ${he} grinds against your soft form.`);
				} else if (V.PC.weight > 95) {
					r.push(Spoken(rapist, `"Bit soon to be letting yourself go, isn't it?"`));
					r.push(`${he} chides as ${he} grinds against your soft form.`);
				} else if (V.PC.weight > 30) {
					r.push(Spoken(rapist, `"Nothing wrong with carrying a little extra weight,"`));
					r.push(`${he} teases as ${he} grinds against your soft form.`);
				}
				if (isPCCareerInCategory("wealth")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. How much did you have to pay for these babies?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"Couldn't afford an abortion after you took over? How sad,"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Went with the full package didn't you?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("capitalist")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. Bet these got you some great deals with guys, didn't they?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"Sleeping with guys to close deals? Such a slut,"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Guess you fuck people over in more ways than one, don't you?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("mercenary")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"So did you ever actually see combat, or did you just spend all your days in the barracks servicing the real soldiers?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"Well now I know why you aren't serving still,"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Got a little surgery between missions, eh?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("engineer")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. Did the other engineers care about your designs or just your tits?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"I can see why your designs were so popular, you fucked your way into the spotlight!"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Well you do know how to erect things, don't you?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("medicine")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. Did you implant them yourself?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						if (V.PC.dick > 0) {
							r.push(Spoken(rapist, `"Look at that belly! I bet you inseminated yourself with your own seed,"`));
							r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
						} else {
							r.push(Spoken(rapist, `"I see how you work. Mess up a surgery and give the guy a pity fuck. Surprised you couldn't get their spawn out of your belly though. Guess you aren't that good of a surgeon,"`));
							r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
						}
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"I'm impressed. Your woman impression is quite good. Did you do the surgery yourself?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
						r.push(Spoken(rapist, `"Still going to fuck you though."`));
					}
				} else if (isPCCareerInCategory("slaver")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"With tits like these, I bet you were the bait used to lure them in,"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"Did a slave beat me to you?"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Bet you raped a bunch of girls with this, didn't you? Consider what's coming karma,"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("celebrity")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. I wonder how many guys jacked off to your pictures?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"I can see how you got so popular!"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"How much tape did it take to hold this guy down?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("escort")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and soft. How many dicks have been between these babies?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"What kind of whore doesn't know about protection?"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"So, did you ever get to use this when you were a prostitute?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("gang")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"I bet I'm not the first person to do this to you, am I?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"Ah, now I get it. Your role in the gang was to lie on your back and take dick all day, wasn't it?"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Fuck or be fucked world; today, it's gonna be you,"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("servant")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. Bet your Master spent a fortune making these so nice,"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"Holding on to your Master's final gift are you?"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"When your Master first undressed you, what did he think of his 'girl'?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				} else if (isPCCareerInCategory("BlackHat")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. What are the odds that I can find these babies on the internet?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
						r.push(Spoken(rapist, `"You'd think someone so skilled at breaking security would understand protection themselves. Or did you trade your pussy for information?"`));
						r.push(`${he} chuckles as ${he} rubs your pregnant belly.`);
					}
					if (V.PC.dick > 0) {
						r.push(Spoken(rapist, `"Trying to catch a signal with that?"`));
						r.push(`${he} mocks as ${he} flicks the tip of your stiffening cock.`);
					}
				}
				r.push(`Finally ${he} reaches your moistening pussy.`);
				r.push(Spoken(rapist, `"Already wet are we? Glad you know your place,"`));
				r.push(`${he} states as ${he} pulls your clothes off and bends you over.`);
				if (V.PC.vagina === 0) {
					r.push(Spoken(rapist, `"And you still have your innocence, how delightful!"`));
				}
				App.Events.addParagraph(node, r);
				r = [];
				r.push(`You can feel the head of ${his} cock teasing your`);
				if (V.PC.vagina === 0) {
					r.push(`virgin pussy; you grit your teeth knowing what will come next. Without mercy, ${he} tears through your hymen and forces ${himself} as deep as your tight pussy lets him. You choke back a sob as ${he} struggles to hilt ${himself} in you. ${He} must have undergone surgery or something because there is no way your body can handle such a monster. You're in agony already - you can't fathom what will happen when ${he} loses ${his} patience.`);
				} else {
					r.push(`pussy lips; you hope it feels bigger than it really is. As ${he} struggles to force it into you, you regret thinking about it. ${He} must have undergone surgery or something because ${he} fills you completely. You feel weak just from ${him} sticking it in, you can't fathom what will happen once ${he} starts thrusting.`);
				}
				r.push(`You soon find out as ${he} wastes no time starting slow. ${He} violently rams ${his} oversized cock deep into you, threatening to penetrate your cervix with each thrust. ${He} quickens ${his} pace, fucking you like a beast.`);
				if (V.PC.preg < 1) {
					if (random(1, 100) > 60) {
						r.push(`His hand rises to your lips and forces something into your mouth.`);
						r.push(Spoken(rapist, `"Swallow it."`));
						r.push(`You obey, hoping to just get this over with.`);
						V.PC.forcedFertDrugs += 3;
					}
					r.push(`With one final thrust, ${he} forces through your battered cervix and unloads in the depths of your`);
					if (canGetPregnant(V.PC)) {
						r.push(`fertile`);
					}
					r.push(`womb.`);
				} else {
					r.push(`With one final thrust, ${he} forces it in as deep as ${he} can into you and blows ${his} seed deep in your aching cunt.`);
				}
				if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
					r.push(Spoken(rapist, `"Now your ${(V.PC.pregType > 1) ? `children` : `child`} will know what a real man's sperm is like!"`));
				}
				r.push(`${He} shoves you to the ground, your pussy gaping from the size of ${his} shaft and leaking ${his} huge load all over yourself. By the time you loosen your bindings, ${he} is long gone.`);
				App.Events.addParagraph(node, r);
				r = [];
				r.push(`It would be prudent to up security in your arcology. That or take a guard along when you leave the penthouse. Such a thing, happening to you. You can't allow such an indignity to happen again,`);
				if (V.PC.vagina === 0) {
					r.push(`not that you'll ever get your first time back,`);
				} else {
					r.push(`you think to yourself,`);
				}
				r.push(`as you try to coax ${his} sperm from your abused pussy.`);
				if (canGetPregnant(V.PC)) {
					r.push(`For some reason your body feels really satisfied, despite`);
					if (V.PC.vagina === 0) {
						r.push(`what transpired...`);
					} else {
						r.push(`not climaxing...`);
					}
					r.push(`Is this what it feels like to be bred by someone so dominant? You should take a pregnancy test right away and make sure ${he} didn't knock you up.`);
					knockMeUp(V.PC, 100, 0, -2);
				}
				if (V.PC.vagina === 0) {
					V.PC.vagina++;
				}
				App.Events.addParagraph(node, r);
			} else {
				if (V.PC.weight > 95) {
					r.push(Spoken(rapist, `"I don't mind a little weight, so long as it doesn't get in the way. And even if it did, it won't stop me."`));
					r.push(`${he} chuckles as ${he} embraces your soft form.`);
				}
				r.push(`With ${his} free hand, ${he} begins to explore your bound body.`);
				if (V.PC.preg >= 20 || V.PC.belly >= 5000) {
					r.push(Spoken(rapist, `"Can't say I've ever had sex with a pregnant ${womanP} before... I'll figure it out, don't you worry!"`));
					r.push(`${he} teases as ${he} rubs your pregnant belly.`);
					r.push(Spoken(rapist, `"I won't be far behind you..."`));
					r.push(`${he} thinks out loud, much to your chagrin.`);
				}
				if (isPCCareerInCategory("wealth")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Spared no expenses for these babies, did you?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"Now there's the money maker!"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"And apparently the bank too!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"And loaded in the virility department too!"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("capitalist")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Ever wonder if they were listening to you or just ogling the man with the breasts?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"Now that explains how you were so successful!"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"And you're positively loaded!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"And you've got a nice investment for me too!"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("mercenary")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Must have been pretty tight in your body armor, huh?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"I guess they do let you keep your rifle!"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"I'd have been worried lugging these into combat, but I'm so glad you made it through unscathed!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Glad to see these made it through unharmed!"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("engineer")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"How did you get any work done with these hanging over your designs?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"I see what kind of tools you like. Big and strong!"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Oh my! I must have been tight squeezed into your work attire! I hope I can handle such a large-scale construction job!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Ah! It looks like you have a nice construction crew all ready for me!"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("medicine")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"I'm sure you had quite the number of clients after a pair of these,"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"Huh, I wonder if that's real..."`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Hitting the experimental drugs a little, are we? Let me help you with your research!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Heh, access to such lovely virility aids did wonders for you and I."`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("slaver")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"A lovely pair of deployable distractions,"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"Did you have a nickname for him? Like 'the discipliner' or something?"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Pump me full, like all those fresh captures you broke in!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"I wonder how many slaves you had to empty these bad boys out into."`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("celebrity")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. Just like I'd expect from a man sporting tits."`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants;`);
					r.push(Spoken(rapist, `"Oh, now those tabloids make sense."`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"You certainly stole the show, no matter what you wore!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Heh, I always loved the sight of these in your fine clothes."`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("escort")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"With these hanging out, how many men tried to pick you up?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"Now there's the money maker!"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"I bet these made you quite popular with those little sluts looking to get knocked up! Can't wait to join them!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"And his two fine friends as well!"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("gang")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"You're a lot less threatening with these,"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"I bet he's seen a lot of action, hasn't he?"`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"I'd have been worried, carrying around jewels like these. Glad they're healthy and soon to be very happy!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Your coin purse is looking a little heavy. How bout I help you empty it?"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("servant")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Did your Master even ask before he stuck you with these?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					if (V.PC.dick >= 3) {
						r.push(Spoken(rapist, `"Now that's surprising. I expected something smaller."`));
					} else {
						r.push(Spoken(rapist, `"Can't say I'm surprised. Wouldn't want another rooster in the henhouse after all."`));
					}
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"Did not expect them to be so, profound... Compensating for all the years you weren't allowed to use them?"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"And then there's these! Such lovely baby makers!"`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				} else if (isPCCareerInCategory("BlackHat")) {
					if (V.PC.boobs >= 300) {
						r.push(Spoken(rapist, `"Nice and supple. What are the odds that I can find these babies on the internet?"`));
						r.push(`${he} smirks as ${he} gropes your breasts.`);
					}
					r.push(`${He} slips ${his} hand down your pants.`);
					r.push(Spoken(rapist, `"You wouldn't mind if I download a few files now would you? Well, not that it matters."`));
					if (V.PC.balls >= 9) {
						r.push(`It's impossible to hide the two firm globes beneath your dick, so you can only wince as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"You really should dig a little deeper into the drugs you find online, not that I'm complaining!"`));
						r.push(`${He} ${say}s excitedly, rubbing your sizeable balls while licking ${his} lips.`);
					} else if (V.PC.balls >= 5) {
						r.push(`${He} no doubt noticed your bulge as ${he} reaches a little lower.`);
						r.push(Spoken(rapist, `"I bet you're proud of these, with as many as you've seen out there."`));
						r.push(`${He} ${say}s, licking ${his} lips lustfully while cupping your balls.`);
					}
				}
				r.push(`Satisfied, ${he} pulls your cock out of its increasingly cramped confines.`);
				r.push(Spoken(rapist, `"Look at him grow, he knows what comes next..."`));
				r.push(`${He} teases as ${he} pushes you to the ground and climbs on top of you.`);
				App.Events.addParagraph(node, r);
				r = [];
				r.push(`${He} lines ${himself} up with the tip of your dick before taking its entire length into ${himself}. ${He} lets out a lust filled moan as ${he} begins to bounce on your traitorous member. You can do nothing to stop ${him} from riding you to climax, so you just enjoy the sight of ${his} breasts bouncing to ${his} pace. As you feel your orgasm approaching, you try to time it so you can slip out of ${him} just before you blow your load, but you have no such luck.`);
				r.push(Spoken(rapist, `"You really think I'd let you spoil my plans?"`));
				r.push(`${he} asks as ${he} grinds against you, making sure you cum deep in ${his} pussy. ${He} leans back and massages ${his}`);
				if (V.PC.balls >= 20) {
					r.push(`taut`);
				}
				r.push(`stomach, savoring the sensation of your seed seeping into ${him}.`);
				r.push(Spoken(rapist, `"That's it, make me a mommy."`));
				r.push(`${He} leans in close and you pop free of ${his} snatch.`);
				r.push(Spoken(rapist, `"Be a good ${girlP} and make this arcology a nice place for your bastard. I want to retire in luxury."`));
				r.push(`${He} blows you a kiss as ${he} stuffs a plug up ${his} vagina, redresses and heads on ${his} way. By the time you loosen your bindings, ${he} is long gone.`);
				App.Events.addParagraph(node, r);
				r = [];
				r.push(`It would be prudent to up security in your arcology, that or take a guard along when you leave the penthouse. You can't allow such an indignity to happen again, nor do you need the stress of a bastard trying to seize control of your estate when you want to retire, but you wouldn't mind having your way with ${him} if you get the chance.`);
				App.Events.addParagraph(node, r);
			}
		} else {
			App.UI.DOM.appendNewElement("div", node, `Now the only question is what to do with the would-be rapist. You could toss them out of the arcology, but it might be more fun to turn the tables on ${him}.`);

			let slaveCosts = slaveCost(rapist);
			slaveCosts -= contractCost;
			App.UI.DOM.appendNewElement("div", node, `Applying enslavement as punishment will cost ${cashFormat(contractCost)}. Doing so and then selling ${him} immediately will bring in approximately ${cashFormat(slaveCosts)}.`, "note");

			node.append(App.Desc.longSlave(rapist, {market: "generic"}));
			const choices = [];
			if (V.cash >= contractCost) {
				choices.push(new App.Events.Result(`Enslave ${him}`, enslave));
				choices.push(new App.Events.Result(`Sentence ${him} to a day in the stocks, then enslave ${him}`, stocks));
				if (V.arcade > 0) {
					choices.push(new App.Events.Result(`Enslave ${him} and sentence ${him} to a month in the arcade`, arcade));
				}
				if (V.dairy > 0 && V.dairyRestraintsSetting > 1) {
					choices.push(new App.Events.Result(`Enslave ${him} and send ${him} straight to the industrial dairy`, dairy));
				}
				if (V.farmyard > 0) {
					choices.push(new App.Events.Result(`Enslave ${him} and send ${him} straight to the farmyard`, farmyard));
				}
				if (V.seeExtreme > 0) {
					choices.push(new App.Events.Result(`Punitively amputate ${his} limbs, and then enslave ${him}`, amputate));
				}
			} else {
				choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
			}
			choices.push(new App.Events.Result(`Publicly flog the criminal`, flog));
			App.Events.addResponses(node, choices);
		}

		function enslave() {
			const el = new DocumentFragment();
			cashX(forceNeg(contractCost), "slaveTransfer", rapist);
			generatePronouns(rapist);
			el.append(`You complete the legalities and biometric scanning quickly and without fuss. The idiot will regret crossing you when ${he} wakes in the penthouse for basic slave induction.`);
			el.append(App.UI.newSlaveIntro(rapist));
			return el;
		}

		function stocks() {
			const el = new DocumentFragment();
			const r = [];
			generatePronouns(rapist);
			healthDamage(rapist, 10);
			rapist.behavioralFlaw = "odd";
			rapist.sexualFlaw = "hates penetration";
			rapist.anus = 2;
			seX(rapist, "oral", "public", "penetrative", 23);
			seX(rapist, "anal", "public", "penetrative", 12);
			if (rapist.vagina > -1) {
				rapist.vagina = 2;
				seX(rapist, "vaginal", "public", "penetrative", 12);
				if (random(1, 100) > 60 && isFertile(rapist)) {
					knockMeUp(rapist, 100, 0, -2);
				}
			} else {
				seX(rapist, "anal", "public", "penetrative", 12);/* even more anal */
			}
			cashX(forceNeg(contractCost), "slaveTransfer", rapist);

			r.push(`You declare ${his} holes fair game for the entire arcology. ${He} spends a torturous day in the stocks before being hauled in for enslavement, somewhat the worse for wear and acting oddly due to ${his} ordeal, bruises all over ${his} body, cum leaking from ${his} loosened anus${(rapist.vagina > -1) ? ` and <span class="lime">fucked-out</span> pussy` : ``}. The public enjoys the fun.`);
			repX(500, "event");
			V.arcologies[0].prosperity += 2;
			r.push(App.UI.newSlaveIntro(rapist));
			App.Events.addParagraph(el, r);
			return el;
		}

		function arcade() {
			generatePronouns(rapist);
			assignJob(rapist, "be confined in the arcade");
			rapist.sentence = 4;
			cashX(forceNeg(contractCost), "slaveTransfer", rapist);
			newSlave(rapist);/* skip New Slave Intro */
			return `You complete the legalities and biometric scanning quickly and cautiously. The idiot will be in for a surprise when ${he} awakes to find ${he} can't move and a dick is in ${his} ass.`;
		}

		function dairy() {
			const el = new DocumentFragment();
			const r = [];
			generatePronouns(rapist);
			assignJob(rapist, "work in the dairy");
			cashX(forceNeg(contractCost), "slaveTransfer", rapist);
			r.push(`You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up`);
			if (V.dairyStimulatorsSetting > 1) {
				r.push(`in agony as ${his} anus takes the rectal hydration dildo.`);
			} else {
				r.push(`to find ${his} chest has begun swelling with milk.`);
			}
			rapist.boobs += 300;
			newSlave(rapist); /* skip New Slave Intro */
			App.Events.addNode(el, r);
			return el;
		}

		function farmyard() {
			const el = new DocumentFragment();
			const r = [];
			generatePronouns(rapist);
			assignJob(rapist, "work as a farmhand");
			cashX(forceNeg(contractCost), "slaveTransfer", rapist);
			r.push(`You complete the legalities and biometric scanning quickly and cautiously. The idiot will wake up in ${V.farmyardName}, where ${he} will spend the rest of ${his} days`);
			if (V.farmyardShows < 2) {
				r.push(`working the fields`);

				if (V.farmyardShows > 0) {
					r.push(`and`);
				}
			}
			if (V.farmyardShows > 0) {
				if (V.seeBestiality) {
					r.push(`getting fucked by animals.`);
				} else {
					r.push(`putting on shows with animals.`);
				}
			}
			newSlave(rapist);/* skip New Slave Intro */
			App.Events.addNode(el, r);
			return el;
		}

		function amputate() {
			const el = new DocumentFragment();
			const r = [];
			generatePronouns(rapist);
			healthDamage(rapist, 20);
			removeLimbs(rapist, "all");
			rapist.behavioralFlaw = "odd";
			cashX(forceNeg(contractCost), "slaveTransfer", rapist);
			r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery. You take great pleasure in watching ${him} struggle as ${his} limbs are taken, one by one. Of course, ${his} health is affected and the horrible experience has left ${him} acting oddly. After ${he} has stabilized, it's off to the penthouse for basic slave induction. You'd like to see ${him} try and touch you again without arms and legs.`);
			if (rapist.balls > 0) {
				const geld = function() {
					const el = new DocumentFragment();
					const r = [];
					healthDamage(rapist, 20);
					rapist.balls = 0;
					rapist.devotion -= 25;
					rapist.trust -= 25;
					cashX(forceNeg(contractCost), "slaveTransfer", rapist);
					r.push(`You want ${him} to suffer for what ${he} tried to pull on you. You make sure ${he} is fully awake as ${he} is strapped into the autosurgery, taking the time to roughly fondle ${his} balls. You take great pleasure in watching ${him} struggle as ${his} testicles are removed. Once ${he} can stand again, it's off to the penthouse for basic slave induction.`);
					r.push(App.UI.newSlaveIntro(rapist));
					App.Events.addNode(el, r);
					return el;
				};
				App.Events.addResponses(el, [new App.Events.Result(`Enslave the criminal and geld ${him}`, geld)]);
			}
			App.Events.addNode(el, r);
			return el;
		}

		function flog() {
			const el = new DocumentFragment();
			const r = [];
			r.push(`Naturally, the wretch will be thrown out of the arcology, but an example must first be made. Free people must understand that criminals who commit outrages against them will be severely punished. The protesting malefactor is stripped and flogged on the promenade before being escorted bleeding from the arcology. The public approves of this harshness.`);
			repX(500, "event");
			App.Events.addNode(el, r);
			return el;
		}
	}
};

license: mit


code:
App.Events.PSchoolSuggestion = class PSchoolSuggestion extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.arcologies[0].prosperity > 80,
			() => V.schoolSuggestion === 0,
			() => App.Utils.schoolCounter() === 0,
		];
	}

	execute(node) {
		const startFee = 10000;

		V.schoolSuggestion = 1;
		App.Events.addParagraph(node, [`You entertain your most prominent citizens on a regular basis; it's expected, it's good business, and it's occasionally interesting. You're fashionably late again tonight, but these affairs are usually informal, and your knot of guests start without you with no offense given or taken. They know you're busy, they respect you for it, and they know you'll make an appearance if and when you can. The drinks will be just as good either way.`]);

		App.Events.addParagraph(node, [`When you do appear, you get an even greater acclamation than usual. It seems your best citizens have discovered that they're unanimous in the belief that the arcology would benefit if a reputable slave school opened a branch campus here. Now they're deep in debate over which of the prominent schools is the best, and it's turned into a friendly but spirited dispute over the schools' merits.`]);

		App.Events.addParagraph(node, [`It seems a young, thin woman in a modern business suit was concluding her own argument when you arrived. "In summation, I propose we offer our support for Nueva Universidad de Libertad," says the woman, who you now realize is a very feminine man. "Nullification may seem extreme, but serves to expand the potential market amongst more... traditional slaveowners," says the man, who you now realize is a woman who merely looks like a very feminine man.`]);

		App.Events.addParagraph(node, [`"I believe what you need in a slave is a good base. As such, The Utopian Orphanage is the best. They offer slaves who were raised with careful attention; they're beautiful, smart, well-educated and unspoiled." The young surgeon continues. "No traumas, a happy childhood, obedient and trusting. You can then mold them to your will as you please; I have enough faith in my skills to achieve the results I desire myself."`]);

		if (V.seeDicks !== 100) {
			App.Events.addParagraph(node, [`"The Slave School for me," says a portly man with a thriving slave breaking business down in the markets. "Their girls are pretty, skilled, and innocent, without any of that weird crap the other schools go in for. Besides, all that special stuff drives up the prices. TSS girls are cheap for what you get. When you're tired of one, just buy another." He turns to his friend and business partner, a much thinner man. "Though I'm sure you disagree with me."`]);
			App.Events.addParagraph(node, [`"Of course I do, we've been having this debate every day for ten years." The thin man laughs. "Hasn't hurt our company, though. Anyway, I'm a GRI man. It's much harder to change a girl's body than it is to train her mind. The Growth Research Institute might sell their girls with no training and some nasty flaws, but you can fix those faster than you can grow a well-trained skinny girl's tits out to here," and he gestures far out in front of his own chest.`]);

			App.Events.addParagraph(node, [`An older woman standing across from him sniffs. "St. Claver's knows how to do both. They train them right, and if they aren't perfectly made, well, that's what plastic surgery is for." She favors the group with a sharp smile. "The best part is that between the silicone and their, ahem, strict training, they're all the same. Once you get used to their girls, you can always rely on them to give you more of what you like."`]);
		}

		if (V.seeDicks !== 0) {
			App.Events.addParagraph(node, [`"That's what I like about L'École," her neighbor puts in.${(V.language !== "French") ? ` "Bad French, I know: Le Eycole Dess Encoolees."` : ``} Less articulate than the others, he makes a vague motion down near his waist, as though he were fucking something, and then stops himself. "Anyway. If you like butts, they're the best. You can train slaves for years and not get them as eager to take it up the ass as that place makes 'em. Their girls come as soon as you stick it in 'em."`]);

			App.Events.addParagraph(node, [`"Eugh." His neighbor rolls his eyes. "If your taste is a bit more refined, the Gymnasium-Academy makes their, ha, girls more well-rounded than just that. Not that they aren't delightfully entertaining when it comes to that, either. But they're also fit, well-trained, and even skilled at martial arts. They're perfect if you like hot young things all ready to be your bodyguard."`]);

			App.Events.addParagraph(node, [`The unusually competent young heiress standing next to him snickers. "If you're going to bring up refinement, um, hello, the Futanari Sisters. I have four futas in my apartment having sex with each other right now. How do I know? Because they're always having sex with each other. They never stop." Her eyes take on a faraway look and she pauses. "Um, haha, I know what I'm doing later."`]);
		}

		App.Events.addParagraph(node, [`"If you like them soft and mellow, you got to go with The Cattle Ranch," a buff man blurts loudly while slamming down his empty mug. "I've got a pair of 'em for my bedroom; they are so loving after a good milking. Taste good too." His drinking buddy retorts, "Too much work is what they are. They might as well be animals with how they act.${(V.seePreg === 0) ? " In addition, hope you like pregnant pussies, 'cause you need to keep them gravid or their milk dries up." : ""}"`]);

		App.Events.addParagraph(node, [`"I see good taste is scarce within this walls," suddenly stated a young man previously quiet in his corner. "I say quality and strength is where the game should be played and there's nothing better than the girls from the Hippolyta Academy."`]);

		App.Events.addParagraph(node, [`The older gentleman who seems to have been acting as unofficial moderator before you came in turns to you. "In any case, ${(V.PC.title === 1) ? "sir" : "madam"}, we agreed before you came in. We'd like to get together and pay half the cost of encouraging a slave school to set up a branch campus here, if you'd be willing to pay the other half and choose which. I think ${cashFormat(startFee)} from you would cover it." He looks around the group. "Before we started this little debate, we all agreed to chip in regardless of which you chose."`]);

		App.UI.DOM.appendNewElement("div", node, `Selecting a school will cost ${cashFormat(startFee)} and add minor upkeep costs`, "note");

		const choices = [];
		if (V.seeDicks !== 100) {
			choices.push(new App.Events.Result(`The Slave School`, TSS));
			choices.push(new App.Events.Result(`The Utopian Orphanage`, TUO));
			choices.push(new App.Events.Result(`The Growth Research Institute`, GRI));
			choices.push(new App.Events.Result(`St. Claver Preparatory`, SCP));
			if (V.seePreg !== 0) {
				choices.push(new App.Events.Result(`The Cattle Ranch`, TCR));
			}
			choices.push(new App.Events.Result(`The Hippolyta Academy`, HA));
		}
		if (V.seeDicks !== 0) {
			choices.push(new App.Events.Result(`L'École des Enculées`, LDE));
			choices.push(new App.Events.Result(`The Gymnasium-Academy`, TGA));
			choices.push(new App.Events.Result(`The Futanari Sisters`, TFS));
			choices.push(new App.Events.Result(`Nueva Universidad de Libertad`, NUL));
		}
		App.Events.addResponses(node, choices);

		function TSS() {
			V.TSS.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting The Slave School about opening a branch campus here, immediately.`;
		}

		function TUO() {
			V.TUO.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting The Utopian Orphanage about opening a branch campus here, immediately.`;
		}

		function GRI() {
			V.GRI.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting the Growth Research Institute about opening a branch campus here, immediately.`;
		}

		function SCP() {
			V.SCP.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting St. Claver Preparatory about opening a branch campus here, immediately.`;
		}

		function TCR() {
			V.TCR.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting the Cattle Ranch about opening a local pasture, immediately.`;
		}

		function HA() {
			V.HA.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting the Hippolyta Academy about opening a local branch, immediately.`;
		}

		function LDE() {
			V.LDE.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting L'École des Enculées about opening a branch campus here, immediately.`;
		}

		function TGA() {
			V.TGA.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting the Gymnasium-Academy about opening a branch campus here, immediately.`;
		}

		function TFS() {
			V.TFS.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting the Futanari Sisters about moving a harem of futas here, immediately.`;
		}

		function NUL() {
			V.NUL.schoolPresent = 1;
			cashX(-startFee, "policies");
			return `You thank your leading citizens and announce your decision: you'll be contacting Nueva Universidad de Libertad about opening a branch campus here, immediately.`;
		}
	}
};


code:
App.Events.PPeacekeepersDeficit = class PPeacekeepersDeficit extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.peacekeepers.state === 2,
			() => V.peacekeepers.attitude >= 0
		];
	}

	execute(node) {
		V.nextButton = "Continue";

		App.Events.addParagraph(node, [`General ${V.peacekeepers.generalName}'s peacekeeping force has stabilized the neighboring region somewhat. True to his word, the general has indeed concentrated on his peacekeeping mandate, and hasn't done anything that might be construed as a move against the Free City or its interests. There are somewhat fewer refugees available from that area, and it's a less complete refuge for bad actors, but other than that, there hasn't been much reason for you to take notice. Until today, when General ${V.peacekeepers.generalName} gives you a call.`]);
		App.Events.addParagraph(node, [`It's a video link, and the general is in the field somewhere, wearing scuffed armor with his insignia of rank on the neck protector. He looks tired, and stress worse than simple fatigue is etched on his face, but he looks at you directly and gets on with it. "${PlayerName()}," he says, "to start, I'd like to assure you this is a secure line from my end. We rely on structural security more than you in the Free Cities, with your cutting-edge computing power, but it's effective." He's in what looks like a field command post, in what's almost certainly an improvised secure communications booth. "The situation is this," he explains. "I have two problems, and I hope you may be able to solve them both at once in a way that will be beneficial to you."`]);
		App.Events.addParagraph(node, [`"First," he says sharply, "I'm not getting the support I need out here." It obviously pains him to admit this, and the muscles along his jaw tense as he does, as though he's chewing on the words. "And I'm not giving anything away by telling you that. It's obvious enough, if you compare what I'm being asked to do here with the resources the politicians back home are willing to provide." At this, ${V.assistant.name} displays a quick summary of the political developments in the general's home country. General ${V.peacekeepers.generalName} is right; the expensive peacekeeping force is unpopular, and its support is being reduced by opportunistic politicians. "It isn't bad yet," he says, "but if this keeps up, I'm going to be rationing the most modern medical supplies for my wounded men and women. That's hard."`]);
		App.Events.addParagraph(node, [`"And second," he continues, "I'm having difficulty housing the prisoners we're taking. We're the only functioning law and order in this area, and in order to keep control I'm having to lock up everyone from armed bandits to petty looters. I don't have the resources to imprison them decently. I'm already getting flak about conditions in our main prison camp here." He arches an eyebrow. "Some people back home seem to care more about keeping prisoners comfortable than they care about getting my wounded men and women the best possible care. And I can't just reduce the prisoner population, either. There are too many of them. Word would get out, and there'd be hell to pay back home."`]);
		App.Events.addParagraph(node, [`The singular solution to the two problems is obvious. It's equally obvious that General ${V.peacekeepers.generalName} isn't going to be the one to propose it. He's not stupid.`]);

		const assistCash = 200 * (menialSlaveCost() / 2);
		const choices = [];
		if (V.cash >= assistCash) {
			choices.push(new App.Events.Result(`Offer to assist`, assist, `This will cost ${cashFormat(assistCash)} and provide a number of menial slaves`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the funds to buy the prisoners.`));
		}
		choices.push(new App.Events.Result(`Connect the general with Free Cities pharmaceutical sources`, pharmaceutical));
		choices.push(new App.Events.Result(`Tell him his situation is untenable`, decline));

		App.Events.addResponses(node, choices);

		function assist() {
			const frag = new DocumentFragment();
			App.Events.addParagraph(frag, [`Understanding that the general needs to couch the situation in a way he can justify in public, and perhaps in a way he can justify to himself, you offer to house the prisoners on a contract basis, with immediate payment to the general so he can meet his forces' immediate needs. Naturally, the prisoners will be kept busy while you keep them; menial labor seems appropriate. It's unlikely that the situation will ever stabilize to the point where they can be released, so for safety, they should all be detained indefinitely. And of course, each prisoner's individual detention will be available for resale. Just like any other slave's.`]);
			V.peacekeepers.attitude += 5;
			V.menials += 200;
			cashX(-assistCash, "peacekeepers");
			App.Events.addParagraph(frag, [`The general is unable to keep from smiling slightly when he hears that you understand perfectly and are willing and able to assist. There's some bitterness there, but not much. The two of you adjust the terms. The new menial slaves will be delivered immediately, several hundred of them; the general prefers to have this be a one-time transfer. After all, having an ongoing prisoner pipeline between his prisoner pens and the Free City might draw unwanted political attention. For now, he has the funds he needs, not to mention an empty prison camp.`]);
			return frag;
		}

		function pharmaceutical() {
			let r = [];
			if (V.cash < 100000) {
				r.push(`Unfortunately, you lack the funds to buy the prisoners.`);
			}
			r.push(`It would be very expensive to provide the general with the kind of money necessary to make a difference in the medical supply situation of a military force sufficient to keep what used to be a small country pacified. You express your regrets at your inability to help directly. You offer to connect the general with Free Cities pharmaceutical resources that will probably be able to get him what his infirmaries need at a lower price. "Interesting," he says, considering the offer. "The usual providers at home will scream bloody murder when it gets out. But it's a good idea," he admits. "Though that does nothing for the prison camps." Part of his reluctance is probably due to an unspoken hesitation to do business with the Free Cities directly. But he's coming around.`);
			V.peacekeepers.attitude += 5;
			return r;
		}
		function decline() {
			V.peacekeepers.attitude -= 10;
			repX(5000, "event");
			return `You decide to use this as an object lesson in the limits of old world power projection, and tell his situation is untenable and that he should withdraw. If he doesn't have the political firepower necessary to get proper support and supply, he's better off cutting his losses. "That's not for you to say," he responds bitterly. "And that's not for me to say, either. I still go where I'm told and do what I'm told. Thank you for your time." He ends the call brusquely. Word of your verbal defense of the Free City's sphere of influence gets around, greatly improving your reputation.`;
		}
	}
};


code:
App.Events.PPeacekeepersIndependence = class PPeacekeepersIndependence extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => App.Events.effectiveWeek() > 75,
			() => V.peacekeepers.state === 2 && V.peacekeepers.strength < 50,
			() => V.rival.state <= 1 || V.rival.state > 2,
		];
	}

	execute(node) {
		let r = [];

		V.nextButton = "Continue";
		V.peacekeepers.state = 3;
		V.peacekeepers.strength = -10;

		r.push(`General ${V.peacekeepers.generalName} contacts you again, looking more tired and battered than ever. There's a strange light in his eyes, though, as though he's resolved to make a big bet. And once he starts speaking, it turns out that he is. "${PlayerName()}," he says,`);
		if (V.peacekeepers.attitude > 10) {
			r.push(`"you've been supportive of my peacekeeping mission here in the past.`);
		} else {
			r.push(`"I understand your attitude towards my peacekeeping mission here must be mixed.`);
		}
		r.push(`But all that's about to change." He straightens up, falling back on a military bearing. "The support — funding, supply, everything — for my men and women here is ending, effective now. Right now, in fact. I'm not sure how I'm going to get everyone home." He looks through the video feed at you.`);

		App.Events.addParagraph(node, r);
		App.Events.addParagraph(node, [`"If we're going home."`]);
		App.Events.addParagraph(node, [`"The world's changed," he continues. "Or maybe it's gone back to the way it used to be. There's nothing for my people back home but discharge and unemployment. If they're lucky. It's too much to ask good men and women, good, armed, men and women, to do that. Not when we already control what used to be a nation, right here." He gestures around him, probably indicating maps you can't see. "We're already the government here. It's a battered, war-torn country, but it's a country. If I start levying taxes here, it'll keep my men and women fed. And clothed. And in something like the status they deserve." And, he does not need to add, General ${V.peacekeepers.generalName} will be a powerful warlord.`]);
		App.Events.addParagraph(node, [`"But," he says. "But. This is going to be difficult. I can't be sure I'll succeed. As for me, I'd take the chance and be damned, just for the chance to tell the politicians back home what they can do with their orders. But there's my men and women. They'll do what I ask, but I won't ask it of them without a good, solid chance." His eyes narrow. "I need funding, and I need it now. I can't offer anything in return, not right away. But I pay my debts. And we'll be a buffer between external threats and the Free City. And finally, any resentment about old world power in the area among your people will be wiped away overnight."`]);

		const smallAid = 100000;
		const generousAid = 250000;
		const choices = [];
		if (V.cash >= smallAid) {
			choices.push(new App.Events.Result(`Provide immediate assistance`, assistance, `This will cost ${cashFormat(smallAid)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the ¤ to make any meaningful contribution.`));
		}
		if (V.cash >= generousAid) {
			choices.push(new App.Events.Result(`Deliver generous aid`, generous, `This will cost ${cashFormat(generousAid)}`));
		}
		choices.push(new App.Events.Result(`Decline to support him`, decline));

		App.Events.addResponses(node, choices);

		function assistance() {
			const frag = new DocumentFragment();
			cashX(-smallAid, "peacekeepers");
			V.peacekeepers.strength = 50;
			V.peacekeepers.attitude += 5;
			V.peacekeepers.undermining = 0;
			V.fcnn.push("...asking: how many will follow the precedent set by the peacekeeping force in...");
			App.Events.addParagraph(frag, [`You immediately wire General ${V.peacekeepers.generalName} ${cashFormat(smallAid)}, not an impressive sum by Free Cities standards, but probably enough to turn the scales in his plans to keep his force together as it transitions from old world peacekeeping to autocratic nation building. Soon enough, he'll be able to support his men and women through armed extortion, the original form of taxation and, arguably, the only form of taxation.`]);
			App.Events.addParagraph(frag, [`"You have my thanks," he says formally. "We'll be in control here soon enough. The one thing we'll have an almost limitless supply of is people. I don't think anyone's likely to notice a few menial slaves transferred into the Free City. I'm sure a regular trade already exists; we'll just be adding a few undesirables to it." He ends the call, looking determined. Despite his confidence, he has his work cut out for him.`]);
			return frag;
		}

		function generous() {
			const frag = new DocumentFragment();
			cashX(-generousAid, "peacekeepers");
			V.peacekeepers.strength = 50;
			V.peacekeepers.attitude += 25;
			V.peacekeepers.undermining = 0;
			V.fcnn.push("...asking: how many will follow the precedent set by the peacekeeping force in...");
			App.Events.addParagraph(frag, [`You immediately wire General ${V.peacekeepers.generalName} ${cashFormat(generousAid)}, enough to keep his force together through the critical period as it transitions from old world peacekeeping to autocratic nation building. Soon enough, he'll be able to support his men and women through armed extortion, the original form of taxation and, arguably, the only form of taxation.`]);
			App.Events.addParagraph(frag, [`"That's extremely generous of you," he says, with an undertone of relief. "This is going to go much more smoothly than I'd originally thought. And I see that we're going to have friends and allies out here, as we establish ourselves. We're going to have quite a few undesirables to rid ourselves of, here, and the menial slave trade between this area and the Free City seems like an opportune way to do that." He ends the call, looking confident.`]);
			return frag;
		}

		function decline() {
			return `You inform General ${V.peacekeepers.generalName} that you will not be providing assistance. He does not falter, but he looks suddenly older, as though the prospect of a decisive strike was giving him the strength to carry on. He expresses his regrets dully, and then ends the call.`;
		}
	}
};


code:
App.Events.PPeacekeepersInfluence = class PPeacekeepersInfluence extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.peacekeepers.state === 3 && V.peacekeepers.strength >= 50,
			() => V.peacekeepers.influenceAnnounced === 0,
		];
	}

	execute(node) {
		V.nextButton = "Continue";

		V.peacekeepers.influenceAnnounced = 1;

		App.Events.addParagraph(node, [`General ${V.peacekeepers.generalName} has successfully declared his independence from his mother country. That nation recruited, trained, and commanded him and all his men and women, but then it sent him to keep the peace in a war-torn region, failed to give him the support he needed, and then tried to withdraw him when the costs of what support they were willing to send overtopped what weak political will the old world still has. In truth, it was only a half-step from peacekeeping force to government for General ${V.peacekeepers.generalName} and his troops. They were already the only source of public order in that area.`]);
		let r = [];
		r.push(`You provided money to General ${V.peacekeepers.generalName} to help him through this difficult time of transition, making him an investment of yours. That investment has already shown a small return; the first regular tribute of slaves arrived this week, free of charge. General ${V.peacekeepers.generalName} seems determined to pay his debts properly, and he sent you good stock, healthy menials ready for`);
		if (V.menials) {
			r.push(`work${(V.Sweatshops) ? `. They're already toiling away in ${V.arcologies[0].name}'s sweatshops` : ``}.`);
		} else {
			r.push(`resale.`);
		}
		r.push(`Even better, it seems you can expect to receive a similar shipment in perpetuity. The number of downtrodden people living in the ruins of a small country dwarfs even a Free City's appetite for slaves.`);

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

		r.push(`As you review intelligence from the area at your desk,`);
		if (V.assistant.personality > 0) {
			const {
				HeA, HisA,
				heA, hisA, himA, girlA, himselfA, womanA, loliA
			} = getPronouns(assistant.pronouns().main).appendSuffix("A");
			r.push(`${V.assistant.name}'s avatar pops up.`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`The little monster ${girlA} toys with ${hisA} tentacle hair until you give ${himA} your attention. When ${heA} sees that ${heA} has it, ${heA} wiggles ${hisA} hips at you, and gives you a wink.`);
					break;
				case "shemale":
					r.push(`The slutty little shemale pops up, literally, bouncing upward buoyantly in a way that makes ${hisA} boobs jiggle ridiculously and ${hisA} cock slap wetly against ${hisA} stomach.`);
					break;
				case "schoolgirl":
					r.push(`The slutty little school ${girlA} pops up, literally, bouncing upward so violently that ${hisA} skirt flies up and exposes everything. ${HeA} flips it back down with a giggle.`);
					break;
				case "goddess":
					r.push(`The beautiful, gravid goddess appears with ${hisA} usual wash of radiant golden light, and gently smoothens one of ${hisA} long tresses with a soft hand until ${heA} has your attention.`);
					break;
				case "businesswoman":
					r.push(`The stacked business ${womanA} appears hugging a tablet to ${hisA} generous bosom, squashing ${hisA} cleavage upward and indicating that ${heA} has important information for you.`);
					break;
				case "amazon":
					r.push(`The ferocious little warrior ${womanA} stands up straight, cutely muscular and full of self-importance, as though ${heA} has something ${heA}'d like to share.`);
					break;
				case "fairy":
					r.push(`The little fairy appears on your table, flailing around while ${hisA} body lights up. ${HeA} bends over and starts slapping ${hisA} butt at you and giggling. ${HisA} slapping turns into groping, and ${heA} gets lost in molesting ${hisA} own ass. Clearing your throat, ${heA} looks upside down between ${hisA} legs and sees that ${heA} finally has your attention.`);
					break;
				case "pregnant fairy":
					r.push(`The little fairy appears on your table, leaning towards you and squishing ${hisA} breasts together to show off ${hisA} cleavage. You completely fail to notice ${himA}. ${HeA} tries again, turning around and bending over and shaking ${hisA} butt while looking back at you. Yet again ${heA} fails to draw your attention. Frustrated, ${heA} sits on the table, spreading ${hisA} legs and showing off ${hisA} pussy. Peeking over ${hisA} swollen belly, ${heA} sees that you're not even looking at ${himA}. ${HisA} tiny body is just too small to garner your attention. It's not for a few minutes until you notice ${himA} sitting up on the desk, looking away with ${hisA} arms crossed and pouting.`);
					break;
				case "hypergoddess":
					r.push(`The beautiful, massively gravid goddess appears with ${hisA} usual wash of radiant golden light, and gently calms ${hisA} squirming occupants until ${heA} has your attention.`);
					break;
				case "loli":
					r.push(`The cute little ${loliA} pops up, literally, bouncing upward again and again until ${heA} is absolutely certain ${heA} has your attention.`);
					break;
				case "preggololi":
					r.push(`The slutty little ${loliA} appears bent over flashing ${hisA} pregnant pussy at you. ${HeA} giggles and straightens up once ${heA} is absolutely certain you've given ${hisA} moist cleft enough attention.`);
					break;
				case "angel":
					r.push(`The beautiful angel appears in ${hisA} usual wash of radiant white light and gently folds ${hisA} wings behind ${himA} as ${heA} patiently awaits your attention.`);
					break;
				case "cherub":
					r.push(`The cute little cherub appears in ${hisA} usual wash of radiant white light and flutters around until ${heA} has your attention.`);
					break;
				case "incubus":
					r.push(`The hung sex demon pops up, bouncing upward buoyantly in a way that makes ${hisA} erect cock slide along ${hisA} stomach. Stimulation just enough, ${heA} blows a huge load across your desk while moaning lewdly; ${heA} knows how to get your attention.`);
					break;
				case "succubus":
					r.push(`The slutty little sex demoness pops up.`);
					switch (V.assistant.fsAppearance) {
						case "paternalist":
							r.push(`"${V.PC.slaveName}, would you help me with this zipper?"`);
							break;
						case "degradationist":
							r.push(`"${V.PC.slaveName}, what do you think of these piercings?"`);
							break;
						case "physical idealist":
							r.push(`"${V.PC.slaveName}, bet you I can lift this!"`);
							break;
						case "hedonistic decadence":
							r.push(`"${V.PC.slaveName}, is there food on my face?"`);
							break;
						case "repopulation focus":
							r.push(`"${V.PC.slaveName}, my water broke."`);
							break;
						case "gender radicalist":
							r.push(`"${V.PC.slaveName}, do you think`);
							if (V.arcologies[0].FSGenderRadicalistLawFuta === 3) {
								r.push(`my ass could be bigger?"`);
							} else {
								r.push(`this outfit makes me look too girly?"`);
							}
							break;
						case "gender fundamentalist":
							r.push(`"${V.PC.slaveName}, would I make a good mother?"`);
							break;
						case "asset expansionist":
							r.push(`"${V.PC.slaveName}, I feel like my breasts got smaller, what do you think?"`);
							break;
						case "transformation fetishist":
							r.push(`"${V.PC.slaveName}, how do you think these implants would look in me?"`);
							break;
						case "pastoralist":
							r.push(`"Oh ${V.PC.slaveName}, I'm so backed up. Would you give me a hand?"`);
							break;
						case "slimness enthusiast":
							r.push(`"${V.PC.slaveName}, do`);
							if (V.arcologies[0].FSSlimnessEnthusiastLaw === 1) {
								r.push(`these look bigger to you?"`);
							} else {
								r.push(`you think they're getting bigger?"`);
							}
							break;
						case "slave professionalism":
							r.push(`"Hey ${V.PC.slaveName}, what's most useful when it's long and hard? An education, of course!"`);
							break;
						case "petite admiration":
							r.push(`"${V.PC.slaveName}, I think I grew a little."`);
							break;
						case "statuesque glorification":
							r.push(`"${V.PC.slaveName}, are these heels long enough?"`);
							break;
						default: r.push(`${HeA} spasms with a powerful orgasm and moans lewdly and loudly.`);
					}
					r.push(`${HeA} knows just how to get your attention.`);
					break;
				case "imp":
					r.push(`The scandalous little imp swoops into view and eagerly stares at you, as if ${heA} has some juicy gossip to tell you.`);
					break;
				case "witch":
					r.push(`The cute little witch pops up, before blushing and undressing. An important message for you is scrawled across ${hisA} skin.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`Your shapeshifting assistant pops out of a crack on your desk, ${hisA} belly swollen with something. ${HeA} bends over and pushes out information for you, though you're not sure how.`);
					break;
				default:
					r.push(`The round symbol pulses brightly, ${hisA} way of indicating that ${heA} has important information for you.`);
			}
			r.push(`"General ${V.peacekeepers.generalName}'s men and women are using sex slaves," ${heA} reports, and brings up a trove of surveillance data to back up ${hisA} assertion. "It was unofficial at first,`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`just people with weapons in their hands doing what people with power over others do," ${heA} explains approvingly, showing ${hisA} fangs.`);
					break;
				case "shemale":
					r.push(`just hot guys sticking their dicks in the local girls," ${heA} explains, masturbating openly.`);
					break;
				case "schoolgirl":
					r.push(`just boys blowing off a little steam with the local girls," ${heA} explains nastily.`);
					break;
				case "goddess":
					r.push(`just the sort of thing men with arms in their hands have been doing to the locals for thousands of years," ${heA} explains.`);
					break;
				case "businesswoman":
					r.push(`normal behavior for soldiers under severe stress in areas with civilians," ${heA} explains, sounding vaguely disapproving of something so uncivilized.`);
					break;
				case "amazon":
					r.push(`just warriors letting off steam with the local girls," ${heA} explains, making it sound like the most natural thing in the world.`);
					break;
				case "fairy":
					r.push(`just some boys and girls doing those bedroom sports for indoor types" ${heA} explains.`);
					break;
				case "pregnant fairy":
					r.push(`just some guys having fun with those bigger girls" ${heA} explains, sounding annoyed for some reason.`);
					break;
				case "hypergoddess":
					r.push(`just the boys trying to make sure they have someone to carry on their legacy, I'm sure," ${heA} states hopefully.`);
					break;
				case "loli":
					r.push(`just wrestling and dancing," ${hisA} innocence shining through ${hisA} explanation.`);
					break;
				case "preggololi":
					r.push(`just the guys enjoying some fresh young girls," ${heA} says with a hint of jealousy.`);
					break;
				case "angel":
					r.push(`just the strong taking what they want without consideration," ${heA} sighs, sounding disapproving of something so uncivilized.`);
					break;
				case "cherub":
					r.push(`simply the satisfaction of one's urges," ${heA} says with disappointment.`);
					break;
				case "incubus":
					r.push(`just men enjoying new holes," ${heA} explains, masturbating openly.`);
					break;
				case "succubus":
					r.push(`just seductresses doing what they do," ${heA} explains, masturbating openly.`);
					break;
				case "imp":
					r.push(`just the victors enjoying the spoils," ${heA} says, a hint of excitement in ${hisA} voice.`);
					break;
				case "witch":
					r.push(`just soldiers relaxing after a hard day," ${heA} explains.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`just the conquerors using what's theirs," ${heA} explains, making it sound like the most natural thing in the world.`);
					break;
				default:
					r.push(`just the common behavior of troops under severe stress in areas with civilians," ${heA} explains.`);
			}
			r.push(`"But it's spread, and with their independence, General ${V.peacekeepers.generalName} has decided to bring it under control by setting up official slave brothels for his troops. The officer in charge of staffing these doesn't have enough money to pay Free Cities prices, but I've added him to the standard slave sale interface. Selling sex slaves to him at a price General ${V.peacekeepers.generalName}'s people can afford would bring them closer to ${V.arcologies[0].name}."`);
			switch (V.assistant.appearance) {
				case "monstergirl":
					r.push(`${HeA} strokes ${hisA} cocks meaningfully. "Selling them a particularly distinctive, valuable girl might even influence their tastes. Imagine, manipulating an entire army by providing it with skilled whores." ${HeA} shudders.`);
					break;
				case "shemale":
					r.push(`${HeA} strokes ${hisA} cock meaningfully. "Oh, and they could even develop into a regular market if they're sold distinctive, valuable girls. We should totally get them addicted to anal whores." To make ${hisA} meaning perfectly clear, ${heA} sticks out ${hisA} butt and winks ${hisA} lewd little anus.`);
					break;
				case "schoolgirl":
					r.push(`${HeA} flashes ${hisA} breasts, as though to an appreciative crowd. "If we sell them hotties, it'll get them even more used to us," ${heA} says naughtily. "Get them used to Free Cities girls sucking their dicks all the time!"`);
					break;
				case "goddess":
					r.push(`${HeA} caresses ${hisA} pregnancy. "If we sell them some of our best slaves, I'm sure their virtues will win General ${V.peacekeepers.generalName}'s men and women over," ${heA} says confidently. "It'd be like sending some of my own out to love each and every one of them."`);
					break;
				case "businesswoman":
					r.push(`${HeA} fans ${himselfA}, flushing at the possibilities. "Just think, they might develop into a regular, profitable market for sex slaves if they're sent top-quality product at first to build up the brand," ${heA} says huskily, and then climaxes.`);
					break;
				case "amazon":
					r.push(`${HeA} flexes ${hisA} muscles, crossing ${hisA} arms under ${hisA} big breasts and feeling ${hisA} own biceps thoughtfully. "Selling them good stock would make them like us even more, I bet," ${heA} says. "Sharing a good slut around the campfire is a good way to make friends!"`);
					break;
				case "fairy":
					r.push(`${HeA} reaches behind ${himselfA} and starts groping ${hisA} butt again. "If we sell them some super cuties, they'll really love us!" ${heA} giggles as ${heA} gives ${himselfA} a playful slap.`);
					break;
				case "pregnant fairy":
					r.push(`Since ${heA} has your attention now, ${heA} slowly spreads ${hisA} legs and flashes ${hisA} pussy once again. Seeing you watch with interest this time, a small smile creeps up on ${hisA} face. "If we sell them some of our prettier girls, they'll be sure to warm up to us."`);
					break;
				case "hypergoddess":
					r.push(`${HeA} caresses ${hisA} pregnancy. "If we sell them some of our fertile slaves, I'm sure their burgeoning pregnancies will ease them into relying on us," ${heA} says confidently. "Or at least it will result in more slaves later on."`);
					break;
				case "loli":
					r.push(`${HeA} claps excitedly. "If we sell them new friends, then they'll hear from them about how great the Free Cities are and want to become our friends too!" ${heA} says hopefully, eager to meet all the newcomers to the arcology.`);
					break;
				case "preggololi":
					r.push(`${HeA} claps excitedly. "I don't know what they think of lolis, but selling them a few cute little slave girls will surely warm them up to us," ${heA} says, patting ${hisA} belly. "Plus, I'm sure they'll love how tight they are and how much energy they have once you break them in!"`);
					break;
				case "angel":
					r.push(`${HeA} wrings a wing nervously. "If we send them nice girls, we'd be doing a disservice to them by sending them away. But if we don't, how can we be certain that the girls they have will be well cared for? We definitely need to teach them our ways," ${heA} concludes.`);
					break;
				case "cherub":
					r.push(`${HeA} lands and ponders deeply. "We have to show them the right way before they get mislead. Some of our finest girls should help convert them to our ways!"`);
					break;
				case "incubus":
					r.push(`${HeA} strokes ${hisA} cock meaningfully. "Oh, and they could even develop into a regular market if they're sold distinctive, sexy girls. We should totally get them addicted to rape." ${HeA} makes several thrusting motions.`);
					break;
				case "succubus":
					r.push(`${HeA} fingers ${hisA} pussy meaningfully. "Oh, and they could even develop into a regular market if they're sold distinctive, sexy girls. Plus that means more money for you, and less competition for me." ${HeA} winks.`);
					break;
				case "imp":
					r.push(`${HeA} punches ${hisA} fist into ${hisA} palm. "We should sell them sexy, but unbroken, girls. That way they can learn to love breaking slaves into proper sex toys!" ${HeA} shivers with orgasm at the thought.`);
					break;
				case "witch":
					r.push(`${HeA} runs ${hisA} hat through ${hisA} hands. "If we sell them skilled girls, they'll grow closer to us. But we have to be careful not to send them klutzes like me; not everyone finds that adorable." ${HeA} takes the time to mend the rip ${heA} accidentally tore in ${hisA} hat's brim.`);
					break;
				case "ERROR_1606_APPEARANCE_FILE_CORRUPT":
					r.push(`${HeA} ponders deeply. "We could sell them the most loyal girls we have. They'll naturally lead them back to us. And then they are ours to do as we please," ${heA} says smiling deviously.`);
					break;
				default:
					r.push(`${HisA} symbol takes on a rapid succession of pulsating lewd shapes, signifying some of the arcology's better varieties of sex slaves. "If they're sold good product, they may become a reliable market, " ${heA} asserts.`);
			}
		} else {
			r.push(`your personal assistant appears to offer a suggestion. "I have collated data on the use of unofficial sex slaves by General ${V.peacekeepers.generalName}'s forces," it reports. "Despite the high state of readiness of his forces, the use of comfort women seems to have become widespread. Characteristically, the general has responded to this by accepting the new status quo, and is setting up recreation centers to ensure that the practice does not become disruptive. One of his officers has been tasked with obtaining appropriate sex slaves, but does not have sufficient resources to pay Free Cities prices. The purchasing officer may appear as a slave buyer through the standard slave sale interface. It may be possible to influence them by selling them high-quality slaves."`);
		}
		App.Events.addParagraph(node, r);
	}
};


code:
App.Events.PRivalInitiation = class PRivalInitiation extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.rival.state === 3,
			() => !!getSlave(V.rival.ID)
		];
	}

	execute(node) {
		V.rival.state = 5;
		const slave = getSlave(V.rival.ID);
		const {
			He, His,
			he, him, his, himself
		} = getPronouns(slave);
		App.Events.addParagraph(node, [
			`This is a special week, the week of your victory.`,
			App.UI.DOM.slaveDescriptionDialog(slave),
			`awaits your pleasure. You could certainly do to ${him} anything and everything you usually do to your chattel. You could also do something special to mark the occasion.`
		]);
		const choices = [];
		choices.push(new App.Events.Result(`Force ${him} to do a public relations tour with you`, tour));
		choices.push(new App.Events.Result(`Make ${him} orally service your other slaves in public`, serveSlaves));
		if (slave.anus === 0) {
			choices.push(new App.Events.Result(`Break in ${his} asshole and then let the public use it`, breakAss));
		}
		if (slave.balls > 0 && slave.boobs > 300 && V.seeExtreme === 1) {
			choices.push(new App.Events.Result(`Publicly geld ${him}`, geld));
		}
		if (isFertile(slave) && V.seePreg === 1) {
			choices.push(new App.Events.Result(`Let the public impregnate ${him}`, publicImpreg));
		}
		App.Events.addResponses(node, choices);

		delete V.rival.ID;
		function tour() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`Though ${he} hates you with all ${his} heart, ${he} knows better than most what happens to slaves who disobey. So, when you describe your public relations plans to ${him}, ${he} promises to obey before you even get to the threats. ${He} finds ${himself} accompanying you to the arcology's finest establishment in a lovely evening dress. The two of you share an understandably quiet meal, with a growing crowd coming to leer at the defeated slaveowner-cum-slave. At a prearranged signal from you, ${he} stands, quickly strips naked, gets down on`);
			if (hasBothLegs(slave)) {
				r.push(`${his} knees,`);
			} else {
				r.push(`the ground,`);
			}
			r.push(`and`);
			if (V.PC.dick !== 0) {
				r.push(`sucks you off`);
				if (V.PC.vagina !== -1) {
					r.push(`and`);
				}
			}
			if (V.PC.vagina !== -1) {
				r.push(`eats you out`);
			}
			r.push(
				r.pop() + ".",
				`Such public humiliation starts ${him} down the path of <span class="hotpink">obedience,</span> and is the <span class="green">talk of the Free Cities.</span>`
			);
			slave.devotion += 4;
			seX(slave, "oral", V.PC);
			repX(2500, "event", slave);
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function serveSlaves() {
			const frag = new DocumentFragment();
			let r = [];
			const {
				his2, him2,
			} = getPronouns(V.slaves[1]).appendSuffix("2");
			r.push(`${V.slaves[0].slaveName} leads ${him} out into the arcology's largest atrium, forces ${him} to`);
			if (hasBothLegs(slave)) {
				r.push(`${his} knees,`);
			} else {
				r.push(`the ground,`);
			}
			r.push(`and, in full view of the whole arcology, orally rapes someone who was until this week a slaveowner ${himself}. Behind them, ${V.slaves[1].slaveName} is standing ready for ${his2} turn, and all your other slaves stand behind ${him2}. Public opinion is divided; the precedent is universally agreed to be bad, but the punishment is generally thought to be terrible and deserved. Your slaves, however, are almost insufferably pleased with you for forcing ${slave.slaveName}, whom they still view as a slaveowner, to pleasure them.`);
			V.slaves.forEach(s => {
				seX(slave, "oral", s);
				s.devotion += 10;
			});
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function breakAss() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`${slave.slaveName}, who has been fairly dignified up to this point, breaks down when ${he}'s placed in stocks with ${his} ass in the air. ${His} sobs become screams when, for the first time in ${his} life, ${he} feels the burning sensation of a well-lubricated`);
			if (V.PC.dick !== 0) {
				r.push(`cockhead`);
			} else {
				r.push(`strap-on`);
			}
			r.push(`forcing its way past ${his} virgin sphincter. Raping a virgin anus is not a new pleasure for you, but the usual shrieking, struggling and spasming is all the sweeter this time. Half the arcology has used ${his} poor injured butthole by the end of the day; ${he} is learning to fear you, and hates you even more if possible.`);
			slave.devotion -= 4;
			slave.trust -= 5;
			slave.anus = 3;
			seX(slave, "anal", "public", "penetrative", 47);
			repX(2500, "event", slave);
			healthDamage(slave, 10);
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function geld() {
			slave.devotion -= 50;
			slave.trust -= 50;
			slave.balls = 0;
			repX(2500, "event", slave);
			healthDamage(slave, 10);
			return `You announce that since ${slave.slaveName} has spent so much money and effort turning ${himself} into a girl with expensive hormones, you'll take a lower-tech step to bring ${him} further in that regard. An autosurgery is set up in public and the populace is treated to the edifying spectacle of a very large pair of testicles being efficiently removed by the modern surgical art. Unusually, ${he} was not given general anesthesia, but instead given local painkillers and made to watch on a monitor, to ${his} rage and horror. There is applause as the cauterizer seals the surgical site where ${his} massive scrotum used to hang. ${His} cock looks softer already.`;
		}

		function publicImpreg() {
			seX(slave, "vaginal", "public", "penetrative", 47);
			slave.preg = 1;
			slave.pregSource = -2;
			slave.pregKnown = 1;
			slave.pregWeek = 1;
			slave.devotion -= 15;
			slave.pregType = setPregType(slave);
			WombImpregnate(slave, slave.pregType, -2, 1);
			slave.vagina = 3;
			repX(2500, "event", slave);
			return `You announce that since ${slave.slaveName} damaged the arcology, ${he} will be taking a leading role in the reconstruction. ${He} will be doing this by replacing one of the residents killed in the violence — by bearing a new slave, to be conceived collectively. The shame and horror of ${his} future as breeding stock comes home to ${him} as ${he}'s restrained in a chair with ${his} legs spread. Soon, the stream of fluids is running down ${his} thoroughly-fucked pussy and over ${his} anus to pool on the floor beneath ${him}. Modern medical imaging reveals ${his} fertile ovum's last, losing battle against a legion of sperm in real time, and the images are projected on large screens.`;
		}
	}
};