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

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {minAge: 20, maxAge: 36, disableDisability: 1});
		slave.career = "a servant";
		slave.origin = "$He offered $himself for voluntary enslavement after being freed by $his deceased master's next of kin.";
		slave.face = Math.clamp(slave.face+20, -100, 100);
		slave.devotion = random(60, 80);
		slave.trust = random(60, 80);
		slave.intelligence = 100;
		slave.intelligenceImplant = 30;
		setHealth(slave, jsRandom(40, 60), undefined, undefined, 0, 0);
		slave.anus = 2;
		if (slave.vagina >= 0) {
			slave.vagina = 2;
			slave.skill.vaginal = 100;
		} else {
			slave.skill.penetrative = 100;
		}
		slave.weight = random(-10, 10);
		slave.skill.oral = 100;
		slave.skill.anal = 100;
		slave.skill.whoring = 100;
		slave.skill.entertainment = 100;
		slave.skill.combat = 40;
		slave.behavioralFlaw = "none";
		slave.sexualFlaw = "none";

		const {
			He,
			he, him
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = sexSlaveContractCost();
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`This one is from another arcology, which is rather unusual. You are presented with a humble, though clearly well raised, free citizen. ${He} says directly,`);
		r.push(Spoken(slave, `"I'm a slave through and through. I won't waste your time, so long story short, my Master passed away recently and his successor freed me. I was trained to be a slave, I was bred to serve my owner, and now I have no purpose in life. I offer myself to you, please save me from this so-called <i>freedom</i>."`));

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`From the first moment you see ${him}, ${he} is acting the part of an ideal slave. Re-enslaving ${him} is a near effortless affair. As much as ${he} tries to politely conceal it, you can feel the joy radiating off of ${him}.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `From the first moment you see ${him}, ${he} is acting the part of an ideal slave. Even when a purchaser's agent arrives to take ${him} away, you can still feel a sense of joy radiating from ${him}.`;
		}
	}
};


code:
App.Events.recFSSlimnessEnthusiast = class recFSSlimnessEnthusiast extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.FSAnnounced === 1,
		];
	}

	actorPrerequisites() {
		return [];
	}

	get weight() {
		return V.arcologies[0].FSSlimnessEnthusiast > random(1, 100) ? 1 : 0;
	}

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {
			minAge: 25, maxAge: V.retirementAge, ageOverridesPedoMode: 1, disableDisability: 1
		});
		generateSalonModifications(slave);
		slave.origin = "$He offered $himself to you for enslavement because $he felt your arcology was the best place for a $woman of $his appearance.";
		slave.boobs = random(4, 6)*50;
		slave.natural.boobs = slave.boobs;
		slave.weight = -20;
		slave.natural.height = random(160, 200);
		slave.height = slave.natural.height;
		slave.face = random(15, 100);
		slave.butt = random(1, 2);
		slave.lips = 0;
		slave.devotion = random(25, 45);
		slave.trust = random(25, 45);
		slave.career = App.Data.Careers.General.educated.random();
		setHealth(slave, jsRandom(20, 40), undefined, undefined, 0, 0);
		slave.intelligence = random(51, 95);
		slave.intelligenceImplant = 15;
		slave.teeth = "normal";
		slave.pubicHStyle = "waxed";
		slave.underArmHStyle = "waxed";
		slave.behavioralFlaw = "arrogant";

		const {
			His, He,
			his, he, him, himself, woman, girl
		} = getPronouns(slave);
		const {say} = getEnunciation(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = 3000;
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`The call comes in from an unusually well-to-do area. It appears that the aristocratic-looking ${woman} placing the call has fallen on hard times, and is doing the intelligent thing and staying ahead of ${his} creditors by offering ${himself} into slavery. Enslaving ${him} will be costlier than usual, but it seems likely to be worth it. ${He}'s well-spoken and seems both educated and intelligent. Even better, despite being middle-aged, ${he}'s extremely well-preserved, a tall, slim and graceful beauty with a face that must be the envy of ${girl}s half ${his} age. ${He} knows all this ${himself}, and ${say}s,`);
		r.push(Spoken(slave, `"I hear you appreciate a slender ${woman}; if I'm going down into slavery, ${(V.PC.title !== 0) ? "sir" : "ma'am"}, I'd be happy to avoid too many implants. I understand ${V.arcologies[0].name} is a fine place for someone in my situation."`));

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`${He} arrives apologizing for ${his} fine clothing.`);
			r.push(Spoken(slave, `"I'm sorry," ${he} apologizes sadly,`));
			r.push(Spoken(slave, `"but I wanted to wear my best one last time."`));
			r.push(`${He} sighs, squares ${his} shoulders, and visibly steels ${himself}.`);
			r.push(Spoken(slave, `"I'll say as a free ${woman}, since it's my last chance to say anything as a free ${woman}, you're good-looking, for an evil slaveholding oligarch."`));
			r.push(`${He} delivers this last with a little smile on ${his} lips and rich turn of humor in ${his} voice.`);
			r.push(Spoken(slave, `"If we'd met at a nice party last week I might have made a pass at you. I suppose that's beside the point now."`));

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			const frag = new DocumentFragment();
			r = [];
			cashX(cost, "slaveTransfer");
			r.push(`${He} arrives apologizing for ${his} fine clothing.`);
			r.push(Spoken(slave, `"I'm sorry,"`));
			r.push(`${he} apologizes sadly,`);
			r.push(Spoken(slave, `"but I wanted to wear my best one last time."`));
			r.push(`${He} sighs, squares ${his} shoulders, and visibly steels ${himself}. ${He}'s about to declaim something when a purchaser's agent arrives to bundle ${him} off. ${His} face darkens and ${he} mulls something over, probably preparing a really cutting remark, but before ${he} can deliver it the agent fastens a bag over ${his} head and ${he} is heard no more.`);
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};

repo_name: Nithhogg/fc

