code:
/**
 *
 * @param {App.Entity.SlaveState} relative
 * @param {App.Entity.SlaveState} relative2
 * @returns {HTMLElement}
 */
globalThis.newSlaveIncestSex = function(relative, relative2) {
	function incestAction() {
		if (V.event) {
			switch (V.event.eventName) {
				case "Identical Hermaphrodite Pair":
					return "identical hermaphrodite twincest";
				case "Identical Pair":
					return "identical sister twincest";
				case "Twin Brother Incest":
					return "brother-brother twincest";
				case "Twin Sister Incest":
					return "sister-sister twincest";
				case "Twins Mixed Incest":
					return "brother-sister twincest";
				case "Matched Pair":
					return "'sister'-sister twincest";
				default:
					return V.event.eventName.toLowerCase().replace(" ", "-").replace("-incest", " incest");
			}
		} else {
			return "";
		}
	}
	const eventName = incestAction();
	const div = document.createElement("div");
	App.Events.drawEventArt(div, [relative, relative2], "no clothing");
	const {
		he, his, sister
	} = getPronouns(relative);
	const {
		he2, his2,
	} = getPronouns(relative2).appendSuffix("2");

	/* setup identifiers */
	const one = relativeTerm(relative2, relative); // relative is relative2's blank
	const other = relativeTerm(relative, relative2); // relative2 is relative's blank

	let oneLong;
	let otherLong;
	if (one === other) {
		/* two sisters / brothers: identify by age, in the case of same age twins check their birthWeek */
		if (relative.actualAge === relative2.actualAge) {
			if (relative.birthWeek >= relative2.birthWeek) {
				oneLong = `older ${one}`;
				otherLong = `younger ${other}`;
			} else if (relative.birthWeek < relative2.birthWeek) {
				oneLong = `younger ${one}`;
				otherLong = `older ${other}`;
			}
		} else if (relative.actualAge > relative2.actualAge) {
			oneLong = `older ${one}`;
			otherLong = `younger ${other}`;
		} else if (relative.actualAge < relative2.actualAge) {
			oneLong = `younger ${one}`;
			otherLong = `older ${other}`;
		}
	} else {
		oneLong = one;
		otherLong = other;
	}

	/* prepare some text passages based on options */
	const actions = [];
	const secretions = [];
	const genitalsArray = [];
	if (relative.dick === 0 || relative2.dick === 0) {
		/* at least one vagina is present */
		actions.push("clit-flinging tongue-action"); /* TODO: check oral skill of slaves */
		secretions.push("femcum");
		genitalsArray.push("licked wet cunt");
	}
	if (relative.dick !== 0 || relative2.dick !== 0) {
		/* at least one penis is present */
		actions.push("nose-pressed-against-balls deep-throats");/* TODO: check oral skill of slaves */
		secretions.push("semen");
		genitalsArray.push("limp dangling cock");
	}
	const genitals = (genitalsArray.length === 1) ? genitalsArray[0] + "s" : genitalsArray.join(" and ");

	if (V.debugMode) {
		App.Events.addResponses(div, [
			new App.Events.Result(`Debug info`, debug)
		]);
	}

	const choices = [];
	choices.push(new App.Events.Result(`Order them to demonstrate their love for each other`, demonstrate));
	// choices.push(new App.Events.Result(`Show them how cruel life in your arcology can be`, cruel));
	App.Events.addResponses(div, choices);

	return div;

	function demonstrate() {
		const frag = new DocumentFragment();
		let r = [];
		r.push(`Now that you own them, you want to see proof of their love for each other. You order the`);
		if (one === "twin") {
			r.push(`twins`);
		} else if (one === other) {
			r.push(`${sister}s`);
		} else {
			r.push(`${one} and ${other}`);
		}
		r.push(`to perform mutual oral sex in front of you. Hesitantly, they assume the 69 position on your couch. They have either never done this in front of a stranger or have never had sex this way before. You remind them that they are sex slaves now. They need to follow all orders, including sexual ones, so this is a relatively gentle start.`);

		App.Events.addParagraph(frag, r);
		r = [];
		if (one === "twin") {
			r.push(`One ${one}`);
		} else {
			r.push(`The ${oneLong}`);
		}
		r.push(`shows more boldness as ${he} lowers ${his} head towards ${his} ${otherLong}'s privates.`);
		if (relative2.dick === 0) {
			r.push(`Carefully, ${he} spreads ${his} ${other}'s labia. Then ${he} continues to give ${his} ${other}'s exposed pussy a few experimental licks. At first, ${his} efforts seem to be futile, but after a while the ${otherLong}'s clit becomes engorged and ${his2} juices start flowing.`);
		} else {
			r.push(`Uncertain, ${he} grabs ${his}`);
			if (other === "twin") {
				r.push(`${other}'s`);
			} else {
				r.push(`${otherLong}'s`);
			}
			r.push(`penis. Then ${he} puts ${his} ${other}'s flaccid member into ${his} mouth and gives it an experimental suck. At first, ${his} efforts seem to be futile, but after a while the ${otherLong} sports a nice, hard erection.`);
		}
		r.push(`As the ${other}'s arousal grows, ${he2} becomes more eager to please ${his2} ${oneLong}, too. Going down on ${his2} lover's genitals, ${he2} starts to mimic ${his} ministrations.`);
		if ((relative.dick === 0) !== (relative2.dick === 0)) {
			r.push(`Of course, ${he2} has to adapt ${his2} actions`);
			if (relative.dick === 0) {
				r.push(`from the feelings on ${his2} dick to the pussy pressed against ${his2} lips.`);
			} else {
				r.push(`from the feelings at ${his2} pussy to the dick in ${his2} mouth.`);
			}
		}
		App.Events.addParagraph(frag, r);

		App.Events.addParagraph(frag, [`You can tell how uncomfortable they are with you watching them, but as they become increasingly worked up, they lose their inhibitions. Soon, you are watching some fairly enthralling ${eventName} action in your office${(actions.length) ? `, including some enthusiastic ${actions.join(" and ")}`: ``}. Eventually, they bring each other to impressive mutual orgasms. Their lusty moans are muffled only by each other's crotches. Spent, exhausted, and with their faces covered in each other's ${secretions.join(" and ")}, they untangle to rest comfortably on your couch.`]);

		App.Events.addParagraph(frag, [`You indicate them to present themselves to you. Still shaking from the aftershocks of their orgasms, they stand side by side in front of you, panting, naked and with their ${genitals} dripping mixed juices. You simply nod, showing your approval. They are visibly relieved, and not only sexually. They are more confident of having made the right choice in enslaving themselves to you, since you seem trustworthy and sympathetic. They hug again, kissing and licking the sexual fluids off each other's stained faces.`]);

		for (const rel of [relative, relative2]) {
			rel.devotion += 4;
			rel.trust += 4;
		}
		seX(relative, "oral", relative2, "oral");

		return frag;
	}

	function cruel() {
		const frag = new DocumentFragment();
		let r = [];
		// TODO: this needs to be written
		App.Events.addParagraph(frag, r);
		relative.devotion -= 4;
		relative.trust -= 4;
		relative2.devotion -= 4;
		relative2.trust -= 4;
		seX(relative, "oral", relative2, "oral");
		return frag;
	}

	function debug() {
		const frag = new DocumentFragment();
		App.UI.DOM.appendNewElement("h3", frag, `1st relative slave`);
		const rel1 = [
			`${one} (relationship: ${relative.relationship}, ID: ${relative.ID}, relationshipTarget: ${relative.relationshipTarget})`,
			`Age: ${relative.physicalAge}`,
			`Pronouns: ${he} / ${his}`,
		];
		for (const string of rel1) {
			App.UI.DOM.appendNewElement("div", frag, string);
		}
		App.UI.DOM.appendNewElement("h3", frag, `2nd relative slave`);
		const rel2 = [
			`${other} (relationship: ${relative2.relationship}, ID: ${relative2.ID}, relationshipTarget: ${relative2.relationshipTarget})`,
			`Age: ${relative2.physicalAge}`,
			`Pronouns: ${he2} / ${his2}`,
		];
		for (const string of rel2) {
			App.UI.DOM.appendNewElement("div", frag, string);
		}

		return frag;
	}
};


code:
App.Events.recetsAddictMotherDaughter = class recetsAddictMotherDaughter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Addict Mother Daughter`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		let r = [];
		const contractCost = 1000;

		let pram = new GenerateNewSlavePram();
		Object.assign(pram, {
			minAge: V.fertilityAge + V.minimumSlaveAge, maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1, race: "nonslave"
		});
		const mother = GenerateNewSlave("XX", pram);
		mother.origin = "$He sold $himself into slavery to escape addiction debts.";
		mother.career = App.Data.Careers.General.uneducated.random();
		mother.devotion = random(-15, 15);
		mother.trust = random(-15, 15);
		mother.oldDevotion = mother.devotion;
		mother.addict = 8;
		mother.boobs += 100;
		mother.face = -15;
		mother.butt++;
		if (mother.vagina > -1) {
			mother.vagina++;
		}
		mother.anus++;
		setHealth(mother, jsRandom(-60, 20), Math.max(normalRandInt(5, 3), 0), Math.max(normalRandInt(5, 3), 0));
		mother.pubicHStyle = "waxed";
		mother.underArmHStyle = "waxed";
		mother.canRecruit = 0;
		mother.counter.birthsTotal++;
		let cost = slaveCost(mother);
		cost -= 1000;

		const daughter = generateRelatedSlave(mother, "daughter");
		daughter.origin = "You tricked $his mother into selling $him into slavery to clear addiction debts.";
		daughter.intelligenceImplant = 0;
		daughter.career = randomCareer(daughter);
		daughter.slaveName = daughter.birthName;
		daughter.devotion += 10;
		daughter.trust += 10;
		daughter.oldDevotion = daughter.devotion;
		daughter.oldTrust = daughter.trust;

		const {
			He,
			his, he, him, himself
		} = getPronouns(mother);
		const {
			daughter2, he2, his2
		} = getPronouns(daughter).appendSuffix("2");

		App.Events.addParagraph(node, [`A matronly woman comes to your penthouse in tears. It seems ${he} is a tenant of yours, and has fallen deeply into debt as a result of aphrodisiac addiction. ${He} offers to sell ${himself} into slavery if you will pay off ${his} debts. ${He} is strangely eager about this, and after some probing it becomes apparent that ${he} is living with ${his} ${daughter2} and wants to avoid having ${his} ${daughter2} involved in this debt.`]);

		App.Events.addParagraph(node, [`Enslaving ${him} will cost ${cashFormat(contractCost)}. Alternatively, you could sell your rights to ${him}. Including costs, this will bring in ${cashFormat(cost - contractCost)}. As a third option, for ${cashFormat(contractCost * 2)} you could manipulate ${him} to bind both mother and ${daughter2}, but you wouldn't be able to examine the ${daughter2} first.`]);

		const newSlaves = [mother]; /* caller doesn't want relative involved, so you don't get to inspect her even if you can force a sale */

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Accept ${his} proposal and enslave ${him}`, enslave, `This will cost ${cashFormat(contractCost)}`));
			choices.push(new App.Events.Result(`Sell ${him} immediately`, sell, `This will bring in ${cashFormat(cost - contractCost)}`));
			if (V.cash >= (contractCost * 2)) {
				choices.push(new App.Events.Result(`Manipulate ${him} to enslave both mother and ${daughter2}`, both, `This will cost ${cashFormat(contractCost * 2)}`));
			}
		} 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 = [];
			seX(mother, "oral", V.PC, "penetrative");
			newSlave(mother);
			cashX(forceNeg(contractCost), "slaveTransfer", mother);
			r.push(`Despite ${himself}, ${he} sobs with relief when you agree. ${He} offers to`);
			if (V.PC.dick !== 0) {
				r.push(`suck you off`);
				if (V.PC.vagina !== -1) {
					r.push(`and`);
				}
			}
			if (V.PC.vagina !== -1) {
				r.push(`eat you out`);
			}
			r.push(`while you complete the necessary legalities, so you work away with a`);
			if (V.PC.dick !== 0) {
				r.push(`pair of motherly lips wrapped around your dick`);
			} else {
				r.push(`motherly tongue pleasuring your clit`);
			}
			r.push(`as ${he} pumps away eagerly under the desk. ${He}'s definitely on aphrodisiacs. ${He} masturbates while ${he} sucks.`);
			App.Events.addParagraph(frag, r);
			return frag;
		}

		function sell() {
			cashX((cost - contractCost), "slaveTransfer", mother);
			return `${mother.slaveName} accepts being resold without much fuss. ${He}'s merely exchanged one unknown owner for another. For all ${he} knows ${his} new buyer will be less abusive than you would have been. ${He} would be less complacent if ${he} knew who ${his} buyers are; ${he}'ll be immured in an arcade within the hour.`;
		}

		function both() {
			const frag = new DocumentFragment();
			r = [];
			newSlave(mother);
			cashX(forceNeg(contractCost), "slaveTransfer", mother);
			newSlave(daughter);
			cashX(forceNeg(contractCost), "slaveTransfer", daughter);
			mother.devotion -= 50;

			r.push(`Despite ${himself}, ${he} sobs with relief when you agree. ${He} offers to`);
			if (V.PC.dick !== 0) {
				r.push(`suck you off`);
			} else {
				r.push(`eat you out`);
			}
			r.push(`while you complete the necessary legalities, but instead you idly place a big dose of aphrodisiac on your desk and tell ${him} to wait quietly. After ten minutes of careful manipulation, ${he}'s signed away both ${his} own freedom and ${his} ${daughter2}'s without realizing it, in return for the drug. ${He}'s masturbating furiously on a chair when ${his} ${daughter2} arrives. ${He} immediately realizes what's happened and ${his} eyes fill with all-consuming hatred, but ${he} can't stop rubbing.`);
			App.Events.addParagraph(frag, r);
			r = [];
			r.push(`Unsurprisingly the ${daughter2} is an addict too, and before long ${he2}'s given ${his2} signature and is sitting on a different chair on a strong dose of aphrodisiacs.`);
			if (daughter.dick > 0) {
				r.push(`Mother and ${daughter2} crank it desperately,`);
			} else {
				r.push(`Mother and ${daughter2} schlick themselves desperately,`);
			}
			r.push(`sobbing in despair as you hurry to complete the nastily complex paperwork. This is going to be fun.`);
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};

repo_name: Fekenol/fc

license: mit