license: mit


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

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {maxAge: 24, disableDisability: 1});
		generateSalonModifications(slave);
		slave.origin = "$He offered $himself to you for enslavement to escape having plastic surgery foisted on $him.";
		slave.boobs = random(4, 6)*50;
		slave.natural.boobs = slave.boobs;
		slave.weight = -20;
		slave.natural.height = random(160, 200);
		slave.height = slave.natural.height;
		slave.face = random(15, 100);
		slave.butt = random(1, 2);
		slave.lips = 0;
		slave.devotion = random(25, 45);
		slave.trust = random(25, 45);
		setHealth(slave, jsRandom(20, 40), undefined, undefined, 0, 0);
		if (slave.physicalAge >= 12) {
			slave.teeth = "normal";
		}
		slave.pubicHStyle = "waxed";

		const {
			He,
			his, he, him, woman, women
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = 3000;
		const cost = slaveCost(slave) - contractCost;
		const sir = (V.PC.title !== 0) ? `sir` : `ma'am`;
		const {say} = getEnunciation(slave);
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`This call is coming from a public kiosk, which is usually an indication that the person on the other end is a transient individual who has decided to take slavery over homelessness. You are understandably surprised when this turns out to not be the case; the young ${woman} in the video call is reasonably well dressed, so ${his} newfound situation must be exceedingly recent. Without hesitation ${he} immediately asks to be enslaved.`);
		r.push(Spoken(slave, `"My boyfriend wants to turn me into some sort of bimbo,"`));
		r.push(`${he} ${say}s through ${his} tears.`);
		r.push(Spoken(slave, `"I found all the surgery brochures that he hid, ${sir}. But,"`));
		r.push(`and ${he} brings ${his} slender chest, though covered by ${his} top, into view,`);
		r.push(Spoken(slave, `"I don't want to be cut up and filled with plastic. One of my friends told me that you care about a ${woman} with a good figure, ${sir}. I should have never sold myself to that bastard."`));

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`When ${he} arrives, ${he} is the very picture of a young waif out of ${his} depth. It's clear ${he} feels relief and escaping going under the knife, but ${he} knows enough about the Free Cities to know that ${he}'s likely to buy ${his} presence here through long years of sexual labor.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `When ${he} arrives, ${he} is the very picture of a young waif out of ${his} depth. It's clear ${he} feels relief and escaping going under the knife, but ${he} knows enough about the Free Cities to know that ${he}'s likely to buy ${his} presence here through long years of sexual labor. A purchaser's agent appears to take ${him} away, and ${he} quietly asks who's bought ${him}. A citizen, you tell ${him}, who prefers his ${women} slender and unimplanted. ${He} seems relieved by this.`;
		}
	}
};


code:
App.Events.recFSStatuesqueGlorification = class recFSStatuesqueGlorification extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.FSAnnounced === 1,
		];
	}

	actorPrerequisites() {
		return [];
	}

	get weight() {
		return V.arcologies[0].FSStatuesqueGlorification > random(1, 100) ? 1 : 0;
	}

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {disableDisability: 1});
		generateSalonModifications(slave);
		slave.origin = "$He offered $himself for voluntary enslavement to avoid being singled out by ruthless slavers.";
		slave.natural.height = random(200, 264);
		slave.height = Height.forAge(slave.natural.height, slave);
		setHealth(slave, jsRandom(20, 40), undefined, undefined, 0, 0);
		slave.geneticQuirks.gigantism = 2;
		slave.devotion = random(15, 20);
		slave.trust = random(0, 10);
		const {
			He,
			his, he, him, girl
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = sexSlaveContractCost();
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`This one, unusually, is voice-only. The caller explains why in a painfully quiet voice: slavers have been scoping out the area for prime catches and, as a genetic giant, ${he} knows they'll be gunning for ${him}. The mixed notes of despair, apathy, and fear in ${his} voice are heartrending, even to you. ${He} begs you to make the necessary arrangements to enslave ${him}. ${He}'s heard about you and how you like tall ${girl}s, and ${he}'s also heard about brothels and arcades. There is very little hope discernible in ${his} tone or the pictures ${he} sends you.`);
		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`When ${he} arrives, ${he} is the very picture of someone out of ${his} depth. It's clear ${he} feels some relief over not being at the mercy of the slavers, but ${he} knows enough about the Free Cities to know that ${he}'s likely to buy ${his} presence here through long years of sexual labor.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			const frag = new DocumentFragment();
			r = [];
			cashX(cost, "slaveTransfer");
			r.push(`When ${he} arrives, ${he} is the very picture of someone out of ${his} depth. It's clear ${he} feels some relief over not being at the mercy of the slavers, but ${he} knows enough about the Free Cities to know that ${he}'s likely to buy ${his} presence here through long years of sexual labor. A purchaser's agent appears to take ${him} away, and ${he} quietly asks who's bought ${him}. A breeder, you tell ${him}, who plans to breed the ideal line of giants.`);
			if (slave.dick > 0) {
				r.push(`${He}'ll be the center of ${his} own little harem for as long as ${he} can keep them swollen with children.`);
			} else {
				r.push(`${He}'ll probably manage 20 pregnancies or so before ${he}'s retired, but during that time ${he}'ll be pampered, if not a little sore.`);
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


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

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {disableDisability: 1});
		slave.origin = "$He offered $himself for voluntary enslavement knowing $he would only fit in with your help.";
		slave.natural.height = 165;
		slave.height = Height.forAge(slave.natural.height, slave);
		setHealth(slave, jsRandom(20, 40), undefined, undefined, 0, 0);
		slave.shoes = "extreme heels";
		slave.devotion = random(30, 45);
		slave.trust = random(-20, 0);

		const {
			He,
			his, he, him, himself, girl
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = sexSlaveContractCost();
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`This one is interesting, even by the standards of messages from people who want to become slaves. The individual is neither sick nor abused, and speaks with directness.`);
		r.push(Spoken(slave, `"I'm going to be out of a home by the end of the week and more than likely falling into slavery not long after,"`));
		r.push(`${he} sighs.`);
		r.push(Spoken(slave, `"And, well, I heard you like tall ${girl}s and ${V.arcologies[0].name} can be lenient when it comes to high heels pushing people over the height threshold, so I was hoping you'd take pity on a ${girl} down on his luck even though ${he}'s not quite up to standards."`));

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`When ${he} arrives, ${he} is the very picture of someone in over ${his} head. The only thing separating ${him} from ridicule is a pair of high heels; a fact ${he} is very aware of as ${he} struggles with doubts through the enslavement process.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `When ${he} arrives, ${he} comes directly to your penthouse for enslavement. ${He} wears an expression of doubt, fear, and wonder as ${he} takes in the sights and sounds of the magnificent beast that is the new society taking shape in ${V.arcologies[0].name}. A purchaser's agent arrives to take charge of ${him}, and ${he} asks politely who bought ${him}. A man with a means to fix ${his} height issue, you tell ${him}. ${He} should be able to walk again within a year, assuming the surgery is a success. ${He} shudders at the concept and steels ${himself}; not everyone has access to the high end technology you do after all.`;
		}
	}
};