code:
App.Events.recetsDesperateBroodmother = class recetsDesperateBroodmother extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.seePreg !== 0,
			() => V.seeHyperPreg === 1,
			() => V.arcologies[0].FSRestart === "unset",
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Desperate Broodmother`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 1000;
		const pram = {
			minAge: V.fertilityAge + 3, maxAge: (V.pedo_mode === 1 ? 18 : 24), disableDisability: 1, ageOverridesPedoMode: 1
		};
		const mother = GenerateNewSlave("XX", pram);
		mother.origin = "$He begged to be enslaved in a desperate attempt to provide for $his many children.";
		mother.career = "homeless";
		setHealth(mother, jsRandom(-45, -30), -1, -1, -1, 80);
		mother.devotion = random(35, 45);
		mother.trust = random(15, 25);
		mother.oldDevotion = mother.devotion;
		mother.preg = 41;
		mother.pregType = random(25, 29);
		mother.pregKnown = 1;
		mother.pregWeek = mother.preg;
		SetBellySize(mother);
		mother.pregAdaptation = 600;
		mother.ovaries = 1;
		mother.counter.birthsTotal = 5;
		/* Being pregnant with 25-29 children requires either hyper fertility drugs (1/3 odds) or a genetic quirk (2/3 odds) */
		mother.geneticQuirks.hyperFertility = either(mother.geneticQuirks.hyperFertility, 2, 2);
		mother.face = 15;
		mother.vagina = 4;
		mother.skill.vaginal = 45;
		mother.skill.whoring = 20;
		mother.skill.anal = 10;
		mother.anus = 1;
		mother.weight = random(-80, -50);
		mother.muscles = 0;
		mother.underArmHStyle = "bushy";
		mother.pubicHStyle = "bushy";
		mother.boobs = 1600;
		mother.boobShape = "saggy";
		mother.nipples = "huge";
		mother.lactation = 1;
		mother.lactationDuration = 2;
		mother.lactationAdaptation = 30;
		mother.hips = 2;
		mother.vaginaLube = 1;
		mother.butt += 3;
		mother.sexualQuirk = "caring";
		mother.bellySag = 20;
		mother.bellySagPreg = 20;
		mother.pubertyXX = 1;
		mother.canRecruit = 0;

		let child;
		if (random(1, 100) < V.seeDicks) { /* boy*/
			child = generateRelatedSlave(mother, "son");
			child.origin = "$His mother offered $him to you as an incentive to take them in.";
			child.slaveName = child.birthName;
			setHealth(child, jsRandom(10, 20));
			child.devotion -= 5;
			child.trust -= 5;
			child.oldDevotion = child.devotion;
			child.oldTrust = child.trust;
			child.pregAdaptation = 10;
			child.anus = 0;
			child.skill.vaginal = 0;
			child.skill.whoring = 0;
			child.skill.anal = 0;
			child.weight = random(-80, -50);
			child.muscles = 0;
			child.underArmHStyle = "bushy";
			child.pubicHStyle = "bushy";
			child.boobs = 100;
			child.boobShape = "perky";
			child.nipples = "tiny";
			child.lactation = 0;
			child.lactationDuration = 0;
			child.lactationAdaptation = 0;
			child.hips = -2;
			child.shoulders = -2;
			child.waist = 0;
			child.vaginaLube = 0;
			child.butt = 0;
			child.fetish = "none";
			child.fetishStrength = 0;
			child.sexualFlaw = "none";
			child.sexualQuirk = "none";
			child.bellySag = 0;
			child.bellySagPreg = 0;
			child.pubertyXX = 0;
			child.dick = 1;
			child.foreskin = 1;
			child.balls = 2;
			child.scrotum = 3;
			child.prostate = 1;
			child.actualAge = 3;
			child.visualAge = child.actualAge;
			child.physicalAge = child.actualAge;
			child.ovaryAge = child.actualAge;
			child.teeth = "baby";
		} else { /* girl*/
			child = generateRelatedSlave(mother, "daughter");
			child.origin = "$His mother offered $him to you as an incentive to take them in.";
			child.slaveName = child.birthName;
			setHealth(child, jsRandom(10, 20));
			child.devotion -= 5;
			child.trust -= 5;
			child.oldDevotion = child.devotion;
			child.oldTrust = child.trust;
			child.anus = 0;
			child.skill.vaginal = 0;
			child.skill.whoring = 0;
			child.skill.anal = 0;
			child.weight = random(-80, -50);
			child.muscles = 0;
			child.underArmHStyle = "bushy";
			child.pubicHStyle = "bushy";
			child.boobs = 100;
			child.boobShape = "perky";
			child.nipples = "tiny";
			child.hips = -2;
			child.shoulders = -2;
			child.waist = 0;
			child.butt = 0;
			child.fetish = "none";
			child.fetishStrength = 0;
			child.sexualFlaw = "none";
			child.sexualQuirk = "none";
			child.bellySag = 0;
			child.bellySagPreg = 0;
			child.pubertyXX = 0;
			child.vagina = 0;
			child.pregKnown = 0;
			child.pregAdaptation = 10;
			WombFlush(child);
			if (V.fertilityAge <= 3) {
				child.pubertyXX = 1;
				child.preg = 6;
				child.pregType = 1;
				child.pregKnown = 1;
				child.vagina = 1;
			}
			child.pregWeek = child.preg;
			SetBellySize(child);
			child.actualAge = 3;
			child.visualAge = child.actualAge;
			child.physicalAge = child.actualAge;
			child.ovaryAge = child.actualAge;
			child.teeth = "baby";
		}

		const {
			He, His,
			he, his, him, woman, loli, girl
		} = getPronouns(mother);
		const {
			He2,
			him2, his2, girl2
		} = getPronouns(child).appendSuffix("2");
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		let r = [];

		App.Events.addParagraph(node, [`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 aren't far off; the caller is a`);
		if (mother.actualAge >= 18) {
			r.push(`young ${woman}`);
		} else if (mother.actualAge >= 13) {
			r.push(`teen`);
		} else {
			r.push(`${loli}`);
		}
		r.push(
			`desperate for work, carrying a young child on ${his} shoulder, quadruplets on ${his} back and a large sack against ${his} middle, while looking absolutely exhausted.`,
			Spoken(mother, `"Please, would you happen to have any work for a desperate mother? I need to eat, and my babies are starting to go hungry... I tried whoring, but I got pregnant again..."`),
			`${He} struggles back to allow you to see ${his} full body. The object you thought was ${his} possessions is, in fact, ${his} massively distended stomach.`,
			Spoken(mother, `"I'm having so many and I don't know what to do anymore... I can't care for this many... Anything you can do for meeEEEEEE!"`),
			`${He} groans as an intense contraction hits ${him}.`,
			Spoken(mother, `"Oh god! Not now! Not like this! I'm not ready... Please, I'm giving birth right now... Forget work, I'll be your slave if you can help me..."`),
			`${He} begs, tears streaming down ${his} face as ${he} struggles to hold back the child threatening to slide into ${his} birth canal.`);
		if (V.minimumSlaveAge <= 3) {
			r.push(Spoken(mother, `"Please... My eldest is of age here... Help me and they'll be yours too! You'll help mommy, right sweetie?" The toddler nods to ${him}, unlikely to understand exactly what is going on.`));
		}
		App.Events.addParagraph(node, r);
		r = [];
		r.push(`Enslaving ${him} will cost ${cashFormat(contractCost)}.`);
		if (V.minimumSlaveAge <= 3) {
			r.push(`Alternatively, for ${cashFormat(contractCost * 2)} you could enslave both mother and ${his} eldest child, the rest being sent to the slave orphanages.`);
		}
		App.Events.addParagraph(node, r);

		const newSlaves = [mother]; /* rushed videocall, no dossier */

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= contractCost) {
			choices.push(new App.Events.Result(`Enslave the mother`, enslave, `This will cost ${cashFormat(contractCost)}`));
			if (V.minimumSlaveAge <= 3 && V.cash >= (contractCost * 2)) {
				choices.push(new App.Events.Result(`Accept ${his} offer`, both, `This will cost ${cashFormat(2 * contractCost)}`));
			}
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave ${him}.`));
		}
		App.Events.addResponses(node, choices);

		function enslave() {
			newSlave(mother);
			cashX(forceNeg(contractCost), "slaveTransfer", mother);
			startLabor(mother);
			return `You have the needy ${girl} immediately bought to your penthouse where you help ${his} laboring body into an available bed for inspection. ${He} asks where ${his} children were taken, to which you reply somewhere they can be raised properly. They'll be taken care of and won't have to grow up on the streets, plus they were sucking the life out of ${him}. ${He}'s a little depressed at the news, but understands your reasons. You take the opportunity to give ${him} a good look over; ${he} is really dilated! Apart from that, between all the births and dicks, ${his} vagina is rather worn out, though ${he} seems to understand how to use it. ${His} anus has also seen use, but not nearly as much.`;
		}

		function both() {
			const frag = new DocumentFragment();
			newSlave(mother);
			cashX(forceNeg(contractCost), "slaveTransfer", mother);
			newSlave(child);
			cashX(forceNeg(contractCost), "slaveTransfer", child);
			App.Events.addParagraph(frag, [`You have the needy ${girl} immediately bought to your penthouse where you help ${his} laboring body into an available bed for inspection. ${He} asks where ${his} other babies were taken, to which you reply somewhere they can be raised properly. They'll be taken care of and won't have to grow up on the streets, plus they were sucking the life out of ${him}. ${He}'s a little depressed at the news, but understands your reasons. You take the opportunity to give ${him} a good look over; ${he} is really dilated! Apart from that, between all the births and dicks, ${his} vagina is rather worn out, though ${he} seems to understand how to use it. ${His} anus has also seen use, but not nearly as much.`]);

			let r = [];
			r.push(`You turn to the child clutching ${his2} mother's grotesque belly. ${He2} is in better shape than ${his2} mother and tries to hide behind ${his} belly when you look at ${him2}. ${He2}'ll be broken into a good little ${girl2} for you soon enough.`);
			if (child.preg > 0) {
				r.push(`You notice ${his2} belly is slightly distended. It could be hunger, but upon closer inspection, you realize ${his2} hymen has been torn. ${He2}'s likely been servicing men alongside ${his2} mother and has a bun in the oven too.`);
			}
			App.Events.addParagraph(frag, r);
			return frag;
		}
	}
};


code:
App.Events.recetsIdenticalHermPair = class recetsIdenticalHermPair extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeDicks !== 100,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Identical Hermaphrodite Pair`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const thing1 = GenerateNewSlave("XX", {
			minAge: Math.max(V.fertilityAge, V.potencyAge), maxAge: 21, ageOverridesPedoMode: 1, disableDisability: 1
		});
		thing1.origin = "$He was brought up in a radical slave school to match $his twin.";
		thing1.career = "a slave";
		thing1.devotion = random(25, 45);
		thing1.trust = random(-15, 15);
		thing1.oldDevotion = thing1.devotion;
		setHealth(thing1, jsRandom(0, 20), undefined, undefined, 0, 10);
		thing1.anus = 1;
		thing1.dick = 5;
		thing1.foreskin = thing1.dick += either(-1, 0);
		thing1.balls = 6;
		thing1.scrotum = thing1.balls += either(-2, -1, -1, -1, 0, 0);
		thing1.clit = 0;
		thing1.vagina = 2;
		thing1.weight = 0;
		thing1.face = 15;
		thing1.faceShape = "cute";
		if (thing1.physicalAge >= 12) {
			thing1.teeth = "normal";
		}
		thing1.skill.vaginal = 15;
		thing1.skill.oral = 15;
		thing1.skill.anal = 15;
		if (thing1.physicalAge >= random(13, 17)) {
			thing1.boobs = either(500, 600);
			thing1.boobsImplant = 0;
			thing1.boobsImplantType = "none";
			thing1.butt = either(2, 3);
			thing1.buttImplant = 0;
			thing1.buttImplantType = "none";
		}
		thing1.pubertyXX = 1;
		thing1.pubertyXY = 1;
		thing1.hStyle = "tails";
		thing1.pubicHStyle = "waxed";
		thing1.energy = Math.max(thing1.energy, 40);
		thing1.attrXX = Math.max(thing1.attrXX, 70);
		thing1.attrXY = Math.max(thing1.attrXY, 70);
		thing1.sexualQuirk = "perverted";
		thing1.sexualFlaw = "none";
		thing1.behavioralFlaw = "none";
		setMissingParents(thing1);
		thing1.canRecruit = 0;
		thing1.relationship = 4;

		let cost = slaveCost(thing1);
		let contractCost = cost;

		const thing2 = generateRelatedSlave(thing1, "twin");
		thing2.energy = Math.max(thing2.energy, 40);
		thing2.attrXX = Math.max(thing2.attrXX, 70);
		thing2.attrXY = Math.max(thing2.attrXY, 70);
		thing2.sexualQuirk = "perverted";
		thing2.sexualFlaw = "none";
		thing2.behavioralFlaw = "none";
		thing2.relationship = 4;
		thing2.relationshipTarget = thing1.ID;

		if (V.seePreg) {
			thing1.preg = 30;
			thing1.pregType = 2;
			thing1.pregKnown = 1;
			thing1.pregWeek = thing1.preg;
			thing1.belly = 14000;
			thing1.bellyPreg = 14000;
			thing1.fetish = "pregnancy";
			thing1.fetishStrength = 100;

			WombFlush(thing2);
			thing2.preg = 30;
			thing2.pregType = 2;
			thing2.pregSource = thing1.ID;
			thing2.pregKnown = 1;
			thing2.pregWeek = thing2.preg;
			thing2.belly = 14000;
			thing2.bellyPreg = 14000;
			thing2.fetish = "pregnancy";
			thing2.fetishStrength = 100;

			thing1.pregSource = thing2.ID;
			thing1.relationshipTarget = thing2.ID;

			WombChangeGene(thing1, "fatherName", thing2.slaveName);
			WombChangeGene(thing1, "motherName", thing1.slaveName);
		}

		const {His} = getPronouns(thing1);
		const {He2, sister2} = getPronouns(thing2).appendSuffix("2");

		App.Events.addParagraph(node, [
			`A pair of young slaves is going door to door offering themselves for sale on behalf of their owner. It's rare to see a slave obedient enough to be entrusted with their own sale, and the price alone suggests there's something interesting, so you let them up. They stand in front of your desk, an arm around the other, and wait for instructions. They appear to be twins, and are dressed identically: they're wearing very skimpy miniskirts, which fail to conceal their semi erect cocks at all, bikini tops so brief that their areolae are clearly visible around the scrap of cloth over each nipple, and nothing ${V.seePreg ? `over their huge pregnant bellies` : `else to speak of`}. You instruct them to tell you about themselves.`
		]);

		App.Events.addParagraph(node, [
			`They pull themselves together, bringing their ${V.seePreg ? `gravid middles` : `unique bodies`} in tight contact with one another. One of them speaks up.`,
			Spoken(thing1, `"We're twins, ${(V.PC.title !== 0) ? "sir" : "ma'am"}. Identical twins. We've also been trained ${(thing2.actualAge > V.minimumSlaveAge) ? `ever since we turned ${num(V.minimumSlaveAge)}` : ``} to be completely obedient, ${(V.PC.title !== 0) ? "sir" : "ma'am"}, in everything, and sexually proficient."`)
		]);

		if (V.seePreg) {
			App.Events.addParagraph(node, [
				`The other blurts out.`,
				Spoken(thing2, `"But we kinda got too into each other, in more ways than one!"`),
				`${He2} winks.`
			]);
		}

		App.Events.addParagraph(node, [Spoken(thing2, `"We cost ${cashFormat(contractCost)}, ${(V.PC.title !== 0) ? "sir" : "ma'am"}."`)]);
		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical.`, "detail");

		const newSlaves = [thing1, thing2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(thing1);
			cashX(forceNeg(contractCost), "slaveTransfer", thing1);
			newSlave(thing2);
			cashX(forceNeg(contractCost), "slaveTransfer", thing2);
			return [
				`They giggle and kiss each other rather passionately, their miniskirts ${V.seePreg ? `becoming pinned against their pregnancies` : `being lifted toward their navels`} by their stiffening pricks. They're very well trained but not very disciplined, though their pervertedness will be fun.`,
				Spoken(thing2, `"You know we ${V.seePreg ? `each are carrying the other's twins` : `took each other's virginities`}, right?"`),
				newSlaveIncestSex(thing1, thing2)
			];
		}
	}
};


code:
App.Events.recetsIdenticalPair = class recetsIdenticalPair extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Identical Pair`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const thing1 = GenerateNewSlave("XX", {minAge: V.minimumSlaveAge, maxAge: 21, disableDisability: 1});
		thing1.origin = "$He was brought up in a radical slave school to match $his twin.";
		thing1.career = "a slave";
		thing1.devotion = random(25, 45);
		thing1.trust = random(-15, 15);
		thing1.oldDevotion = thing1.devotion;
		setHealth(thing1, jsRandom(0, 20), undefined, undefined, 0, 0);
		thing1.anus = 1;
		thing1.dick = 0;
		thing1.foreskin = 0;
		thing1.balls = 0;
		thing1.scrotum = 0;
		thing1.clit = 2;
		thing1.vagina = 1;
		thing1.weight = 0;
		thing1.face = 15;
		thing1.faceShape = "cute";
		thing1.energy = Math.max(thing1.energy, 40);
		thing1.attrXX = Math.max(thing1.attrXX, 70);
		if (thing1.physicalAge >= 12) {
			thing1.teeth = "normal";
		}
		thing1.skill.vaginal = 15;
		thing1.skill.oral = 15;
		thing1.skill.anal = 15;
		if (thing1.physicalAge >= random(13, 17)) {
			thing1.boobs = either(500, 600);
			thing1.boobsImplant = 0;
			thing1.boobsImplantType = "none";
			thing1.butt = either(2, 3);
			thing1.buttImplant = 0;
			thing1.buttImplantType = "none";
		}
		thing1.preg = -1;
		thing1.hStyle = "tails";
		thing1.pubicHStyle = "waxed";
		thing1.sexualFlaw = "none";
		thing1.behavioralFlaw = "none";
		setMissingParents(thing1);
		thing1.canRecruit = 0;
		thing1.relationship = 2;
		let cost = slaveCost(thing1);
		const contractCost = cost;

		const thing2 = generateRelatedSlave(thing1, "twin");
		thing2.energy = Math.max(thing2.energy, 40);
		thing2.attrXX = Math.max(thing2.attrXX, 70);
		thing2.relationship = 2;
		thing2.relationshipTarget = thing1.ID;

		thing1.relationshipTarget = thing2.ID;

		const {His} = getPronouns(thing1);
		const {sister2} = getPronouns(thing2).appendSuffix("2");

		App.Events.addParagraph(node, [
			`A pair of young slaves is going door to door offering themselves for sale on behalf of their owner. It's rare to see a slave obedient enough to be entrusted with their own sale, and the price alone suggests there's something interesting, so you let them up. They stand in front of your desk and wait for instructions. They appear to be twins, and are dressed identically: they're wearing very skimpy miniskirts and bikini tops so brief that their areolae are clearly visible around the scrap of cloth over each nipple. You instruct them to tell you about themselves.`
		]);

		App.Events.addParagraph(node, [
			`One of them speaks up.`,
			Spoken(thing2, `"We're twins, ${(V.PC.title !== 0) ? "sir" : "ma'am"}. Identical twins. We've also been trained ${(thing2.actualAge > V.minimumSlaveAge) ? `ever since we turned ${num(V.minimumSlaveAge)}` : ``} to be completely obedient, ${(V.PC.title !== 0) ? "sir" : "ma'am"}, in everything, and sexually proficient."`)
		]);

		App.Events.addParagraph(node, [Spoken(thing2, `"We cost ${cashFormat(contractCost)}, ${(V.PC.title !== 0) ? "sir" : "ma'am"}."`)]);
		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical.`, "detail");

		const newSlaves = [thing1, thing2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(thing1);
			cashX(forceNeg(contractCost), "slaveTransfer", thing1);
			newSlave(thing2);
			cashX(forceNeg(contractCost), "slaveTransfer", thing2);
			return App.UI.DOM.combineNodes(
				`They giggle and kiss each other rather sexually, pressing their nearly identical bodies closely together. They're clearly very well trained.`,
				newSlaveIncestSex(thing1, thing2)
			);
		}
	}
};


code:
App.Events.recetsIncestBrotherBrother = class recetsIncestBrotherBrother extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Brother Brother Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const brother1 = GenerateNewSlave("XY", {
			minAge: Math.max(V.potencyAge + 2, V.minimumSlaveAge + 2), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
		});
		brother1.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		brother1.career = "a dropout";
		brother1.devotion = random(-15, 15);
		brother1.trust = random(-15, 15);
		brother1.oldDevotion = brother1.devotion;
		brother1.face = random(15, 40);
		brother1.clothes = "conservative clothing";
		setHealth(brother1, jsRandom(20, 40), 0, 0, 0);
		brother1.pubicHStyle = "bushy";
		brother1.energy = Math.max(brother1.energy, 40);
		brother1.attrXY = Math.max(brother1.attrXY, 70);
		if (brother1.behavioralFlaw === "hates men") {
			brother1.behavioralFlaw = "none";
		}
		brother1.behavioralQuirk = "sinful";
		setMissingParents(brother1);
		brother1.canRecruit = 0;
		brother1.relationship = 3;
		/* cost not needed, no option to sell */

		const brother2 = generateRelatedSlave(brother1, "younger brother");
		brother2.height += random(-5, 5);
		brother2.pubicHStyle = "shaved";
		brother2.dick += 2;
		brother2.balls += 2;
		brother2.scrotum = brother2.balls;
		if (brother2.foreskin) {
			brother2.foreskin = brother2.dick;
		}
		brother2.energy = Math.max(brother2.energy, 40);
		brother2.attrXY = Math.max(brother2.attrXY, 70);
		if (brother2.behavioralFlaw === "hates men") {
			brother2.behavioralFlaw = "none";
		}
		brother2.relationship = 3;
		brother2.relationshipTarget = brother1.ID;
		brother1.relationshipTarget = brother2.ID;

		const {
			sister
		} = getPronouns(brother1);
		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are two ${sister}s who had to flee their home after their parents found out they were having sex with each other. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [brother1, brother2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(brother2);
			newSlave(brother1);
			cashX(forceNeg(contractCost), "slaveTransfer", brother1);
			cashX(forceNeg(contractCost), "slaveTransfer", brother2);
			return [
				`They hug each other tightly as the older ${sister} slips a hand down the younger's pants. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(brother1, brother2)
			];
		}
	}
};


code:
App.Events.recetsIncestBrotherSister = class recetsIncestBrotherSister extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Brother Sister Incest `;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const sis = GenerateNewSlave("XX", {
			minAge: Math.max(V.fertilityAge, V.potencyAge + 2, V.minimumSlaveAge + 2), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
		});
		sis.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		sis.career = "a dropout";
		sis.devotion = random(-15, 15);
		sis.trust = random(-15, 15);
		sis.oldDevotion = sis.devotion;
		sis.ovaries = 1;
		sis.vagina = 1;
		sis.face = random(15, 40);
		sis.skill.vaginal = 15;
		sis.clothes = "cutoffs and a t-shirt";
		setHealth(sis, jsRandom(20, 40), 0, 0, 0);
		sis.pubicHStyle = "in a strip";
		sis.energy = Math.max(sis.energy, 40);
		sis.attrXY = Math.max(sis.attrXY, 70);
		if (sis.behavioralFlaw === "hates men") {
			sis.behavioralFlaw = "none";
		}
		sis.behavioralQuirk = "sinful";
		setMissingParents(sis);
		sis.canRecruit = 0;
		sis.relationship = 3;
		/* cost not needed, no option to sell */

		const bro = generateRelatedSlave(sis, "younger brother");
		bro.pubicHStyle = "shaved";
		bro.energy = Math.max(bro.energy, 40);
		bro.attrXX = Math.max(bro.attrXX, 70);
		if (bro.behavioralFlaw === "hates women") {
			bro.behavioralFlaw = "none";
		}
		bro.relationship = 3;
		bro.relationshipTarget = sis.ID;

		sis.relationshipTarget = bro.ID;

		if (V.seePreg) {
			while (bro.actualAge < bro.pubertyAgeXY) {
				ageSlave(bro, true);
			}
			sis.preg = random(20, 30);
			sis.pregType = either(1, 1, 1, 1, 1, 2, 2, 3);
			sis.pregKnown = 1;
			sis.pregWeek = sis.preg;
			SetBellySize(sis);
			sis.pregSource = bro.ID;
			WombChangeGene(sis, "fatherName", bro.slaveName);
			WombChangeGene(sis, "motherName", sis.slaveName);
		}

		const {
			His, sister
		} = getPronouns(sis);
		const {
			sister2
		} = getPronouns(bro).appendSuffix("2");
		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are a ${sister2} and ${sister} who had to flee their home after their parents found out they were having sex with each other. ${V.seePreg ? `${His} gravid middle is testament to that. ` : ``}They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [sis, bro];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(bro);
			newSlave(sis);
			cashX(forceNeg(contractCost), "slaveTransfer", sis);
			cashX(forceNeg(contractCost), "slaveTransfer", bro);
			return [
				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(sis, bro)
			];
		}
	}
};