code:
App.Events.recFSSubjugationist = class recFSSubjugationist extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.FSAnnounced === 1,
		];
	}

	actorPrerequisites() {
		return [];
	}

	get weight() {
		return V.arcologies[0].FSSubjugationist > random(1, 100) ? 1 : 0;
	}

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {
			minAge: 18, maxAge: 42, disableDisability: 1, race: V.arcologies[0].FSSubjugationistRace
		});
		generateSalonModifications(slave);
		slave.origin = "$He was beaten, sexually assaulted, and finally enslaved for being stupid enough to visit an arcology that doesn't like $his kind.";
		setHealth(slave, jsRandom(-80, -60), jsRandom(20, 30), jsRandom(0, 10), Math.max(normalRandInt(1, 0.5), 0), jsRandom(40, 90));
		slave.trust = random(-45, -25);
		slave.devotion = random(-75, -65);
		slave.anus = random(1, 2);
		const {
			his, he, him
		} = getPronouns(slave);
		const {hisA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = 1000;
		const cost = slaveCost(slave) - contractCost;
		if (V.arcologyUpgrade.drones > 0) {
			r.push(`Your security drones`);
		} else {
			r.push(`Security guards in your employ`);
		}
		r.push(`break up a minor disturbance on the lowest, poorest levels of the arcology without needing your direction, or indeed without even informing you. ${capFirstChar(V.assistant.name)} is good enough at filtering incidents down to what you need to know that you typically leave minor things to ${hisA} discretion. This time ${V.assistant.name} only informs you once it's apparent that that brawl left someone injured and unconscious.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`It seems the violence was racially motivated. The ${V.arcologies[0].FSSubjugationistRace} victim was publicly sodomized and left bruised and bleeding, ${his} clothes torn off, beaten into insensibility, with anti-${V.arcologies[0].FSSubjugationistRace} slogans written crudely across ${his} ${slave.skin} skin. It seems ${he} came into the arcology despite the strong penalties for free ${V.arcologies[0].FSSubjugationistRace} subhumans found here. You can easily enslave ${him} in return for ${his} medical costs, though no one is likely to object to your enslaving one of ${his} kind, whatever the situation.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`The enslavement process is disappointingly quiet, since ${he}'s still unconscious. As of this morning ${he} was one of the last free ${V.arcologies[0].FSSubjugationistRace} people in the arcology. Now ${he}'s simply the newest sex slave of the inferior race to take ${his} proper place.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `The purchasing agent is businesslike, even hurried. The inert slave receives a simple check, with some industrious fingering of orifices, and is bundled off. As is appropriate.`;
		}
	}
};


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

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {maxAge: 42, disableDisability: 1, race: V.arcologies[0].FSSubjugationistRace});
		generateSalonModifications(slave);
		slave.origin = "$He came to your arcology to be enslaved out of a sense of self-loathing for $his kind.";
		setHealth(slave, jsRandom(-40, 0), undefined, undefined, 0, 0);
		slave.trust = random(-25, -15);
		slave.devotion = random(-45, -25);
		slave.anus = random(1, 2);

		const {
			He,
			his, he, him
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = 1000;
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`The caller is ${V.arcologies[0].FSSubjugationistRace}, and a particularly self-hating one at that. It seems ${he} came into the arcology despite the strong penalties for free ${V.arcologies[0].FSSubjugationistRace} subhumans found here in order to seek enslavement, a curious turn of events. You can easily enslave ${him}; no one is likely to object to your enslaving one of ${his} kind, especially when ${he} came so willingly.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`The enslavement process is disappointingly quiet, since ${he} does little more than stare blankly ahead and respond to any orders. As of this morning ${he} was one of the last free ${V.arcologies[0].FSSubjugationistRace} people in the arcology. Now ${he}'s simply the newest, and perhaps most willing, sex slave of the inferior race to take ${his} proper place.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `The enslavement process is disappointingly quiet, since ${he} does little more than stare blankly ahead and respond to any orders. As of this morning ${he} was one of the last free ${V.arcologies[0].FSSubjugationistRace} people in the arcology. Now ${he}'s simply the newest, and perhaps most willing, sex slave of the inferior race to take ${his} proper place. ${He}'s taken away by a purchasing agent soon after.`;
		}
	}
};


code:
App.Events.recFSSupremacist = class recFSSupremacist extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.FSAnnounced === 1,
		];
	}

	actorPrerequisites() {
		return [];
	}

	get weight() {
		return V.arcologies[0].FSSupremacist > random(1, 100) ? 1 : 0;
	}

	execute(node) {
		let r = [];
		const pram = {disableDisability: 1};
		if (V.arcologies[0].FSSubjugationistRace !== 0) {
			pram.race = V.arcologies[0].FSSubjugationistRace;
		} else {
			const races = App.Utils.getRaceArrayWithoutParamRace(V.arcologies[0].FSSupremacistRace);
			pram.race = races.random();
		}
		const slave = GenerateNewSlave(null, pram);
		generateSalonModifications(slave);
		slave.origin = "$He was captured and enslaved in a conflict zone and fenced to you by a mercenary group.";
		slave.devotion -= 40;
		slave.trust = random(-45, -25);
		const contractCost = 1000;
		const cost = slaveCost(slave) - contractCost;
		const {him} = getPronouns(slave);
		r.push(`Ever since you have been steering ${V.arcologies[0].name} towards a belief in ${V.arcologies[0].FSSupremacistRace} supremacy, you've been receiving increasingly useful communications from groups that share your ideals. Many rebel, mercenary, and paramilitary groups active in conflict zones have racial beliefs of one stripe or other, and by taking the ${V.arcologies[0].FSSupremacistRace} side, you've automatically inserted yourself into a worldwide network of like-minded organizations. You receive an urgent communication from one such private military company.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`It seems that they've run into a serious cash flow problem. They may not have liquid assets, but they do have human assets. What they lack is the slaveholding and selling infrastructure to translate the latter into the former. They're interested in fencing some merchandise to you, no questions asked, on a flat fee basis. Included in the message is a slave dossier detailing the piece of human chattel they're offering.`);
		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`A battered VTOL craft arrives at ${V.arcologies[0].name}, broadcasting obviously bogus IFF codes. It seems this mercenary group is playing fast and loose in an attempt to get back on their feet. The aircraft doesn't even touch down on the pad they're directed to: it simply hovers`);
			if (V.showInches === 2) {
				r.push(`six feet`);
			} else {
				r.push(`two meters`);
			}
			r.push(`off the pad for the five seconds it takes to shove a canvas bag that obviously contains a struggling human form out of the side door.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			const frag = new DocumentFragment();
			r = [];
			cashX(cost, "slaveTransfer");
			r.push(`A battered VTOL craft arrives at ${V.arcologies[0].name}, broadcasting obviously bogus IFF codes. It seems this mercenary group is playing fast and loose in an attempt to get back on their feet. The aircraft doesn't even touch down on the pad they're directed to: it simply hovers`);
			if (V.showInches === 2) {
				r.push(`six feet`);
			} else {
				r.push(`two meters`);
			}
			r.push(`off the pad for the five seconds it takes to shove a canvas bag that obviously contains a struggling human form out of the side door. You decide to do the simple thing, and leave the bag where it is. The purchaser's agent can deal with it.`);
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


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

	execute(node) {
		let r = [];
		const pram = {disableDisability: 1};
		if (V.arcologies[0].FSSubjugationistRace !== 0) {
			pram.race = V.arcologies[0].FSSubjugationistRace;
		} else {
			const races = App.Utils.getRaceArrayWithoutParamRace(V.arcologies[0].FSSupremacistRace);
			pram.race = races.random();
		}
		const slave = GenerateNewSlave(null, pram);
		slave.origin = `$He made the mistake of marrying into a ${V.arcologies[0].FSSupremacistRace} neighborhood and was kidnapped then sold to you.`;
		slave.devotion -= 40;
		slave.trust = random(-45, -25);
		const contractCost = 1000;
		const cost = slaveCost(slave) - contractCost;
		const {
			him, woman, wife
		} = getPronouns(slave);
		r.push(`Ever since you have been steering ${V.arcologies[0].name} towards a belief in ${V.arcologies[0].FSSupremacistRace} supremacy, you've been receiving increasingly useful communications from groups that share your ideals. With much of the old world in freefall many groups with particularly vehement racial beliefs are expanding unchecked by the mores of big government, and by taking the ${V.arcologies[0].FSSupremacistRace} side, you've automatically inserted yourself into a worldwide network of like-minded organizations. You receive a communication from one such group.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`It seems that in a man in their town made the mistake of marrying a ${woman} of an undesirable racial background, and this group has stepped in to put an end to such a distasteful union. However, though they may be ruthless vigilantes, they don't consider themselves murderers. They're interested in fencing this former ${wife} to you, no questions asked, on a flat fee basis. Included in the message is a slave dossier detailing the piece of human chattel they're offering.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`A clearly improvised VTOL craft arrives at ${V.arcologies[0].name}, broadcasting an erratic array of IFF codes. It seems this group hasn't quite mastered the intricacies of air travel. The aircraft doesn't seem capable of the delicate feat of landing on the pad it had been directed to: it simply hovers`);
			if (V.showInches === 2) {
				r.push(`six feet`);
			} else {
				r.push(`two meters`);
			}
			r.push(`off the pad for the five seconds it takes to shove a canvas bag that obviously contains a struggling human form out of the side door.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			const frag = new DocumentFragment();
			r = [];
			cashX(cost, "slaveTransfer");
			r.push(`A clearly improvised VTOL craft arrives at ${V.arcologies[0].name}, broadcasting an erratic array of IFF codes. It seems this group hasn't quite mastered the intricacies of air travel. The aircraft doesn't seem capable of the delicate feat of landing on the pad it had been directed to: it simply hovers`);
			if (V.showInches === 2) {
				r.push(`six feet`);
			} else {
				r.push(`two meters`);
			}
			r.push(`off the pad for the five seconds it takes to shove a canvas bag that obviously contains a struggling human form out of the side door. You decide to do the simple thing, and leave the bag where it is. The purchaser's agent can deal with it.`);
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.recFSTransformationFetishist = class recFSTransformationFetishist extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.FSAnnounced === 1,
		];
	}

	actorPrerequisites() {
		return [];
	}

	get weight() {
		return V.arcologies[0].FSTransformationFetishist > random(1, 100) ? 1 : 0;
	}

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {maxAge: 42, disableDisability: 1, race: "nonslave"});
		generateSalonModifications(slave);
		slave.origin = "You received $him from a surgeon who botched an implant operation on $him and needed to get $him out of sight.";
		slave.boobsImplant += random(10, 20)*200;
		slave.boobs += slave.boobsImplant;
		slave.boobsImplantType = "advanced fillable";
		if (slave.boobsImplant / slave.boobs >= 0.90) {
			slave.boobShape = "spherical";
			slave.nipples = "flat";
		} else {
			slave.boobShape = "normal";
			slave.nipples = "tiny";
		}
		slave.areolae = 2;
		slave.buttImplant += random(2, 4);
		slave.buttImplantType = "fillable";
		slave.butt += slave.buttImplant;
		slave.lipsImplant += random(15, 25);
		slave.lips += slave.lipsImplant;
		slave.face = Math.clamp(slave.face+20, -100, 100);
		slave.faceImplant += 40;
		slave.devotion = random(-100, -75);
		slave.trust = random(-45, -25);
		setHealth(slave, jsRandom(-50, -20), normalRandInt(20, 4), normalRandInt(10, 3), 0, 0);
		slave.pubicHStyle = "waxed";
		slave.underArmHStyle = "waxed";
		slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy", "odd");

		const {
			He,
			his, he, him, woman
		} = getPronouns(slave);
		const contractCost = 1000;
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive a message coded urgent from a surgeon who you've hired in the past. You are on the point of opening the a call with a friendly businesslike salutation when you see his haggard, worried face, and change your greeting to one of commiseration and understanding. He pours out his troubles to you in a rush.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`It seems he botched an implant operation on a free ${woman}. ${He}'s still out, and the implants are in successfully, but ${he}'s not too far from dead and will remain so for some time. He needs ${him} out of sight, now. With your pull, you could easily manipulate the financial situation to enslave ${him} and get ${him} out of the doctor's area at the same time. It would be a favor to him, and by the medical records, a favor to you too, once you nurse ${him} back to health. ${He}'s quite the implant queen.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`${He} arrives with various medical devices still attached to ${him}, wrapped up in supportive hospital clothing. Despite this, it's obvious that you've made a good decision. The new tits that got ${him} into this situation are so cartoonish that some of the medical tubing has been hastily routed between them. After a few weeks on curatives and a few more in training, ${he}'ll be ready to bounce those fake boobs up and down as ${he} takes dick.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `The only downside to ${his} condition is that reselling ${him} is utterly anticlimactic. A purchaser's agent arrives and takes charge of ${him}, transferring ${him} to a medical transport bed. He takes ${him} away, and it's done.`;
		}
	}
};


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

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {
			minAge: 32, maxAge: 42, ageOverridesPedoMode: 1, disableDisability: 1
		});
		slave.origin = "$His husband sold $him into slavery to escape his debts.";
		slave.career = "a trophy wife";
		slave.boobsImplant += random(5, 10)*200;
		slave.boobs += slave.boobsImplant;
		slave.boobsImplantType = "fillable";
		if (slave.boobsImplant / slave.boobs >= 0.90) {
			slave.boobShape = "spherical";
			slave.nipples = "flat";
		} else {
			slave.boobShape = "normal";
			slave.nipples = "tiny";
		}
		slave.areolae = 2;
		slave.buttImplant += random(2, 4);
		slave.butt += slave.buttImplant;
		slave.buttImplantType = "normal";
		slave.lipsImplant += random(15, 25);
		slave.lips += slave.lipsImplant;
		slave.face = Math.clamp(slave.face+20, -100, 100);
		slave.faceImplant += 40;
		slave.devotion = random(-100, -75);
		slave.trust = random(-45, -25);
		setHealth(slave, jsRandom(20, 60), normalRandInt(10, 3), normalRandInt(10, 3), 0, 20);
		slave.pubicHStyle = "waxed";
		slave.behavioralFlaw = either("anorexic", "arrogant", "bitchy", "odd");

		const {
			His, He,
			his, he, him, himself, wife, woman
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = 1000;
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`The call comes in from an unusually well-to-do area. It appears that an aristocratic-looking man placing the call has fallen on hard times, and is doing the intelligent thing and staying ahead of his creditors by offering his trophy ${wife} into slavery. Enslaving ${him} will be costlier than usual, but it seems likely to be worth it. ${He}'s finely aged and completed worked over under a surgeon's knife. ${He}'s quite the implant queen, in fact.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`${He} arrives unapologetically in ${his} fine clothing.`);
			r.push(Spoken(slave, `"I'm not sorry,"`));
			r.push(`${he} says harshly,`);
			r.push(Spoken(slave, `"but I'm wearing my best one last time whether you like it or not."`));
			r.push(`Eventually ${he} sighs, squares ${his} shoulders, and visibly steels ${himself}.`);
			r.push(Spoken(slave, `"I'll say as a free ${woman}, since it's my last chance to say anything as a free ${woman}, you're good-looking, for an evil slaveholding oligarch."`));
			r.push(`${He} delivers this last with a little smile on ${his} plush lips and a sense of bitter irony in ${his} voice.`);
			r.push(Spoken(slave, `"If we'd met at a nice party last week I might have made a pass at you. You'd be a better choice than my ex-husband at least."`));

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			const frag = new DocumentFragment();
			r = [];
			cashX(cost, "slaveTransfer");
			r.push(`${He} arrives unapologetically in ${his} fine clothing.`);
			r.push(Spoken(slave, `"I'm not sorry,"`));
			r.push(`${he} says harshly,`);
			r.push(Spoken(slave, `"but I'm wearing my best one last time whether you like it or not."`));
			r.push(`Eventually ${he} sighs, squares ${his} shoulders, and visibly steels ${himself}. ${He}'s about to declaim something when a purchaser's agent arrives to bundle ${him} off. ${His} face darkens and ${he} mulls something over, probably preparing a really cutting remark, but before ${he} can deliver it the agent fastens a bag over ${his} head and ${he} is heard no more.`);
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.recFSYouthPreferentialist = class recFSYouthPreferentialist extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.FSAnnounced === 1,
		];
	}

	actorPrerequisites() {
		return [];
	}

	get weight() {
		return V.arcologies[0].FSYouthPreferentialist > random(1, 100) ? 1 : 0;
	}

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {maxAge: 18, disableDisability: 1});
		generateSalonModifications(slave);
		slave.origin = "$He came to you for enslavement out of desperation, terrified that $he was about to be enslaved into a worse situation by $his abusive family.";
		setHealth(slave, jsRandom(-40, 30), undefined, undefined, 0, 70);
		slave.devotion = random(10, 15);
		slave.trust = random(-55, -75);
		slave.birthWeek = 0; // turns {age} this week
		slave.behavioralFlaw = either("anorexic", "devout", "gluttonous", "hates men", "hates women", "odd");
		slave.sexualFlaw = either("apathetic", "hates anal", "hates oral", "repressed", "shamefast");

		const {
			He,
			his, he, him, girl
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = sexSlaveContractCost();
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`This one, unusually, is voice-only. The caller explains why in a painfully quiet voice: ${he}'s turning ${slave.actualAge} in the next few days, and ${he}'s fairly certain ${his} family is about to sell ${him} into slavery. The mixed notes of despair, apathy, and fear in ${his} voice are heartrending, even to you. ${He} begs you to make the necessary arrangements to enslave ${him}. ${He}'s heard about you and how you like young ${girl}s, and ${he}'s also heard about brothels and arcades. There is very little hope discernible in ${his} tone or the pictures ${he} sends you.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`Your slaving network gets ${him} out of ${his} difficult situation without trouble, forwarding ${him} the necessary travel documents. When ${he} arrives, ${he} displays the clear signs of someone who has learned to avoid abuse: ${he} takes no initiative and does nothing without instructions, just standing dumbly until ordered; when told what to do, ${he} does it quickly and carefully. Though ${his} mind is not broken, there is something dead lurking in ${his} eyes. When ${he} looks at you, it is with the watchful caution of an abused animal.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `Your slaving network gets ${him} out of ${his} difficult situation without trouble, forwarding ${him} the necessary travel documents. When ${he} arrives, ${he} displays the clear signs of someone who has learned to avoid abuse: ${he} takes no initiative and does nothing without instructions, just standing dumbly until ordered; when told what to do, ${he} does it quickly and carefully. When a buyer's agent arrives to take ${him} away, ${he} follows him without a backward glance.`;
		}
	}
};


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

	execute(node) {
		let r = [];
		const slave = GenerateNewSlave(null, {
			minAge: 18, maxAge: 18, ageOverridesPedoMode: 1, disableDisability: 1
		});
		generateSalonModifications(slave);
		slave.origin = "$He came to you for enslavement out of desperation, terrified that $he was about to be asked to do something with $his life by $his family.";
		setHealth(slave, jsRandom(-40, 30), 0, 0, 0, jsRandom(20, 40));
		slave.devotion = random(10, 15);
		slave.trust = random(-55, -75);
		slave.intelligence = random(-95, -51);
		slave.anus = random(2, 3);
		slave.weight = random(-80, -20);
		slave.boobs -= 50*random(1, 2);
		slave.butt -= random(0, 1);
		slave.behavioralFlaw = either("anorexic", "gluttonous", "odd");
		slave.sexualFlaw = either("apathetic", "repressed");
		const {
			He,
			his, he, him, girl
		} = getPronouns(slave);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const contractCost = sexSlaveContractCost();
		const cost = slaveCost(slave) - contractCost;
		r.push(`You receive so many messages, as a noted titan of the new Free Cities world, that ${V.assistant.name} has to be quite draconian in culling them. ${HeA} lets only the most important through to you. One category of message that always gets through regardless of content, though, is requests for voluntary enslavement. As the new world takes shape, they've become less rare than they once were.`);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`This one, unusually, is voice-only. The caller explains why in an unusually upbeat voice: ${he} turned 18 a few days ago, and ${he}'s fairly certain ${his} family is expecting ${him} to make something of ${his} life to help support them. The apathy to ${his} family's wishes is readily evident in ${his} tone of voice. ${He} begs you to make the necessary arrangements to enslave ${him}. ${He}'s heard about you and how you like younger ${girl}s, and that you take care of all the decision-making for your slaves. There's a lot of hope in ${his} tone, ${he} clearly wants an escape from responsibility — even if that means becoming a slave.`);

		App.Events.addParagraph(node, r);

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			const frag = new DocumentFragment();
			r = [];
			r.push(`Your slaving network extracts ${him} from ${his} family's grasp easily, forwarding ${him} the necessary travel documents. When ${he} arrives, ${he} displays the clear signs of someone who's never had to think for themselves: ${he} takes no initiative and does nothing without instructions, just standing dumbly until ordered; when told what to do, ${he} does it quickly and carefully. Though ${his} mind is not broken, there's clearly not a lot in there. Being a slave may actually be ${his} most fitting vocation.`);

			r.push(App.UI.newSlaveIntro(slave));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `Your slaving network extracts ${him} from ${his} family's grasp easily, forwarding ${him} the necessary travel documents. When ${he} arrives, ${he} displays the clear signs of someone who's never had to think for themselves: ${he} takes no initiative and does nothing without instructions, just standing dumbly until ordered; when told what to do, ${he} does it quickly and carefully. Though ${his} mind is not broken, there's clearly not a lot in there. Being a slave may actually be ${his} most fitting vocation. When a buyer's agent arrives to take ${him} away, ${he} follows him without a backward glance, clearly unaware of who he is.`;
		}
	}
};