code:
App.Events.recetsIncestFatherDaughter = class recetsIncestFatherDaughter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.arcologies[0].FSRestart === "unset",
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Father Daughter Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const father = GenerateNewSlave("XY", {
			minAge: Math.max(V.potencyAge + 20, V.fertilityAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
		});
		father.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		father.devotion = random(-15, 15);
		father.trust = random(-15, 15);
		father.oldDevotion = father.devotion;
		father.dick = 4;
		father.balls = 3;
		father.scrotum = 3;
		father.face = 15;
		father.faceShape = "masculine";
		father.clothes = "conservative clothing";
		setHealth(father, jsRandom(20, 40), 0, 0, 0);
		father.energy = Math.max(father.energy, 40);
		father.attrXX = Math.max(father.attrXX, 70);
		if (father.behavioralFlaw === "hates women") {
			father.behavioralFlaw = "none";
		}
		father.behavioralQuirk = "sinful";
		father.canRecruit = 0;
		father.relationship = 3;
		/* cost not needed, no option to sell */

		const daughter = generateRelatedSlave(father, "daughter");
		daughter.vagina = 3;
		daughter.clit = 1;
		daughter.ovaries = 1;
		daughter.voice = 2;
		daughter.skill.vaginal = 50;
		daughter.boobs = (random(3, 6) * 100);
		daughter.faceShape = "cute";
		daughter.energy = Math.max(daughter.energy, 40);
		daughter.attrXY = Math.max(daughter.attrXY, 70);
		if (daughter.behavioralFlaw === "hates men") {
			daughter.behavioralFlaw = "none";
		}
		daughter.behavioralQuirk = "none";
		daughter.sexualQuirk = "perverted";
		daughter.relationship = 3;
		daughter.relationshipTarget = father.ID;

		father.relationshipTarget = daughter.ID;

		if (V.seePreg) {
			while (daughter.actualAge < daughter.pubertyAgeXX) {
				ageSlave(daughter, true);
			}
			daughter.preg = random(20, 30);
			daughter.pregType = either(1, 1, 1, 1, 1, 2, 2, 3);
			daughter.pregKnown = 1;
			daughter.pregWeek = daughter.preg;
			SetBellySize(daughter);
			daughter.pregSource = father.ID;
			WombChangeGene(daughter, "fatherName", father.slaveName);
			WombChangeGene(daughter, "motherName", daughter.slaveName);
		}

		const {
			He,
			he, his
		} = getPronouns(father);
		const {
			His2,
			daughter2, his2, him2
		} = getPronouns(daughter).appendSuffix("2");
		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are a father and ${daughter2} who had to flee their home after ${his} wife found out ${he} was having sex with their ${daughter2}. ${V.seePreg ? `${His2} gravid middle is testament to that. ` : ``}They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost*2)} to enslave the two of them.`, "detail");

		const newSlaves = [father, daughter];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(daughter);
			newSlave(father);
			cashX(forceNeg(contractCost), "slaveTransfer", father);
			cashX(forceNeg(contractCost), "slaveTransfer", daughter);
			return [
				`The ${daughter2} cheers happily and hugs ${his2} relieved father. ${He} leans in and kisses ${him2} deeply. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(father, daughter)
			];
		}
	}
};


code:
App.Events.recetsIncestFatherSon = class recetsIncestFatherSon extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Father Son Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const father = GenerateNewSlave("XY", {
			minAge: Math.max(V.potencyAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
		});
		father.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		father.devotion = random(-15, 15);
		father.trust = random(-15, 15);
		father.oldDevotion = father.devotion;
		father.dick = 4;
		father.balls = 3;
		father.scrotum = 3;
		father.face = random(15, 50);
		father.faceShape = "masculine";
		father.clothes = "conservative clothing";
		setHealth(father, jsRandom(20, 40), 0, 0, 0);
		father.energy = Math.max(father.energy, 40);
		father.attrXY = Math.max(father.attrXY, 70);
		if (father.behavioralFlaw === "hates men") {
			father.behavioralFlaw = "none";
		}
		father.behavioralQuirk = "sinful";
		father.canRecruit = 0;
		father.relationship = 3;
		/* cost not needed, no option to sell */

		const son = generateRelatedSlave(father, "son");
		son.career = "a student";
		son.energy = Math.max(son.energy, 40);
		son.attrXY = Math.max(son.attrXY, 70);
		if (son.behavioralFlaw === "hates men") {
			son.behavioralFlaw = "none";
		}
		son.relationship = 3;
		son.relationshipTarget = father.ID;

		father.relationshipTarget = son.ID;

		const {
			he, his
		} = getPronouns(father);
		const {
			daughter2, his2
		} = getPronouns(son).appendSuffix("2");
		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are a father and ${daughter2} who had to flee their home after ${his} wife found out ${he} was having sex with their ${daughter2}. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [father, son];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(son);
			newSlave(father);
			cashX(forceNeg(contractCost), "slaveTransfer", father);
			cashX(forceNeg(contractCost), "slaveTransfer", son);
			return [
				`The father hugs ${his} ${daughter2} tight and slips a hand down ${his2} pants. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(father, son)
			];
		}
	}
};


code:
App.Events.recetsIncestMotherDaughter = class recetsIncestMotherDaughter extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Mother Daughter Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const mother = GenerateNewSlave("XX", {
			minAge: Math.max(V.fertilityAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
		});
		mother.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		mother.career = "a housewife";
		mother.devotion = random(-15, 15);
		mother.trust = random(-15, 15);
		mother.oldDevotion = mother.devotion;
		mother.vagina = 2;
		mother.ovaries = 1;
		mother.counter.birthsTotal++;
		mother.face = random(15, 60);
		mother.skill.vaginal = 35;
		mother.anus = 1;
		mother.boobs += 600;
		mother.lactation = 1;
		mother.lactationDuration = 2;
		mother.boobsImplant = 0;
		mother.boobsImplantType = "none";
		mother.butt += 2;
		mother.buttImplant = 0;
		mother.buttImplantType = "none";
		mother.clothes = "conservative clothing";
		setHealth(mother, jsRandom(20, 40), 0, 0, 0);
		mother.pubicHStyle = "bushy";
		mother.energy = Math.max(mother.energy, 40);
		mother.attrXX = Math.max(mother.attrXX, 70);
		if (mother.behavioralFlaw === "hates women") {
			mother.behavioralFlaw = "none";
		}
		mother.behavioralQuirk = "sinful";
		mother.canRecruit = 0;
		mother.relationship = 3;
		/* cost not needed, no option to sell */

		const daughter = generateRelatedSlave(mother, "daughter");
		daughter.career = "a student";
		daughter.vagina = 0;
		daughter.counter.birthsTotal = 0;
		daughter.skill.vaginal = 15;
		daughter.anus = 0;
		daughter.boobs = Math.max(daughter.boobs - 300, 0);
		daughter.lactation = 0;
		daughter.lactationDuration = 0;
		daughter.boobsImplant = 0;
		daughter.boobsImplantType = "none";
		daughter.energy = Math.max(daughter.energy, 40);
		daughter.attrXX = Math.max(daughter.attrXX, 70);
		if (daughter.behavioralFlaw === "hates women") {
			daughter.behavioralFlaw = "none";
		}
		daughter.relationship = 3;
		daughter.relationshipTarget = mother.ID;

		mother.relationshipTarget = daughter.ID;

		const {
			He,
			he, his
		} = getPronouns(mother);
		const {
			daughter2, his2, him2
		} = getPronouns(daughter).appendSuffix("2");
		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are a mother and ${daughter2} who had to flee their home after ${his} husband found out ${he} was having sex with their ${daughter2}. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [mother, daughter];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(daughter);
			newSlave(mother);
			cashX(forceNeg(contractCost), "slaveTransfer", mother);
			cashX(forceNeg(contractCost), "slaveTransfer", daughter);
			return [
				`The ${daughter2} cheers happily and hugs ${his2} relieved mother. ${He} leans in and kisses ${him2} deeply. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(mother, daughter)
			];
		}
	}
};