code:
App.Events.JobFulfillmentCenterDelivery = class JobFulfillmentCenterDelivery extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.JFC.order === 1,
			() => V.JFC.reorder !== 1
		];
	}

	execute(node) {
		V.JFC.order = 0;
		App.UI.StoryCaption.encyclopedia = "Enslaving People";
		const slave = generateLeadershipSlave(V.JFC.role, 'Job Fulfillment Center');
		const {
			He,
			he, him
		} = getPronouns(slave);
		const cost = slaveCost(slave) * 6;

		App.Events.addParagraph(node, [
			`A slave dealer has submitted a slave to satisfy your`,
			App.UI.DOM.makeElement("span", V.JFC.role, "bold"),
			`order for ${cashFormat(cost)}.`
		]);

		App.UI.DOM.appendNewElement("span", node, `As usual, the asking price is quite high, to cover training costs. However, you can freely decline the slave should ${he} not meet your standards or the job has already been filled.`, "note");

		node.append(App.Desc.longSlave(slave, {market: "generic"}));

		const choices = [];
		if (V.cash >= cost) {
			choices.push(new App.Events.Result(`Accept the offered slave`, accept));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to accept the offered slave.`));
		}
		choices.push(new App.Events.Result(`Reject and repost this offer`, reject));
		App.Events.addResponses(node, choices);

		function accept() {
			V.JFC = {order: 0, reorder: 0};
			cashX(-cost, "slaveTransfer", slave);

			return [
				`${He} has been very well trained by the dealer that offered ${him} to you. ${He} has also picked up on the fact that ${he} was specially selected, and is a little hopeful that this means ${he} may be treated well. ${He} is now eagerly awaiting your instructions.`,
				App.UI.newSlaveIntro(slave)
			];
		}

		function reject() {
			V.JFC.order = 1;
			V.JFC.reorder = 1;
			return `The current slave is not to your satisfaction. No matter. There are always more slaves.`;
		}
	}
};


code:
App.Events.SEAssholeKnight = class SEAssholeKnight extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => App.Events.effectiveWeek() >= 15,
			() => V.arcologies[0].FSNeoImperialistLaw1 === 1,
			() => V.assholeKnight !== 1
		];
	}

	execute(node) {
		V.assholeKnight = 1;
		V.imperialEventWeek = App.Events.effectiveWeek();

		const assholeKnight = GenerateNewSlave(V.seeDicks > 0 ? "XY" : "XX", {minAge: 22, maxAge: 34, disableDisability: 1});
		assholeKnight.prestige = 1;
		assholeKnight.prestigeDesc = "$He was formerly an Imperial Knight, a highly prestigious position indicating both nobility and exceptional combat prowess. Although $he has had $his coat of arms stripped, many still recognize $him from his former Knighthood.";
		assholeKnight.origin = "$He used to be a Knight within your arcology, until you had $him stripped of $his title and summarily enslaved for cruelly abusing citizens beneath $his stature.";
		assholeKnight.career = "spec ops";
		assholeKnight.devotion = random(-80, -60);
		assholeKnight.muscles = random(50, 75);
		assholeKnight.skill.combat = 100;
		assholeKnight.sexualFlaw = "malicious";
		assholeKnight.behavioralQuirk = "none";
		assholeKnight.trust = random(-30, -20);
		assholeKnight.butt = random(0, 1);
		assholeKnight.natural.height = random(175, 195);
		assholeKnight.height = assholeKnight.natural.height;
		assholeKnight.fetish = "sadist";
		assholeKnight.fetishStrength = 80;
		assholeKnight.preg = 0;
		if (assholeKnight.genes === "XY") {
			assholeKnight.faceShape = "masculine";
			assholeKnight.dick = random(3, 5);
			assholeKnight.balls = random(2, 4);
			assholeKnight.scrotum = assholeKnight.balls;
			assholeKnight.boobs = 150;
		} else {
			assholeKnight.faceShape = "androgynous";
			assholeKnight.vagina = 0;
			assholeKnight.boobs = Math.min(assholeKnight.boobs, 450);
			assholeKnight.natural.boobs = assholeKnight.boobs;
		}
		assholeKnight.accent = random(0, 1);

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

		App.Events.drawEventArt(node, assholeKnight, "Imperial Plate");

		App.Events.addParagraph(node, [`The group of citizens you hand-picked as your Knights have quickly proven themselves a reliable staple of the Arcology. Being visibly a league above the common citizen with their heavy Imperial Plate decorated with glimmering pendants and marks of their individual, flowery coats of arms, their mere presence is enough to make most common criminals cower and keep merchants selling their wares at fair prices. The tenets of neo-Imperial hierarchy and their own social prestige have already gone to their heads, and many Knights are now recognized immediately by the common citizens as heroic, uncowed citizen-soldiers.`]);

		App.Events.addParagraph(node, [`Despite the noble reputations of many of your Knights, their image as defenders of the downtrodden and honest protectors of the Arcology is not universal. Although you Knighted every last one of them yourself, it seems you might have made a misjudgment on the character of one of your new servants; a stream of minor offenses from one Knight in particular has been building up in your inbox for quite some time, and reviewing the whole dossier now paints a portrait of abuses and misconduct.`]);

		App.Events.addParagraph(node, [`This singular Knight has apparently been using ${his} position to extort and bully the populace, demanding unreasonably steep discounts from merchants and regularly beating the peasantry - often for no reason other than momentary amusement, and treating them as "less than even slaves". A number of frustrated citizens have sent you a petition demanding that you denounce and punish ${him} for ${his} petty offenses - a picture of a woman with her face blurred out and a trail of bruises over every inch of her naked body is attached. No names have been attached to the petition, apparently for fear of what the Knight in question will do to them should their attempts be uncovered. Whatever you decide to do with this ${woman} will undoubtedly set the precedent for how you deal with Knights who abuse their station in the future.`]);

		const choices = [];
		choices.push(new App.Events.Result(`Remove ${his} title and confiscate ${his} weapons`, demTitles));
		choices.push(new App.Events.Result(`Have ${him} publicly flogged, then enslaved`, flogMeat));
		choices.push(new App.Events.Result(`Turn a blind eye`, blindInjustice));
		App.Events.addResponses(node, choices);

		function demTitles() {
			repX(2500, "event");
			return `You have the insolent Knight's plate armor confiscated, ${his} apartment seized and ${his} right to bear a coat of arms redacted. The knight is nothing short of utterly furious, but puts up no fight as your guards seize ${his} advanced weaponry; to do so would be suicidal. While ${he} swears revenge against you for taking away ${his} "noble rights", you receive a letter from a relieved merchant thanking you for putting the jumped-up bandit down.`;
		}

		function flogMeat() {
			const frag = new DocumentFragment();
			let r = [];
			r.push(`You have the insolent Knight's gear and weapons confiscated, then publicly flog ${him} in the plaza and announce that ${he}'s to be enslaved for crimes against the people of ${V.arcologies[0].name}. Although the watching peasants are clearly relieved that the cruel bully is off the streets, some of them, those who did not feel the fist of the howling ${woman} on their own neck, recoil somewhat at the sudden brutality against a class that most of them idolize and romanticize.`);
			repX(1000, "event");
			r.push(App.UI.newSlaveIntro(assholeKnight));
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function blindInjustice() {
			cashX(500, "event");
			repX(-2000, "event");
			return `You opt to ignore the abuses of the cruel knight completely. Every few weeks, you receive another pleading message in your inbox about the Knight, until they simply stop coming as the lower class accepts the random abuse of their betters. A few days later, as you socialize with your upper-class, the Knight in question passes you a full envelope and winks with no further explanation.`;
		}
	}
};


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

	/** Custom casting: all bursting slaves are cast automatically. If no slaves are cast, casting fails and the event does not run. */
	castActors() {
		this.actors = getSlaves().filter(s => burstCheck(s)).map(s => s.ID);
		return this.actors.length > 0;
	}

	execute(node) {
		const artRenderer = V.seeImages && V.seeReportImages ? new App.Art.SlaveArtBatch(this.actors, 2, 0) : null;
		if (artRenderer) {
			node.append(artRenderer.writePreamble());
		}

		for (const slave of this.actors.map(id => getSlave(id))) {
			if (slave.womb.length > 0) {
				node.append(birth(slave, {artRenderer}));
			} else if (getPersonalAttention(slave.ID, "torture") && !onBedRest(V.PC, true)) {
				node.append(torture(slave));
			} else if (getPersonalAttention(slave.ID, "ravish") && !onBedRest(V.PC, true)) {
				node.append(ravish(slave));
			} else {
				node.append(pop(slave));
			}
			removeSlave(slave, {dead: true});
			node.append(App.UI.sectionBreak());
		}

		/**
		 *
		 * @param {FC.SlaveState} slave
		 * @returns {DocumentFragment}
		 */
		function pop(slave) {
			const el = new DocumentFragment();
			const r = [];
			const {
				He, His,
				he, his, him
			} = getPronouns(slave);
			if (artRenderer) {
				App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer);
			}
			r.push(`As ${slave.slaveName} is going about ${his} business with ${his} overfilled`);
			if (slave.inflation !== 0) {
				r.push(slave.inflationType);
			}
			r.push(`belly, ${he} can't help but feel exhausted. ${His} health has been poor lately and the pressure in ${his} organs is not helping things. ${He} immediately knows something is wrong when an intense pain runs through ${his} middle and ${his} load shifts threateningly.`);
			if (slave.inflation !== 0) {
				r.push(`Blood and ${slave.inflationType} leak`);
			} else {
				r.push(`Blood leaks`);
			}
			r.push(`from ${his} rear as ${his} body cavity fills with the contents of ${his} digestive tract. The skin of ${his} taut belly reddens as the pressure against it builds. As ${he} takes ${his} last breath, ${he} falls forward, ${his} weight landing upon ${his} straining stomach. With a gush, ${he} ruptures, flooding the area around ${him} with`);
			if (slave.inflation !== 0) {
				r.push(`blood, guts and ${slave.inflationType}.`);
			} else {
				r.push(`blood and guts.`);
			}
			el.append(r.join(" "));
			el.append(horrifiedSlaves(slave));
			return el;
		}

		/**
		 *
		 * @param {FC.SlaveState} slave
		 * @returns {DocumentFragment}
		 */
		function torture(slave) {
			const el = new DocumentFragment();
			const r = [];
			const {
				he, his, him
			} = getPronouns(slave);
			if (artRenderer) {
				App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer);
			}
			r.push(`${slave.slaveName}'s belly is positively bursting`);
			if (slave.inflation !== 0) {
				r.push(`with ${slave.inflationType},`);
			} else {
				r.push(`as is,`);
			}
			r.push(`so it's extra fun to punch and strike at it to see ${his} pained reactions. You land a solid blow to ${his} straining gut and, like the world's worst piñata, ${he} bursts, showering the area around ${him} with`);
			if (slave.inflation !== 0) {
				r.push(`blood, guts and ${slave.inflationType}.`);
			} else {
				r.push(`blood and guts.`);
			}
			r.push(`It seems you'll need a new toy to play with.`);
			el.append(r.join(" "));
			el.append(horrifiedSlaves(slave));
			return el;
		}

		/**
		 *
		 * @param {FC.SlaveState} slave
		 * @returns {DocumentFragment}
		 */
		function ravish(slave) {
			const el = new DocumentFragment();
			const r = [];
			const {
				he, his, him
			} = getPronouns(slave);
			if (artRenderer) {
				App.UI.DOM.drawOneSlaveRight(el, slave, artRenderer);
			}
			r.push(`Fucking ${slave.slaveName} with ${his} overfilled`);
			if (slave.inflation !== 0) {
				r.push(slave.inflationType);
			}
			r.push(`belly bouncing around every which way is a blast, though ${he} begins to wince and groan more than usual as the week nears its end. As you finish up a particularly intense`);
			if (canAchieveErection(V.PC)) {
				r.push(`session by blowing a huge load into ${him}, you notice ${his} belly slowly starting to swell. As you ponder this development with a few extra thrusts to get out that last bit of cum, ${his} middle bursts beneath you, sending you crashing onto ${his} lifeless body from the sudden shift and into a pool of`);
				if (slave.inflation !== 0) {
					r.push(`blood, guts and ${slave.inflationType}.`);
				} else {
					r.push(`blood and guts.`);
				}
				r.push(`That was not what you expected to happen, and you probably shouldn't keep humping what's left of ${him} instead of cleaning up.`);
			} else {
				r.push(`session, you can't help but notice ${his} belly slowly starting to swell; an oddity, given you aren't unloading anything into ${him}. You ponder this development as you shift ${him} into a favorable position for another round, only to have ${his} middle burst on top of you, covering you with a deluge of`);
				if (slave.inflation !== 0) {
					r.push(`blood, guts and ${slave.inflationType}.`);
				} else {
					r.push(`blood and guts.`);
				}
				r.push(`You lay there, stunned and holding ${his} corpse upright over you, dumbfounded by what just happened.`);
			}
			el.append(r.join(" "));
			el.append(horrifiedSlaves(slave));
			return el;
		}
	}
};

/**
 *
 * @param {FC.SlaveState} slave
 * @returns {HTMLElement}
 */
globalThis.horrifiedSlaves = function(slave) {
	const el = document.createElement("p");
	const {his} = getPronouns(slave);
	el.append(`Word of the late slave and ${his} gruesome fate spread fast, `);
	App.UI.DOM.appendNewElement("span", el, "terrifying", "gold");
	el.append(` your untrusting slaves.`);
	for (const bystander of getSlaves().values()) {
		if (bystander.trust <= 50) {
			if (slave.inflation > 0) {
				bystander.trust -= (Math.pow(slave.inflation, 3) * 5);
			} else {
				bystander.trust -= 10;
			}
		}
	}
	return el;
};