code:
App.Events.recetsIncestMotherSon = class recetsIncestMotherSon extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Mother Son Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const mother = GenerateNewSlave("XX", {
			minAge: Math.max(V.fertilityAge + 20, V.potencyAge + 20, V.minimumSlaveAge + 20), maxAge: 40, ageOverridesPedoMode: 1, disableDisability: 1
		});
		mother.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		mother.career = "a housewife";
		mother.devotion = random(-15, 15);
		mother.trust = random(-15, 15);
		mother.oldDevotion = mother.devotion;
		mother.oldTrust = mother.trust;
		mother.vagina = 2;
		mother.ovaries = 1;
		mother.counter.birthsTotal++;
		mother.face = 15;
		mother.skill.vaginal = 35;
		mother.anus = 1;
		mother.boobs += 600;
		mother.boobsImplant = 0;
		mother.boobsImplantType = "none";
		mother.butt += 2;
		mother.buttImplant = 0;
		mother.buttImplantType = "none";
		mother.clothes = "conservative clothing";
		setHealth(mother, jsRandom(20, 40), 0, 0, 0);
		mother.pubicHStyle = "bushy";
		mother.energy = Math.max(mother.energy, 40);
		mother.attrXY = Math.max(mother.attrXY, 70);
		if (mother.behavioralFlaw === "hates men") {
			mother.behavioralFlaw = "none";
		}
		mother.behavioralQuirk = "sinful";
		mother.canRecruit = 0;
		mother.relationship = 3;
		/* cost not needed, no option to sell */

		const son = generateRelatedSlave(mother, "son");
		son.career = "a student";
		son.faceShape = "cute";
		son.boobs = 100;
		son.anus = 0;
		son.energy = Math.max(son.energy, 40);
		son.attrXX = Math.max(son.attrXX, 70);
		if (son.behavioralFlaw === "hates women") {
			son.behavioralFlaw = "none";
		}
		son.behavioralQuirk = "none";
		son.sexualQuirk = "perverted";
		son.relationship = 3;
		son.relationshipTarget = mother.ID;

		mother.relationshipTarget = son.ID;

		if (V.seePreg) {
			while (son.actualAge < son.pubertyAgeXY) {
				ageSlave(son, true);
			}
			mother.lactation = 1;
			mother.lactationDuration = 2;
			mother.preg = random(20, 30);
			mother.pregType = either(1, 1, 1, 1, 1, 2, 2, 3);
			mother.pregKnown = 1;
			mother.pregWeek = mother.preg;
			SetBellySize(mother);
			mother.pregSource = son.ID;
			WombChangeGene(mother, "fatherName", son.slaveName);
			WombChangeGene(mother, "motherName", mother.slaveName);
		}

		const {
			He,
			his
		} = getPronouns(mother);
		const {
			daughter2, his2, him2
		} = getPronouns(son).appendSuffix("2");
		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const children = mother.pregType > 1 ? "children" : "child";

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are a mother and ${daughter2} who had to flee their home after ${his} husband ${V.seePreg ? `found out ${his} rounded middle contained not his ${children}, but his ${daughter2}'s` : `caught them in the act of incest`}. They feel that life in an arcology together, even as slaves, would be better than their new life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [mother, son];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(son);
			newSlave(mother);
			cashX(forceNeg(contractCost), "slaveTransfer", mother);
			cashX(forceNeg(contractCost), "slaveTransfer", son);
			return [
				`The ${daughter2} cheers happily and hugs ${his2} relieved mother. ${He} leans in and kisses ${him2} deeply. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(mother, son)
			];
		}
	}
};


code:
App.Events.recetsIncestSisterSister = class recetsIncestSisterSister extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Sister Sister Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const sis1 = GenerateNewSlave("XX", {
			minAge: V.minimumSlaveAge + 2, maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
		});
		sis1.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		sis1.career = "a dropout";
		sis1.devotion = random(-15, 15);
		sis1.trust = random(-15, 15);
		sis1.oldDevotion = sis1.devotion;
		sis1.oldTrust = sis1.trust;
		sis1.ovaries = 1;
		sis1.face = random(15, 40);
		sis1.clothes = "cutoffs and a t-shirt";
		setHealth(sis1, jsRandom(20, 40), 0, 0, 0);
		sis1.pubicHStyle = "in a strip";
		sis1.energy = Math.max(sis1.energy, 40);
		sis1.attrXX = Math.max(sis1.attrXX, 70);
		if (sis1.behavioralFlaw === "hates women") {
			sis1.behavioralFlaw = "none";
		}
		sis1.behavioralQuirk = "sinful";
		setMissingParents(sis1);
		sis1.canRecruit = 0;
		sis1.relationship = 3;
		/* cost not needed, no option to sell */

		const sis2 = generateRelatedSlave(sis1, "younger sister");
		sis2.pubicHStyle = "bushy";
		sis2.energy = Math.max(sis2.energy, 40);
		sis2.attrXX = Math.max(sis2.attrXX, 70);
		if (sis2.behavioralFlaw === "hates women") {
			sis2.behavioralFlaw = "none";
		}
		sis2.behavioralQuirk = "none";
		sis2.sexualQuirk = "perverted";
		sis2.clothes = "conservative clothing";
		sis2.relationship = 3;
		sis2.relationshipTarget = sis1.ID;

		sis1.relationshipTarget = sis2.ID;

		const {
			sister
		} = getPronouns(sis1);
		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are two ${sister}s who had to flee their home after their parents found out they were having sex with each other. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [sis1, sis2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(sis2);
			newSlave(sis1);
			cashX(forceNeg(contractCost), "slaveTransfer", sis1);
			cashX(forceNeg(contractCost), "slaveTransfer", sis2);
			return [
				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(sis1, sis2)
			];
		}
	}
};


code:
App.Events.recetsIncestTwinBrother = class recetsIncestTwinBrother extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Twin Brother Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const brother1 = GenerateNewSlave("XY", {
			minAge: Math.max(V.potencyAge, V.minimumSlaveAge), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
		});
		brother1.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		brother1.devotion = random(-15, 15);
		brother1.trust = random(-15, 15);
		brother1.oldDevotion = brother1.devotion;
		brother1.oldTrust = brother1.trust;
		brother1.face = random(15, 40);
		brother1.clothes = "conservative clothing";
		setHealth(brother1, jsRandom(20, 40), 0, 0, 0);
		brother1.pubicHStyle = "bushy";
		brother1.energy = Math.max(brother1.energy, 40);
		brother1.attrXY = Math.max(brother1.attrXY, 70);
		if (brother1.behavioralFlaw === "hates men") {
			brother1.behavioralFlaw = "none";
		}
		brother1.behavioralQuirk = "sinful";
		setMissingParents(brother1);
		brother1.canRecruit = 0;
		brother1.relationship = 3;

		const brother2 = generateRelatedSlave(brother1, "twin");
		brother2.height += random(-5, 5);
		brother2.energy = Math.max(brother2.energy, 40);
		brother2.attrXY = Math.max(brother2.attrXY, 70);
		if (brother2.behavioralFlaw === "hates men") {
			brother2.behavioralFlaw = "none";
		}
		brother2.relationship = 3;
		brother2.relationshipTarget = brother1.ID;
		brother1.relationshipTarget = brother2.ID;

		const {
			sister
		} = getPronouns(brother1);

		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are twin ${sister}s who had to flee their home after their parents found out they were having sex with each other. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [brother1, brother2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(brother2);
			newSlave(brother1);
			cashX(forceNeg(contractCost), "slaveTransfer", brother1);
			cashX(forceNeg(contractCost), "slaveTransfer", brother2);
			return [
				`They hug each other tightly as they slip a hand down the other's pants. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(brother1, brother2)
			];
		}
	}
};


code:
App.Events.recetsIncestTwinSister = class recetsIncestTwinSister extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 100,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Twin Sister Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const sis1 = GenerateNewSlave("XX", {
			minAge: Math.max(V.fertilityAge, V.minimumSlaveAge), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
		});
		sis1.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		sis1.devotion = random(-15, 15);
		sis1.trust = random(-15, 15);
		sis1.oldDevotion = sis1.devotion;
		sis1.oldTrust = sis1.trust;
		sis1.face = random(15, 40);
		sis1.skill.vaginal = 15;
		sis1.clothes = "cutoffs and a t-shirt";
		setHealth(sis1, jsRandom(20, 40), 0, 0, 0);
		sis1.pubicHStyle = "in a strip";
		sis1.energy = Math.max(sis1.energy, 40);
		sis1.attrXX = Math.max(sis1.attrXX, 70);
		if (sis1.behavioralFlaw === "hates women") {
			sis1.behavioralFlaw = "none";
		}
		sis1.behavioralQuirk = "sinful";
		setMissingParents(sis1);
		sis1.canRecruit = 0;
		sis1.relationship = 3;
		/* cost not needed, no option to sell */

		const sis2 = generateRelatedSlave(sis1, "twin");
		sis2.slaveName = sis2.birthName;
		sis2.height += random(-5, 5);
		sis2.energy = Math.max(sis2.energy, 40);
		sis2.attrXX = Math.max(sis2.attrXX, 70);
		if (sis2.behavioralFlaw === "hates women") {
			sis2.behavioralFlaw = "none";
		}
		sis2.relationship = 3;
		sis2.relationshipTarget = sis1.ID;
		sis1.relationshipTarget = sis2.ID;

		const {sister} = getPronouns(sis1);

		const {
			HeA
		} = getPronouns(assistant.pronouns().main).appendSuffix("A");

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers seem stressed, but otherwise normal. They haltingly and quietly explain that they are twin ${sister}s who had to flee their home after their parents found out they were having sex with each other. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [sis1, sis2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(sis2);
			newSlave(sis1);
			cashX(forceNeg(contractCost), "slaveTransfer", sis1);
			cashX(forceNeg(contractCost), "slaveTransfer", sis2);
			return [
				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(sis1, sis2)
			];
		}
	}
};


code:
App.Events.recetsIncestTwinsMixed = class recetsIncestTwinsMixed extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeDicks !== 100,
			() => V.seeIncest !== 0,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Twins Mixed Incest`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 10000;
		const sis = GenerateNewSlave("XX", {
			minAge: Math.max(V.fertilityAge, V.potencyAge, V.minimumSlaveAge), maxAge: 20, ageOverridesPedoMode: 1, disableDisability: 1
		});
		sis.origin = "$He offered to become your slave to protect $his incestuous relationship.";
		sis.vagina = 1;
		sis.devotion = random(-15, 15);
		sis.trust = random(-15, 15);
		sis.oldDevotion = sis.devotion;
		sis.oldTrust = sis.trust;
		sis.face = random(15, 40);
		sis.skill.vaginal = 15;
		sis.clothes = "cutoffs and a t-shirt";
		setHealth(sis, jsRandom(20, 40), 0, 0, 0);
		sis.pubicHStyle = "in a strip";
		sis.energy = Math.max(sis.energy, 40);
		sis.attrXY = Math.max(sis.attrXY, 70);
		if (sis.behavioralFlaw === "hates men") {
			sis.behavioralFlaw = "none";
		}
		sis.behavioralQuirk = "sinful";
		setMissingParents(sis);
		sis.canRecruit = 0;
		sis.relationship = 3;
		/* cost not needed, no option to sell */

		const bro = generateRelatedSlave(sis, "twin", true);
		bro.height += random(-5, 5);
		bro.vagina = -1;
		bro.dick = 2;
		bro.foreskin = 2;
		bro.ovaries = 0;
		bro.balls = 2;
		bro.scrotum = 2;
		bro.skill.vaginal = 0;
		bro.faceShape = "masculine";
		bro.boobs = 100;
		bro.anus = 0;
		bro.pubicHStyle = "bushy";
		bro.energy = Math.max(bro.energy, 40);
		bro.attrXX = Math.max(bro.attrXX, 70);
		if (bro.behavioralFlaw === "hates women") {
			bro.behavioralFlaw = "none";
		}
		bro.behavioralQuirk = "none";
		bro.sexualQuirk = "perverted";
		bro.clothes = "conservative clothing";
		bro.relationship = 3;
		bro.relationshipTarget = sis.ID;

		sis.relationshipTarget = bro.ID;

		if (V.seePreg) {
			sis.ovaries = 1;
			sis.preg = random(20, 30);
			sis.pregType = either(1, 1, 1, 1, 1, 2, 2, 3);
			sis.pregKnown = 1;
			sis.pregWeek = sis.preg;
			SetBellySize(sis);
			sis.pregSource = bro.ID;
			WombChangeGene(sis, "fatherName", bro.slaveName);
			WombChangeGene(sis, "motherName", sis.slaveName);
		}

		const {HeA} = getPronouns(assistant.pronouns().main).appendSuffix("A");
		const {
			he, his
		} = getPronouns(sis);
		const children = sis.pregType > 1 ? "children" : "child";

		App.Events.addParagraph(node, [`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, [`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. In this case, however, the story is more unusual — the callers are a boy and a girl, each the spitting image of the other; they seem stressed, but otherwise normal. The girl haltingly and quietly explains that they are twins who had to flee their home after their parents found out ${V.seePreg ? `${he} was bearing ${his} twin brother's ${children}` : `they were having sex with each other`}. They feel that life in an arcology together, even as slaves, would be better than their current life on the streets.`]);

		App.Events.addParagraph(node, [`${capFirstChar(V.assistant.name)} assembles a dossier of information and photos from information they've sent describing their bodies and skills, to be used as a substitute for an in-person inspection.`]);

		App.UI.DOM.appendNewElement("p", node, `It would cost ${cashFormat(contractCost * 2)} to enslave the two of them.`, "detail");

		const newSlaves = [sis, bro];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(bro);
			newSlave(sis);
			cashX(forceNeg(contractCost), "slaveTransfer", sis);
			cashX(forceNeg(contractCost), "slaveTransfer", bro);
			return [
				`They cheer happily and hug each other tightly. They ought to be an interesting addition to your penthouse.`,
				newSlaveIncestSex(sis, bro)
			];
		}
	}
};


code:
App.Events.recetsMatchedPair = class recetsMatchedPair extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeDicks !== 100,
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Matched Pair`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		/* contractCost not needed, no option to sell */
		const sis1 = GenerateNewSlave("XY", {minAge: 12, maxAge: 21, disableDisability: 1});
		sis1.origin = "$He was brought up in a radical slave school to match $his twin.";
		sis1.career = "a slave";
		sis1.devotion = random(25, 45);
		sis1.trust = random(-15, 15);
		sis1.oldDevotion = sis1.devotion;
		setHealth(sis1, jsRandom(0, 20), undefined, undefined, 0, 0);
		sis1.anus = 1;
		sis1.vagina = -1;
		sis1.dick = 1;
		if (sis1.foreskin > 0) {
			sis1.foreskin = sis1.dick;
		}
		if (sis1.balls > 0) {
			sis1.scrotum = sis1.balls;
		}
		sis1.balls = 1;
		sis1.ovaries = 0;
		sis1.clit = 0;
		sis1.weight = 0;
		sis1.face = 15;
		sis1.skill.vaginal = 0;
		sis1.skill.oral = 15;
		sis1.skill.anal = 15;
		sis1.boobs = either(500, 600);
		sis1.boobsImplant = 400;
		sis1.boobsImplantType = "normal";
		sis1.butt = either(2, 3);
		sis1.buttImplant = 1;
		sis1.buttImplantType = "normal";
		sis1.preg = -3;
		sis1.hStyle = "tails";
		sis1.pubicHStyle = "waxed";
		sis1.underArmHStyle = "waxed";
		sis1.energy = Math.max(sis1.energy, 40);
		sis1.attrXX = Math.max(sis1.attrXX, 70);
		sis1.sexualFlaw = "none";
		sis1.behavioralFlaw = "none";
		setMissingParents(sis1);
		sis1.canRecruit = 0;
		sis1.relationship = 2;
		let cost = slaveCost(sis1);
		let contractCost = cost;

		const sis2 = generateRelatedSlave(sis1, "twin", true);
		sis2.vagina = 1;
		sis2.preg = -1;
		sis2.dick = 0;
		sis2.scrotum = 0;
		sis2.clit = 2;
		sis2.ovaries = 1;
		sis2.balls = 0;
		sis2.skill.vaginal = 15;
		sis2.boobsImplant = 0;
		sis2.boobsImplantType = "none";
		sis2.buttImplant = 0;
		sis2.buttImplantType = "none";
		sis2.energy = Math.max(sis2.energy, 40);
		sis2.attrXX = Math.max(sis2.attrXX, 70);
		sis2.attrXY = Math.max(sis2.attrXY, 70);
		sis2.sexualFlaw = "none";
		sis2.behavioralFlaw = "none";
		sis2.relationship = 2;

		sis2.relationshipTarget = sis1.ID;
		sis1.relationshipTarget = sis2.ID;

		const {His, his} = getPronouns(sis1);
		const {
			he2, sister2,
		} = getPronouns(sis2).appendSuffix("2");

		let r = [];

		App.Events.addParagraph(node, [
			`A pair of young slaves is going door to door offering themselves for sale on behalf of their owner. It's rare to see a slave obedient enough to be entrusted with their own sale, and the price alone suggests there's something interesting, so you let them up. They stand in front of your desk and wait for instructions. They appear to be twins, and are dressed identically: they're wearing very skimpy miniskirts and bikini tops so brief that their areolae are clearly visible around the scrap of cloth over each nipple. You instruct them to tell you about themselves.`
		]);

		App.Events.addParagraph(node, r);
		r = [];
		r.push(
			`One of them speaks up.`,
			Spoken(sis2, `"We're twins, ${(V.PC.title !== 0) ? "sir" : "ma'am"}. Fraternal twins. We have been given hormone treatments and surgery to match one another more closely, except for one detail."`),
			`They lift their skirts; the speaker has a hormone-atrophied cock, while ${his} ${sister2} has a pussy, along with a large clit that almost matches ${his} sibling's member in size.`,
			Spoken(sis2, `"We've also been trained ever since we turned ${num(V.minimumSlaveAge)} to be completely obedient, ${(V.PC.title !== 0) ? "sir" : "ma'am"}, in everything, and sexually proficient."`)
		);
		App.Events.addParagraph(node, r);
		r = [];
		r.push(Spoken(sis2, `"We cost ${cashFormat(contractCost)}, ${(V.PC.title !== 0) ? "sir" : "ma'am"}."`));
		App.Events.addParagraph(node, r);
		App.UI.DOM.appendNewElement("p", node, `${His} ${sister2} is identical except that ${he2} is naturally female and lacks implants, having reached that size the normal way.`, "detail");

		const newSlaves = [sis1, sis2];

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

		if (V.cash >= (contractCost * 2)) {
			choices.push(new App.Events.Result(`Buy them both`, both, `This will cost ${cashFormat(contractCost * 2)}`));
		} else {
			choices.push(new App.Events.Result(null, null, `You lack the necessary funds to enslave them.`));
		}
		App.Events.addResponses(node, choices);

		function both() {
			newSlave(sis1);
			cashX(forceNeg(contractCost), "slaveTransfer", sis1);
			newSlave(sis2);
			cashX(forceNeg(contractCost), "slaveTransfer", sis2);
			return [
				`They giggle and kiss each other rather sexually, pressing their nearly identical bodies closely together so their hips and shapely buttocks hide any sign of their difference. They're clearly very well trained.`,
				newSlaveIncestSex(sis1, sis2)];
		}
	}
};


code:
App.Events.recetsMismatchedPair = class recetsMismatchedPair extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [
			() => V.seeDicks !== 0,
			() => V.seeDicks !== 100,
			() => (S.HeadGirl && S.HeadGirl.devotion > 50),
			() => V.rep / 400 > random(1, 100) || (V.debugMode > 0 && V.debugModeEventSelection > 0)
		];
	}

	get eventName() {
		return `Mismatched Pair`;
	}

	execute(node) {
		V.encyclopedia = "Enslaving People";
		const contractCost = 1500;
		const bro = GenerateNewSlave("XY", {
			minAge: V.minimumSlaveAge, maxAge: 21, disableDisability: 1, race: "nonslave"
		});
		bro.origin = "$He was sold into slavery by $his older sister.";
		bro.career = "a prostitute";
		bro.devotion = random(-15, 15);
		bro.trust = random(-15, 15);
		bro.oldDevotion = bro.devotion;
		bro.oldTrust = bro.trust;
		setHealth(bro, jsRandom(0, 20));
		bro.anus = 1;
		bro.vagina = -1;
		bro.dick = 1;
		if (bro.foreskin > 0) {
			bro.foreskin = bro.dick;
		}
		if (bro.balls > 0) {
			bro.scrotum = bro.balls;
		}
		bro.clit = 0;
		bro.balls = 1;
		bro.face = 15;
		bro.weight = 0;
		bro.skill.vaginal = 0;
		bro.skill.oral = 15;
		bro.skill.anal = 15;
		bro.boobs = 600;
		bro.boobsImplant = 400;
		bro.boobsImplantType = "normal";
		bro.butt = either(1, 2);
		bro.preg = -2;
		bro.birthWeek = 0;
		bro.sexualFlaw = "hates anal";
		bro.hStyle = "tails";
		bro.pubicHStyle = "waxed";
		bro.underArmHStyle = "waxed";
		setMissingParents(bro);
		bro.canRecruit = 0;
		bro.rivalry = 3;
		let cost = slaveCost(bro);
		cost -= 1500;

		const sis = generateRelatedSlave(bro, "older sister");
		sis.origin = "You acquired $him along with $his sissy sister due to $his inexperience as a madam.";
		sis.career = "a pimp";
		sis.devotion -= 50;
		sis.trust -= 10;
		sis.oldDevotion = sis.devotion;
		sis.oldTrust = sis.trust;
		sis.skill.vaginal = 0;
		sis.skill.oral = 0;
		sis.skill.anal = 0;
		sis.behavioralFlaw = "arrogant";
		sis.sexualFlaw = "hates penetration";
		sis.boobs = either(400, 500);
		sis.boobsImplant = 0;
		sis.boobsImplantType = "none";
		sis.butt = either(2, 3);
		sis.rivalry = 3;
		sis.rivalryTarget = bro.ID;
		bro.rivalryTarget = sis.ID;

		const {
			He, His,
			he, his, him, himself, sister
		} = getPronouns(bro);
		const {
			He2, His2,
			he2, him2, his2, sister2,
		} = getPronouns(sis).appendSuffix("2");
		const {
			He3,
			he3,
		} = getPronouns(S.HeadGirl).appendSuffix("3");

		const {title: Master} = getEnunciation(S.HeadGirl);

		App.Events.addParagraph(node, [
			`Your Head Girl comes to see you. ${He3} flags a slave posted for sale on your desk. The posting seems completely unimpressive — just a bitch barely past ${his} ${ordinalSuffix(bro.actualAge)} birthday with basic implants and a pathetic little dick — until ${he3} points out that the person posting ${him} for sale is ${his} ${sister2}. ${His} ${sis.actualAge - bro.actualAge > 3 ? `` : `slightly`} older, naturally female ${sister2}. Who, to go by the pictures, the younger sibling has desperately been trying to mold ${himself} to look more like.`,
			Spoken(S.HeadGirl, `"It won't show on the desk yet, but rumor is the little cunt's gotten them both in bad debt, ${Master}. You could grab them both cheap."`),
			`You bring up a video feed of the one-room apartment they share. A man, clearly a client, is sitting on the bed while the sissy rides him. ${He}'s facing away from the john, so ${he} isn't trying to hide the fact that ${he} isn't happy selling ${his} anus for money. The older ${sister2} is naked, but ${he2}'s trying to act as a pimp of sorts rather than helping fuck. ${He2} alternately poses and preens for the john and nonverbally scolds the wincing sissy when he's not paying attention. After the customer finishes, the sissy heads to the toilet to clean ${himself}, and ${his} older ${sister2} whispers to the john that the sissy's for sale. The john laughs at ${him2} and excuses himself.`
		]);

		let r = [];
		r.push(`Enslaving the younger, sissy ${sister} will cost ${cashFormat(contractCost)}. Alternatively, you could sell your rights to ${him}. Including costs, this will bring in ${cashFormat(cost - contractCost)}. As a third option, for ${cashFormat(contractCost * 2)} you could enslave both`);
		if (sister === sister2) {
			r.push(`${sister}s,`);
		} else {
			r.push(`siblings,`);
		}
		r.push(`but you wouldn't be able to examine the older one first. ${He2}'ll likely be very rebellious and sexually unskilled.`);
		App.Events.addParagraph(node, r);

		const newSlaves = [bro]; /* caller doesn't want relative involved, so you don't get to inspect her even if you can force a sale */

		node.append(App.UI.MultipleInspect(newSlaves, true, "generic"));
		const choices = [];

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

		function enslave() {
			bro.mother = 0;
			bro.father = 0;
			bro.rivalry = 0;
			bro.rivalryTarget = 0;
			newSlave(bro);
			cashX(forceNeg(contractCost), "slaveTransfer", bro);
			return `The poor sissy isn't happy to become a slave, but ${he}'s clearly relieved to be away from ${his} ${sister2}. The bitch isn't likely to have an easy time; the sale didn't clear ${him2} from debt. ${bro.slaveName} describes ${his} basic sexual experience, which includes a lot of sucking and anal whoring. Without further ado ${he} moves from practical sexual slavery at the hands of ${his} ${sister2} to actual sexual slavery.`;
		}

		function sell() {
			cashX(cost, "slaveTransfer");
			return `${bro.slaveName} accepts being resold without much fuss. ${He}'s merely exchanged one unknown owner for another. For all ${he} knows ${his} new buyer will be less abusive than you would have been. ${He} would be less complacent if ${he} knew who ${his} buyers are; ${he}'ll be immured in an arcade within the hour.`;
		}

		function both() {
			newSlave(bro);
			cashX(forceNeg(contractCost), "slaveTransfer", bro);
			newSlave(sis);
			cashX(forceNeg(contractCost), "slaveTransfer", sis);
			const frag = new DocumentFragment();
			App.Events.addParagraph(frag, [`The poor sissy isn't happy to become a slave, but ${he}'s clearly relieved to be away from ${his} ${sister2}. The bitch isn't likely to have an easy time; the sale didn't clear ${him2} from debt. ${bro.slaveName} describes ${his} basic sexual experience, which includes a lot of sucking and anal whoring. Without further ado ${he} moves from practical sexual slavery at the hands of ${his} ${sister2} to actual sexual slavery.`]);
			App.Events.addParagraph(frag, [`${His} ${sister2}-pimp walks in angrily demanding to know why you called ${him2} here. ${He2} sees ${his2} sissy ${sister} kneeling naked next to you, hears the hiss-click of the door closing and locking behind ${him2}, and makes the connection far too late to run. ${He2} begins to scream at both you and ${his2} ${sister} at the top of ${his2} lungs, and manages to keep up an impressive volume until you get ${him2} gagged. ${His2} ${sister} does not move to interfere as you strip and bind ${his2} struggling body. In fact, as you get the gag in place, ${he} begins to laugh an unstable, cracking laugh that degenerates into sobbing.`]);
			return frag;
		}
	}
};