code:
App.Events.RESSMoistPussy = class RESSMoistPussy extends App.Events.BaseEvent {
	eventPrerequisites() {
		return []; // always valid if sufficient actors can be cast successfully
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.assignment !== Job.QUARTER,
				s => s.devotion > 20,
				s => s.vaginaLube > 1,
				hasAnyArms,
				canDoVaginal,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);
		const belly = bellyAdjective(eventSlave);

		V.nextLink = "Next Week";

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

		let t = [];
		t.push("Just as you're about to give");
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`${his} weekly inspection, a minor business matter comes up and diverts your attention.`);
		t.push(`So, for about ten minutes, ${he} has nothing at all to do other than ${canWalk(eventSlave) ? "stand" : hasAnyLegs(eventSlave) ? "kneel" : "sit"} in front of your desk in your office, ${canSee(eventSlave) ? "watching" : canHear(eventSlave) ? "listening to" : "feeling the subtle vibrations from"} you, ${(V.assistant.personality > 0) ? `${V.assistant.name}'s avatar,` : ""} the other slaves who come and go, and the general lewdness of the arcology, much of which is ${(canSee(eventSlave)) ? "visible" : canHear(eventSlave) ? "audible" : "apparent"} from right here.`);
		if ((eventSlave.attrXY > 50) && (V.PC.boobs < 300)) {
			t.push(`${He} finds your strong body attractive, and ${his} gaze rests most frequently ${canSee(eventSlave) ? "on" : "towards"} you.`);
		} else if ((eventSlave.attrXX > 50) && (V.PC.boobs >= 650)) {
			t.push(`${He} finds your prominent breasts attractive, and ${his} gaze rests most frequently ${canSee(eventSlave) ? "on" : "towards"} them.`);
		} else if (eventSlave.fetish === "pregnancy") {
			if (eventSlave.preg > eventSlave.pregData.normalBirth / 1.33) {
				t.push(`The combination of being hugely pregnant and a pregnancy fetishist keeps ${his} libido raging.`);
			} else if (V.PC.belly >= 10000) {
				t.push(`${He} finds your protruding pregnancy attractive, and ${his} gaze rests most frequently ${canSee(eventSlave) ? "on" : "towards"} it.`);
			}
		} else if (eventSlave.aphrodisiacs > 0 || eventSlave.inflationType === "aphrodisiac") {
			t.push(`The aphrodisiacs ${he}'s on never let ${his} libido rest for long.`);
		} else if (eventSlave.energy > 95) {
			t.push(`${His} nymphomania keeps ${him} perpetually ${canSee(eventSlave) ? "watchful for any sexual sights" : canHear(eventSlave) ? "listening for sexual acts" : "eager for sexual acts"}, especially any which promise ${his} participation.`);
		} else if (eventSlave.energy > 40) {
			t.push(`${His} healthy sex drive does its work, and with the constant coming and going ${he}'s not starved for things ${he} finds attractive.`);
		} else {
			t.push(`Despite ${his} weak libido, ${he}'s been a sex slave long enough that ${his} body knows that it may be called upon to render sexual service soon.`);
		}
		t.push(`The consequences of the special qualities of ${his} womanhood soon become apparent.`);
		App.Events.addParagraph(node, t);

		t = [];
		t.push(`Your slaves are all in the very best of vaginal health, so the scent of ${his} female arousal is not strong. But ${his} cunt produces such copious natural lubricant that with nothing to do but ${canWalk(eventSlave) ? "stand" : "rest"} there, ${his} ${eventSlave.counter.births > 0 ? "motherly" : eventSlave.weight > 30 ? "thick" : eventSlave.muscles > 30 ? "strong" : "feminine"} inner thighs are soon slick with a sheen of healthy pussyjuice. You notice a droplet of the stuff running down ${his} warm ${eventSlave.skin} skin.`);
		if (canAchieveErection(eventSlave) && eventSlave.chastityPenis !== 1) {
			t.push(`${His} ${eventSlave.dick > 3 ? "stiff prick" : "hard little dick"} is sticking up from atop ${his} pussy, leaving it nice and visible.`);
		} else if (eventSlave.dick > 0) {
			t.push(`${His} pussy is ${eventSlave.dick > 3 ? "entirely" : "partially"} concealed by ${his} limp dick, which is getting a good coating, since it's resting against the source.`);
		}
		if (eventSlave.labia > 0) {
			t.push(`${His} prominent labia is flushed and moist, and frame ${his} womanhood invitingly.`);
		}
		if (eventSlave.clit > 0) {
			t.push(`${His} clit is rapidly becoming visible as the blood rushes there from every other part of ${his} body.`);
		}
		if (eventSlave.bellyPreg >= 10000) {
			t.push(`${His} huge pregnancy heaves a little as ${he} starts to breathe a bit harder, and the visual connection between ${his} gravid belly and ${his} needy womanhood is inescapable.`);
		}
		t.push(`${He}'s a good ${SlaveTitle(eventSlave)}, and remains obediently before your desk, filling your office with ${his} subtle perfume as ${he} waits for you.`);

		App.Events.addParagraph(node, t);
		App.Events.addResponses(node, [
			new App.Events.Result(`Make love to ${his} ready cunt`, love, virginityWarningLove()),
			new App.Events.Result(`Pound ${his} wet pussy`, pound, virginityWarningPound()),
			new App.Events.Result(`Feed ${him} ${his} own pussyjuice`, feed),
		]);

		function love() {
			let container = document.createDocumentFragment();
			t = [];

			t.push(`${His} body is so perfectly made to be fucked that it's getting itself ready for you, without your even having to give the order.`);
			t.push(`Deciding not to bother with verbal commands, you approach ${him} and reach for one of ${his} hands; ${he} obediently extends it towards your grasp, and follows`);
			if ((eventSlave.energy > 40) || (eventSlave.aphrodisiacs > 0) || eventSlave.inflationType === "aphrodisiac") {
				t.push("eagerly");
			} else {
				t.push("willingly");
			}
			t.push(`as you pull ${him} in for a`);
			if (eventSlave.boobs > 5000) {
				t.push(`hug (cushioned by ${his} enormous udders),`);
			} else if (eventSlave.belly >= 10000) {
				t.push(`hug (quite a stretch thanks to ${his} ${belly} belly),`);
			} else if (eventSlave.dick > 5) {
				t.push(`hug (made rather lewd by ${his} enormous penis),`);
			} else {
				t.push(`hug,`);
			}
			t.push(`kiss ${him} deeply, and slide your arms down ${his}`);
			if (eventSlave.weight > 160) {
				t.push(`rippling`);
			} else if (eventSlave.weight > 95) {
				t.push(`soft`);
			} else if ((eventSlave.muscles > 95)) {
				t.push(`ripped`);
			} else if ((eventSlave.muscles > 30)) {
				t.push(`muscular`);
			} else if ((eventSlave.muscles > 5)) {
				t.push(`toned`);
			} else {
				t.push(`soft`);
			}
			t.push(`back to`);
			if (eventSlave.butt > 12) {
				t.push(`sink your arms into ${his} expansive`);
			} else if (eventSlave.butt > 6) {
				t.push(`heft ${his} monstrous`);
			} else if (eventSlave.butt > 3) {
				t.push(`squeeze ${his} healthy`);
			} else {
				t.push(`cup ${his} cute little`);
			}
			t.push(`buttocks. ${He} ${eventSlave.voice > 0 ? "coos" : "hums mutely"} at the feeling of your ${V.PC.title === 1 ? "strong" : "feminine"} hands on ${his} bottom, and presses ${him}self against you as you rotate the two of you until you can set ${his} butt on the edge of your desk and ${V.PC.dick !== 0 ? `slide your big dick into ${his} well-lubricated cunt.` : `assertively press your own pussy against ${his} wet cunt.`}`);
			App.Events.addParagraph(container, t);

			t = [];
			t.push(`${He} makes as if to lie back and take it, but you keep an arm around ${his} back and hug ${his}`);
			if (eventSlave.boobs > 2000 || eventSlave.belly >= 5000) {
				if (eventSlave.boobs > eventSlave.belly) {
					t.push(`as closely as ${his} big breasts will permit.`);
				} else {
					t.push(`as closely as ${his} ${belly} ${eventSlave.bellyPreg >= 3000 ? "pregnant belly" : "belly"} will permit.`);
				}
			} else if (V.PC.belly >= 5000) {
				t.push(`as closely as your pregnant belly will permit.`);
			} else {
				t.push(`closer than ever.`);
			}
			t.push(`You take your other hand and place a firm but loving grip under ${his} chin, lifting ${his} ${App.Desc.eyeColor(eventSlave)}-eyed gaze to meet yours before kissing ${him} again. All the while, you`);
			if (V.PC.dick !== 0) {
				t.push(`fuck ${him} powerfully, withdrawing your dick almost all the way and then hilting yourself in ${his} soaked slit.`);
				t.push(VCheck.Vaginal(1, eventSlave));
			} else {
				t.push(`trib ${him} with assurance, grinding your hips against ${he}rs and making ${him} feel your heat.`);
				seX(eventSlave, "vaginal", V.PC, "penetrative");
			}
			t.push(`${He} clings to you, accepting the closeness to ${his} ${WrittenMaster(eventSlave)} and enjoying the loving attention, even as the extreme wetness of ${his} cunt and your ${V.PC.dick !== 0 ? "powerful thrusting" : "hungry grinding"} begin to produce lewd noises from between you.`);
			t.push(`${His} generous natural lubrication lessens the friction and sensation a little, and you go for a long time before you both climax.`);
			t.push(`You lead ${him} into your office shower, since you're both coated in ${his} pussyjuice${V.PC.dick !== 0 ? ` and ${he}'s carrying a big load of your cum` : ", and your own"}.`);
			t.push(`Under the hot water, you don't even have to pull ${him} close; <span class="hotpink">${he} presses ${him}self into your arms on ${his} own.</span>`);
			if (eventSlave.sexualQuirk === "romantic") {
				t.push(`For an incorrigible romantic like ${him}, this encounter was perfect, and ${he} <span class="hotpink">loves you all the more for it.</span>`);
				eventSlave.devotion += 3;
			}
			eventSlave.devotion += 5;
			App.Events.addParagraph(container, t);

			return [container];
		}

		function pound() {
			t = [];

			t.push(`${He}'s so generously lubricated that ${he}'s ready to take a good hard fuck, so you decide to give ${him} one.`);
			t.push(`You point at the ground, and you don't even have to tell ${him} to get down on all fours and get ready to take it.`);
			if (canSee(eventSlave)) {
				t.push(`Your gesture says it for you, and ${he} obediently gets down and gets in position to be bred like a bitch.`);
			} else {
				t.push(`The atmosphere of the room says it for you, and ${he} obediently gets down and gets in position to be bred like a bitch.`);
			}
			t.push(`${He} angles ${his} hips just right to offer ${his} cunt to you,`);
			if (eventSlave.belly >= 300000) {
				t.push(`an endeavor given the size of ${his} middle,`);
			} else if (eventSlave.belly >= 5000) {
				t.push(`while giving ${his} rounded middle room to hang,`);
			}
			t.push(`and even reaches down to spread ${his} ${eventSlave.labia > 1 ? "dangling labia" : "labia"} to invite you into ${his} pink channel.`);
			if (V.PC.dick !== 0) {
				if (eventSlave.vagina > 1) {
					t.push(`${He} can take your big dick without a twinge,`);
				} else {
					t.push(`Your big dick will fill ${his} tight cunt to its limits,`);
				}
				t.push(`but you grab ${his} hips and`);
			} else {
				t.push(`You select a strap-on that's right at the limits of ${his}`);
				if (eventSlave.vagina > 3) {
					t.push(`cavernous`);
				} else if (eventSlave.vagina > 2) {
					t.push(`big`);
				} else if (eventSlave.vagina > 1) {
					t.push(`open`);
				} else {
					t.push(`tight little`);
				}
				t.push(`cunt's capacity, don it, and`);
			}
			t.push(`mount ${him} with such force that your first stroke brings ${his} butt against your hips with an audible smack. There's also a deliciously lewd noise as ${V.PC.dick !== 0 ? "your invading penis" : "the invading phallus"} forces a little gush of pussyjuice out of ${him}.`);
			t.push(`${He} ${eventSlave.voice > 0 ? "shrieks, but it's a shriek" : "gasps, but it's a gasp"} of pleasure, and your rutting is so well-lubricated that ${he} has no trouble getting off on it. Wanting ${his} climax, you reach around ${him} and grab hold of ${his} pussy, feeling the slippery fluid between your fingers and the lewd thrusting motion as ${V.PC.dick !== 0 ? "your cock" : "the phallus"} pistons in and out of ${him}.`);
			t.push(`That bit of stimulation is enough to tip ${him} over, and you feel a gush of femcum against your hand as ${V.PC.dick !== 0 ? "your dickhead" : "the head of the strap-on"} forces an orgasm out of ${his} g-spot. ${He}'s so discombobulated that ${he} collapses into the puddle of pussyjuice ${he} left on the floor when you stand up and head off for a shower, but ${he} crawls after you as best ${he} can${hasBothLegs(eventSlave) ? " on rubbery legs." : "."}`);
			if (eventSlave.fetish === "submissive") {
				if (eventSlave.fetishKnown === 1) {
					t.push(`The ${SlaveTitle(eventSlave)} sub loves getting fucked like that, and`);
					if (eventSlave.fetishStrength > 95) {
						t.push(`<span class="lightsalmon">seems even more submissive</span>`);
						eventSlave.fetishStrength += 10;
					} else {
						t.push(`since ${he}'s fully confirmed in ${his} status as a sub, ${he} <span class="hotpink">glows with devotion</span>`);
						eventSlave.devotion += 3;
					}
					t.push(`as ${he} washes ${him}self in the shower with you.`);
				} else {
					t.push(`${He} seems utterly dissipated by the fucking ${he} just got, and may have just had the best sex of ${his} life. <span class="lightsalmon">${He}'s a submissive!</span>`);
					eventSlave.fetishKnown = 1;
				}
			}
			t.push(VCheck.Vaginal(1, eventSlave));
			eventSlave.devotion += 5;
			return t;
		}

		function feed() {
			t = [];

			t.push(`You approach ${him} and`);
			if (eventSlave.dick > 0) {
				t.push(`reach under ${his} girldick for ${his}`);
			} else if (eventSlave.balls > 3) {
				t.push(`reach under ${his} dangling balls`);
			} else {
				t.push(`cup ${his}`);
			}
			t.push(`sopping pussy. ${He} gasps as ${he} feels your cool grasp.`);
			t.push(`Your possessive hand encompasses ${his} vulva, with your index and ring fingers sliding around either side of ${his} pubic mound to grip ${his} entire womanhood.`);
			if (eventSlave.vagina > 0) {
				if (eventSlave.vagina > 1) {
					t.push(`${His} relaxed pussy almost draws your middle finger inward and upward,`);
				} else {
					t.push(`${His} pussy welcomes your middle finger,`);
				}
				t.push(`and you hook it inside ${his} body, gathering a healthy amount of pussyjuice and brushing ${his} g-spot.`);
			} else {
				t.push(`You're careful not to penetrate ${his} virgin slit with your middle finger, but you draw it up the exterior of ${his} channel, gathering a healthy amount of pussyjuice.`);
			}
			t.push(`Then you remove your hand, though the horny ${SlaveTitle(eventSlave)} unconsciously tries to follow the withdrawing digits. `);
			if (canSee(eventSlave)) {
				t.push(`${He} stares at you, waiting to see what you're going to do, and a blush begins to rise on ${his} ${eventSlave.skin} cheeks as ${he} sees you reaching for ${his} mouth. ${His}`);
			} else if (canHear(eventSlave)) {
				t.push(`${He} listens carefully to your movements, waiting to see what you're going to do, and a blush begins to rise on ${his} ${eventSlave.skin} cheeks as ${he} feels you reaching for ${his} mouth. ${His}`);
			} else {
				t.push(`stays as still as ${he} can, until ${his} ${eventSlave.skin} cheeks blush as ${he} feels you reaching for ${his} mouth. ${His}`);
			}
			if (eventSlave.lips > 95) {
				t.push(`facepussy`);
			} else if (eventSlave.lips > 40) {
				t.push(`pillowlike`);
			} else if (eventSlave.lips > 10) {
				t.push(`soft`);
			} else {
				t.push(`thin`);
			}
			t.push(`lips part and you insert all three of your fingers into ${his} hot mouth. ${He} quivers at the intimacy of the gesture, and the ${canTaste(eventSlave) ? "taste" : "feel"} of ${his} own juices. The tremor sends a delicious motion through ${his}`);
			if ((eventSlave.boobsImplant === 0) && (eventSlave.boobs > 300)) {
				t.push(`natural ${eventSlave.boobs > 2000 ? "udders." : "breasts."}`);
			} else if ((eventSlave.boobsImplant / eventSlave.boobs) >= 0.60) {
				t.push(`fake tits.`);
			} else if (eventSlave.weight > 160) {
				t.push(`fat folds.`);
			} else if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					t.push(`gravidness.`);
				} else if (eventSlave.bellyImplant >= 3000) {
					t.push(`distended belly.`);
				} else {
					t.push(`${eventSlave.inflationType}-filled belly.`);
				}
			} else if (eventSlave.weight > 95) {
				t.push(`soft body.`);
			} else if (canAchieveErection(eventSlave) && !(eventSlave.chastityPenis)) {
				t.push(`stiff prick.`);
			} else if (eventSlave.scrotum > 4) {
				t.push(`dangling balls.`);
			} else if (eventSlave.dick > 0) {
				t.push(`limp bitchclit.`);
			} else if (eventSlave.weight > 30) {
				t.push(`chubbiness.`);
			} else {
				t.push(`body.`);
			}
			t.push(`You keep your fingers where they are until ${he}'s licked them really clean. ${His} hot tongue runs repeatedly between each of your fingers`);
			if (eventSlave.tonguePiercing > 0) {
				t.push(`and the smooth hardness of ${his} tongue piercing brushes against them`);
			 }
			t.push(t.pop() + ".");
			t.push(`${He} ${eventSlave.voice > 0 ? "moans whorishly" : "begins to pant"} when you go back for more, and the third time you harvest ${his} own pussyjuice to feed it to ${him}, ${he} orgasms, adding some femcum to ${his} next little meal licked off your fingers.`);
			t.push(`${His} ${canSee(eventSlave) ? "eyes shine" : "face is alight"} with <span class="mediumaquamarine">gratitude and trust.</span>`);
			eventSlave.trust += 5;
			return t;
		}

		function virginityWarningLove() {
			return (eventSlave.vagina === 0 && V.PC.dick !== 0) ? `This option will take ${his} virginity` : null;
		}

		function virginityWarningPound() {
			return eventSlave.vagina === 0 ? `This option will take ${his} virginity` : null;
		}
	}
};


code:
App.Events.RESSMuscles = class RESSMuscles extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				hasAnyArms,
				hasAnyLegs,
				s => s.muscles > 30,
				s => s.weight <= 10
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);

		V.nextLink = "Next Week";

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

		let t = [];
		t.push(`Early one morning,`);
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		if (!canWalk(eventSlave)) {
			t.push(`crawls`);
		} else if ((eventSlave.shoes === "heels") || (eventSlave.shoes === "pumps") || (eventSlave.shoes === "boots") || (eventSlave.shoes === "extreme heels")) {
			t.push(`totters`);
		} else if (eventSlave.belly >= 10000) {
			t.push(`waddles`);
		} else {
			t.push(`walks`);
		}
		t.push(`past your door stark naked, with a towel thrown over ${his} shoulder. ${He}'s clearly moving from the gym to the showers after a hard workout; ${he}'s quite the iron pumper and gets up before anyone to protect ${his} gains. ${He} notices your gaze, so ${he} subtly flexes for your benefit. Cords of muscle ripple along ${his} massive thighs,`);
		if (eventSlave.bellyPreg >= 15000) {
			// no abs
		} else if (eventSlave.bellyPreg >= 10000) {
			t.push(`pregnancy ruined abs,`);
		} else if (eventSlave.belly >= 10000) {
			t.push(`hints of what were once abs across ${his} ${bellyAdjective(eventSlave)} taut middle,`);
		} else if (eventSlave.belly >= 1500) {
			t.push(`broadening abs,`);
		} else {
			t.push(`washboard abs,`);
		}
		t.push(`ripped biceps, and strapping lats.`);
		if (eventSlave.dick > 2) {
			t.push(`${His} massive cock completes the picture.`);
		}
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`Reward ${him} for ${his} gains`, reward, fuckNote()),
			new App.Events.Result(`Take advantage of ${his} gains with a powerfuck`, powerfuck, fuckNote()),
			((eventSlave.toyHole === "dick" || V.policies.sexualOpeness === 1) && canPenetrate(eventSlave) && eventSlave.belly < 100000)
				? new App.Events.Result(`See if ${he} can put those gains to good use`, penetration, "This option will penetrate you")
				: new App.Events.Result(),
			new App.Events.Result(`Compliment ${his} gains and send ${him} on ${his} way`, compliment),
		]);

		function fuckNote() {
			if (V.PC.dick > 0) {
				if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
					return `This option will take ${his} virginity`;
				} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0)) {
					return `This option will take ${his} anal virginity`;
				}
			}
			return null;
		}

		function reward() {
			let t = [];
			t.push(`You tell ${him} to spread ${his} towel on the floor and lie`);
			if (eventSlave.belly >= 5000) {
				t.push(`on ${his} side on it. You lie next to ${him} and`);
			} else {
				t.push(`face-down on it. You`);
			}
			t.push(`run your hands across ${his} sweaty ${V.seeRace === 1 ? eventSlave.race : ""} muscles before giving ${him} a thorough, skillful and very intense massage. ${He} moans and grunts as you work the lactic acid out of ${his} muscles, slowly reducing ${him} to a puddle of ripped sex slave. As you're rubbing ${him} down to finish the massage, ${he} meekly begs you to fuck ${him}.`);
			if (!canDoVaginal(eventSlave) && !canDoAnal(eventSlave)) {
				t.push(`You tell ${him} that's not an option and pull ${him} into a kiss instead. It's a strange sensation, this mass of muscle lying quietly still in your arms you, whimpering with delight as you gently make out with ${him}. Your wandering hands eventually tip ${him} over the edge; ${he} hugs you tight as ${he} shakes with orgasm. Once ${he} stops crushing you, you return to enjoying ${his} sweaty body.`);
			} else {
				t.push(`As ${he} lies still,`);
				if (V.PC.dick === 0) {
					t.push(`you lift one of ${his} legs and straddle yourself in to bring your groin against ${hers}. It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently scissor yourself against ${him}. ${He} comes in no time at all. When ${he} does ${he} squeezes you between vicelike thighs, ${V.PC.vagina !== -1 ? "pressing your pussy deliciously and" : ""} bringing you to climax, too.`);
				} else {
					t.push(`you slowly push your cock into ${his}`);
					if (canDoVaginal(eventSlave)) {
						t.push(`pussy; ${he}'s so relaxed from the massage that it slides in easily.`);
						t.push(VCheck.Vaginal(1, eventSlave));
						t.push(`It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently penetrate ${him}. ${He} comes in no time at all. When ${he} does you happen to be halfway inside ${him}; ${he} wraps ${his} legs around you and pulls you into ${his} depths. You explode into ${him} as ${he} holds you in place with ${his} vicelike thighs.`);
					} else {
						t.push(`ass; ${he}'s so relaxed from the massage that it slides in easily.`);
						t.push(VCheck.Anal(1, eventSlave));
						t.push(`It's a strange sensation, this mass of muscle lying quietly still beneath you, whimpering with delight as you gently take ${his} ass. ${He} comes in no time at all. When ${he} does you happen to be halfway inside ${him}; ${his} sphincter mercilessly squeezes your head while ${his} muscular buttocks clench your shaft between them. You explode into ${him}.`);
					}
				}
				if (eventSlave.dick > 0) {
					t.push(`As ${he} stands, ${his} now-softening penis drips cum.`);
				}
			}
			t.push(`<span class="devotion inc">${His} love for you has increased.</span>`);
			eventSlave.devotion += 4;
			return t;
		}

		function powerfuck() {
			let t = [];
			t.push(`It's time to see if ${he}'s got anything left in those sore ${V.seeRace === 1 ? eventSlave.race : ""} muscles. You push the towel off ${his} shoulder, take a lick of the delicious salty sweat along ${his} collarbone, and get to work. For the next hour, you put ${him} through a series of sexual positions that require ${him} to balance and support ${himself} in difficult positions. ${He} hangs from the ceiling, goes up on one tiptoe, and fucks in a handstand. ${He}'s as muscular inside as ${he} is outside.`);
			if (V.PC.dick === 0) {
				t.push(`You climax repeatedly, mixing your pussy juice with ${his} sweat all across ${his} body.`);
			} else {
				if (canDoVaginal(eventSlave)) {
					t.push(VCheck.Vaginal(1, eventSlave));
					t.push(`You come repeatedly, and before long cum is dripping out of ${his} pussy as you continue.`);
				} else if (canDoAnal(eventSlave)) {
					t.push(VCheck.Anal(1, eventSlave));
					t.push(`You come repeatedly, and before long cum is dripping out of ${his} ass as you continue.`);
				} else {
					t.push(`You come repeatedly, leaving ropes of your cum all across ${his} sweaty body.`);
				}
			}
			if (eventSlave.dick > 0) {
				t.push(`From position to position, ${his} erection adds its own fluids to the mess on the floor.`);
			}
			t.push(`By the end, ${he}'s shaking from muscle fatigue and panting ${his} gratitude. <span class="trust inc">${His} confidence in ${his} place has increased.</span>`);
			eventSlave.trust += 4;
			return t;
		}

		function penetration() {
			let t = [];
			t.push(`It's time to see if ${he}'s got anything left in those sore ${V.seeRace === 1 ? eventSlave.race : ""} muscles. You order ${him} to take you in a standing fuck${V.PC.belly >= 10000 ? ", a tall order given how pregnant you are" : ""}. Despite how exhausted ${he} is, ${he} manages to lift you and hilt ${himself} in your`);
			if (V.PC.vagina !== -1) {
				t.push("pussy.");
			} else {
				t.push("ass.");
			}
			t.push(`You feel ${his} quivering trying to hold you up, so you permit ${him} to take you against the wall; a welcome respite for the`);
			if (eventSlave.belly >= 5000) {
				if (eventSlave.bellyPreg >= 3000) {
					if (eventSlave.belly >= 100000) {
						t.push("massively");
					} else if (eventSlave.belly >= 10000) {
						t.push("hugely");
					}
					t.push("pregnant");
				} else if (eventSlave.bellyFluid >= 5000) {
					t.push(`${eventSlave.inflationType} filled`);
				} else {
					t.push(`${bellyAdjective(eventSlave)} bellied`);
				}
			}
			t.push("sweaty");
			if (eventSlave.physicalAge > 30) {
				t.push(`MILF.`);
			} else if (eventSlave.physicalAge > 17) {
				t.push(`slave${girl}.`);
			} else if (eventSlave.physicalAge > 12) {
				t.push(`teenager.`);
			} else {
				t.push(`kid.`);
			}
			t.push(`${He} dominantly fucks you, ${his} muscles flexing powerfully with every thrust. You're no slouch when it comes to muscles yourself, so when you feel ${him} tense with orgasm you wrap your legs around ${him} and hilt ${him} deep inside you. This only encourages ${him} to fuck you harder, quickly bring you to climax as well. ${He} gently carries you to your couch, where ${he} slides in behind you for a little post-coitus spooning. You definitely appreciate ${his} gains after such a good fuck. ${His} confidence in ${his} place has increased, as has ${his} love for you.`);
			eventSlave.trust += 4;
			eventSlave.devotion += 4;
			if (V.PC.vagina === -1) {
				seX(eventSlave, "penetrative", V.PC, "anal");
			} else {
				seX(eventSlave, "penetrative", V.PC, "vaginal");
			}
			if (canImpreg(V.PC, eventSlave)) {
				knockMeUp(V.PC, 50, 0, eventSlave.ID);
			}
			return t;
		}

		function compliment() {
			return [`${He} finishes posing with an impressive display of ${his} obliques. ${He} walks powerfully to the shower, ${his} ripped buttocks delineating each step. The shower is glass-walled. As ${he} washes, several of your other slaves are waking up and starting their days. They can't help but stare as ${eventSlave.slaveName} soaps ${himself}. ${eventSlave.slaveName} enjoys the attention.`];
		}
	}
};

repo_name: KnightBoulegard/fc

license: mit


code:
App.Events.RESSWaistlineWoes = class RESSWaistlineWoes extends App.Events.BaseEvent {
	eventPrerequisites() {
		return [];
	}

	actorPrerequisites() {
		return [
			[ // single event slave
				s => s.fetish !== "mindbroken",
				canHear,
				hasAnyArms,
				hasAnyLegs,
				s => s.devotion > 20 && s.devotion <= 50,
				s => s.trust > 20 && s.trust <= 50,
				s => s.weight > 20 && s.weight <= 30,
			]
		];
	}

	execute(node) {
		/** @type {Array<App.Entity.SlaveState>} */
		let [eventSlave] = this.actors.map(a => getSlave(a));
		const {
			He, he, His, his, hers, him, himself, girl
		} = getPronouns(eventSlave);
		const {title: Master} = getEnunciation(eventSlave);

		V.nextLink = "Next Week";

		App.Events.drawEventArt(node, eventSlave);

		let t = [];
		t.push(App.UI.DOM.slaveDescriptionDialog(eventSlave));
		t.push(`has spent the last half-hour pacing up and down the hall before your office, clearly lost in thought. While ${he} has nowhere to be at the moment, it is beginning to become a detriment to your work, so you call ${him} in to get to the bottom of the matter.`);
		App.Events.addParagraph(node, t);

		t = [];
		if (canTalk(eventSlave)) {
			t.push(`"${Master}," ${he} mumbles,`);
			t.push(Spoken(eventSlave, `"am I looking a little heavier?"`));
		} else {
			t.push(`${He} gestures at ${his} middle and`);
		}
		/* WIP specific clothing stuff, right now clothed slaves are not final so don't worry about how little sense it makes */
		switch (eventSlave.clothes) {
			case "clothes":
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"This ${eventSlave.clothes} feels tight around my middle, I feel like it fit last week..."`));
					t.push(He);
				}
				t.push(`adjusts ${his} clothing, clearly uncomfortable.`);
				break;
			default:
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"I feel like I wasn't this soft last week..."`));
					t.push(He);
				}
				t.push(`pinches ${his} belly, clearly grabbing hold of more of ${himself} than ${he} wants to.`);
		}
		t.push(`The ${SlaveTitle(eventSlave)} is`);
		if (eventSlave.diet === "fattening") {
			t.push(`purposefully being fattened up, so it really shouldn't come as a surprise to ${him}.`);
		} else if (eventSlave.behavioralFlaw === "gluttonous") {
			t.push(`a known stress eater, so perhaps somebody has been sneaking food again.`);
		} else if (eventSlave.behavioralFlaw === "anorexic") {
			t.push(`a known anorexic, so ${he}'s likely overreacting.`);
		} else {
			t.push(`certainly a little chubby, so perhaps this is a good time to get a handle on things.`);
		}
		App.Events.addParagraph(node, t);

		App.Events.addResponses(node, [
			new App.Events.Result(`Yes`, uFatGirl),
			new App.Events.Result(`No`, uThinGirl),
			new App.Events.Result(`Encourage ${him} to get bigger`, encourage),
			new App.Events.Result(`Send ${him} to the gym`, gym),
			(canDoAnal(eventSlave) || canDoVaginal(eventSlave))
				? new App.Events.Result(`Help ${him} burn some calories`, sex, virginityWarning())
				: new App.Events.Result(),
			/* ((eventSlave.toyHole === "dick" || V.sexualOpeness === 1) && canPenetrate(eventSlave) && (eventSlave.belly + V.PC.belly < 5000) && ((eventSlave.height >= V.PC.height * 1.5) || eventSlave.muscles > 70))
				? new App.Events.Result(`Take ${him} for a jog`, jogging, "This option will penetrate you")
				: new App.Events.Result(),*/
			new App.Events.Result(`Send ${him} on ${his} way`, shoo),
		]);

		function virginityWarning() {
			if (V.PC.dick > 0) {
				if (canDoVaginal(eventSlave) && (eventSlave.vagina === 0)) {
					return `This option will take ${his} virginity`;
				} else if (!canDoVaginal(eventSlave) && canDoAnal(eventSlave) && (eventSlave.anus === 0)) {
					return `This option will take ${his} anal virginity`;
				}
			}
			return null;
		}

		function uFatGirl() {
			let t = [];
			if ((eventSlave.diet === "fattening" || eventSlave.dietMilk > 0) && eventSlave.intelligence + eventSlave.intelligenceImplant > 15) {
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"So the diet is working well, ${Master}? That's good, I suppose. I'm just a bit shocked at how honest you were; people usually try to dodge that question or outright lie."`));
				} else {
					t.push(`${He} smiles before explaining ${he} knows you want ${him} plumper and that ${he} accepts it, but is surprised by your honesty to such a question.`);
				}
				t.push(`${He} leaves your office <span class="trust inc">slightly more trusting</span> for someone whose life is now entirely out of their hands.`);
				eventSlave.trust++;
			} else if (eventSlave.behavioralFlaw === "gluttonous") {
				if (canTalk(eventSlave)) {
					t.push(`${His} eyes begin to water as ${he} struggles not to sob.`);
					t.push(Spoken(eventSlave, `"But... I can't help it, why would you say that?"`));
					t.push(`${He} breaks done completely and hastily flees your sight, likely to the cafeteria, jiggling in all the wrong places.`);
				} else {
					t.push(`${His} eyes begin to water as ${he} struggles not to sob, but ${he} quickly loses composure and hastily flees your gaze, likely to the cafeteria.`);
				}
				t.push(`${He} may have run out of your office in tears, but ${he}'ll quickly come to terms with all that matters is your judgment, not ${hers}. Even more so when ${he} realizes the resulting stress eating only filled ${him} out more.`);
				eventSlave.devotion += 7;
				eventSlave.trust -= 5;
				eventSlave.weight += 5;
			} else if (eventSlave.behavioralFlaw === "anorexic") {
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"I'm so disgusting, ${Master}, I'm glad you see it too. I was so certain you'd lie to me... Sorry to have wasted your time."`));
					t.push(He);
				} else {
					t.push(`${His} face lightens at your ${canHear(eventSlave) ? "words" : "affirmation"}. It seems you told ${him} just what ${he} wanted to hear${!canHear(eventSlave) ? ", so to speak" : ""}. ${He} gives ${his} thanks and`);
				}
				t.push(`leaves your office with <span class="devotion inc">slightly more faith</span> in ${his} ${WrittenMaster(eventSlave)}.`);
				eventSlave.devotion += 5;
			} else {
				if (canTalk(eventSlave)) {
					t.push(`${His} eyes begin to water as ${he} struggles not to sob.`);
					t.push(Spoken(eventSlave, `"But... But... I'm not... Why would you say that?"`));
					t.push(`${He} breaks done completely and hastily flees your sight, jiggling in all the wrong places.`);
				} else {
					t.push(`${His} eyes begin to water as ${he} struggles not to sob, but ${he} quickly loses composure and hastily flees your gaze.`);
				}
				t.push(`${He} may have run out of your office <span class="trust dec">in tears,</span> but ${he}'ll quickly come to terms with all that matters is <span class="devotion inc">your judgment, not ${hers}.</span>`);
				eventSlave.devotion += 5;
				eventSlave.trust -= 5;
			}
			return t;
		}

		function uThinGirl() {
			let t = [];
			if ((eventSlave.diet === "fattening" || eventSlave.dietMilk > 0) && eventSlave.intelligence + eventSlave.intelligenceImplant > 15) {
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"I know you want me to gain weight, ${Master}, so you don't need to spare my feelings. It's a nice gesture, though."`));
				} else {
					t.push(`${He} frowns before explaining ${he} knows you want ${him} plumper and that ${he} accepts it, but does appreciate the thought.`);
				}
				t.push(`${He} leaves your office in <span class="devotion inc">a good mood</span> for someone being forced to gain weight.`);
				eventSlave.devotion++;
			} else if (eventSlave.behavioralFlaw === "gluttonous") {
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"It's okay ${Master}, you don't have to lie to me. I know this is my fault, but thank you for trying to cheer me up."`));
				} else {
					t.push(`${He} frowns before explaining ${he} has only ${himself} to blame for ${his} weight, but does appreciate the thought.`);
				}
				t.push(`${He} leaves your office in <span class="devotion inc">good spirits</span> for nearly no effort.`);
				eventSlave.devotion++;
			} else if (eventSlave.behavioralFlaw === "anorexic") {
				if (canTalk(eventSlave)) {
					t.push(Spoken(eventSlave, `"Don't lie to me, ${Master}! You really think I don't know I'm a bloated hog!?"`));
				} else {
					t.push(`${His} face contorts into a vicious glare; it seems you choose the wrong thing to say.`);
				}
				t.push(`${He} runs out of your office <span class="devotion dec">in tears.</span> It's likely that ${he}'ll <span class="trust dec">dwell on your response</span> for some time.`);
				eventSlave.devotion -= 10;
				eventSlave.trust -= 10;
			} else {
				t.push(`Of course ${he} hasn't gained any weight. ${He} ponders your response for a moment before replying`);
				if (canTalk(eventSlave)) {
					t.push(`"Thank you, ${Master}"`);
				} else {
					t.push(`with a smile`);
				}
				t.push(`and leaving your office with a <span class="devotion inc">happy spring in ${his} step.</span> Crisis averted.`);
				eventSlave.devotion++;
			}
			return t;
		}

		function encourage() {
			let t = [];
			t.push(`${He}'s left standing there blankly, uncertain on just how to respond to such a bold statement. ${He}'s even less certain when you invite ${him} to join you for lunch in the cafeteria for the rest of the week. You want chubby and what ${he} is barely comes close.`);
			if (eventSlave.behavioralQuirk === "insecure") {
				t.push(`${He} enjoys you watching ${him} stuff ${himself} and quivers with delight as you measure the progress of ${his} waistline. By week's end, you're treated to the lovely sight of ${his} new belly jiggling as ${he} passes by your office.`);
				eventSlave.weight += 10;
			} else if (eventSlave.behavioralFlaw === "gluttonous") {
				t.push(`${He} thoroughly enjoys being permitted to stuff ${his} face for your amusement, even if your lunch is in jeopardy for the duration of the week. There is no denying the results, however, as you savor the sight of the chubby ${girl} jiggling past your office when it's over.`);
				eventSlave.weight += 20;
			} else if (eventSlave.behavioralFlaw === "anorexic") {
				t.push(`${He} appreciates having someone to eat lunch with, but that's not really why you are eating with ${him}. While ${he} doesn't make any real gains, you can't help but notice ${he} kept ${his} food down all week. You broke ${him} of ${his} eating disorder!`);
				eventSlave.behavioralFlaw = "none";
			} else {
				t.push(`${He} spends the week obediantly eating for you. You are not dissapointed when you see the results, however, nor when you get a good grip on ${his} soft belly. ${He} may still have other hidden problems, but this is not longer one of them, at least for the time being.`);
				eventSlave.weight += 10;
			}
			if (eventSlave.behavioralQuirk === "insecure" || eventSlave.behavioralFlaw === "gluttonous") {
				eventSlave.devotion += 5;
			} else {
				eventSlave.devotion += 3;
			}
			return t;
		}

		function gym() {
			let t = [];
			t.push(`${His} face ${eventSlave.behavioralQuirk === "fitness" ? "brightens" : "sours"} as you instruct ${him} to spend ${his} free time on the treadmill if ${he} is so bothered by it,`);
			if (eventSlave.behavioralQuirk === "fitness") {
				t.push(`and by week's end, ${he}'s <span class="devotion inc">in a fantastic mood.</span>`);
			} else {
				t.push(`but by week's end, ${he}'s singing a different tune.`);
			}
			t.push(`Not only is ${he} several sizes smaller than ${his} expectations, but ${he} looks and feels great, something ${he} just can't help but show off as ${he} struts past your office.`);
			if (eventSlave.behavioralQuirk === "fitness") {
				eventSlave.devotion += 10;
				eventSlave.trust += 10;
			} else {
				eventSlave.devotion += 5;
				eventSlave.trust += 5;
			}
			eventSlave.weight -= 10;
			return t;
		}

		function sex() {
			let t = [];
			t.push(`${He}'s dismayed when you agree, but that fades quickly into hope when you continue, suggesting there's a way to start fixing the problem. ${He} just needs some exercise; to shed off those pounds with some hard physical work. The couch, you think aloud, will do perfectly, as you move around your desk to stretch out on the inviting surface, hands linked behind your head in a powerful display of your body. It's enough to make ${him} press ${his} thighs together, but you make no move for ${him}${V.PC.dick === 0 ? ", a strap-on," : ""} or even your clothing. You let ${him} puzzle and suffer for a few moments more before you make your intentions clear; if ${he} wants to burn calories, then it should be ${him} that does all the work.`);
			App.Events.addParagraph(node, t);

			t = [];
			if (eventSlave.behavioralQuirk === "fitness") {
				t.push(`${He} brightens, catching on immediately and nodding ${his} head with understanding`);
				if (V.PC.dick === 0) {
					t.push(`before quickly ${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `shedding ${his} clothes and` : ""} retrieving an appropriate dildo, eager for the workout.`);
				} else {
					t.push(`${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? "before" : ""} quickly ${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `shedding ${his} clothes` : ""}, eager for the workout.`);
				}
			} else {
				t.push(`${He} catches on quickly, nodding ${his} head with understanding`);
				if (V.PC.dick === 0) {
					t.push(`before ${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `shedding ${his} clothes and` : ""} retrieving an appropriate dildo, glad for the opportunity.`);
				} else {
					t.push(`${eventSlave.clothes !== "no clothing" && eventSlave.clothes !== "body oil" ? `before shedding ${his} clothes` : ""}, glad for the opportunity.`);
				}
			}
			t.push(`${His} hips settle close to yours, moving seductively while ${he} makes a show of undressing you. ${His} fingers smooth`);
			if (V.PC.dick === 0) {
				t.push(`around your hips, fastening the straps under and around your raised ass`);
				if (V.PC.butt <= 3) {
					t.push(`ass,`);
				} else if (V.PC.butt <= 4) {
					t.push(`with some effort,`);
				} else {
					t.push(`with a struggle,`);
				}
				t.push(`adjusting the attached toy`);
			} else {
				t.push(`over your half hard cock before drawing it out, pumping it`);
			}
			t.push(`until it's standing tall, ready for ${him} to spread ${his} legs over.`);
			if (eventSlave.behavioralQuirk === "fitness") {
				t.push(`${He} barely hesitates`);
			} else {
				t.push(`${He} spends a moment hovering`);
			}
			t.push(`before ${he} sinks ${his}`);
			if (canDoVaginal(eventSlave)) {
				t.push(`pussy`);
			} else {
				t.push(`asshole`);
			}
			t.push(`down onto the stiff rod with a moan, drawing back up almost immediately and starting an intense`);
			if (canDoVaginal(eventSlave)) {
				if (eventSlave.vagina === 0) {
					t.push(`pace, despite having been a <span class="lime">virgin</span> moments before.`);
				} else {
					t.push(`pace.`);
				}
				t.push(VCheck.Vaginal(1, eventSlave));
			} else {
				if (eventSlave.anus === 0) {
					t.push(`pace, despite having been a <span class="lime">virgin</span> moments before.`);
				} else {
					t.push(`pace.`);
				}
				t.push(VCheck.Anal(1, eventSlave));
			}
			App.Events.addParagraph(node, t);

			t = [];
			t.push(`Riding certainly is exhausting, especially if you don't offer any assistance. With no hands on ${his} hips to keep ${him} steady, ${his} hand${hasBothArms(eventSlave) ? "s" : ""} find themselves on your`);
			if (V.PC.belly < 5000) {
				if (V.PC.boobs < 300) {
					t.push(`chest,`);
				} else if (V.PC.boobs >= 300) {
					t.push(`tits,`);
				} else {
					t.push(`stomach,`);
				}
			} else {
				if (V.PC.bellyPreg > 2000 || V.PC.bellyImplant > 2000) {
					t.push(`gravid swell,`);
				} else {
					t.push(`${V.PC.inflationType}-stuffed belly,`);
				}
			}
			t.push(`fingers curling as ${his} orgasm approaches and a delighted ${canTalk(eventSlave) ? "shout" : "shudder"}`);
			if (eventSlave.balls !== 0) {
				t.push(`and a`);
				if (eventSlave.prostate === 3) {
					t.push(`flood of cum`);
				} else if (eventSlave.prostate === 2) {
					t.push(`splatter of cum`);
				} else if (eventSlave.prostate === 1) {
					t.push(`splurt of cum`);
				} else {
					t.push(`dribble of fluid`);
				}
			}
			t.push(`announcing it. ${He}'s`);
			if (eventSlave.behavioralQuirk === "fitness") {
				t.push(`a little loopy from the rush, but a buck of your hips informs ${him} ${he}'s not finished yet. Delighted,`);
			} else {
				t.push(`panting from the exertion, but a buck of your hips informs ${him} ${he}'s not finished yet. It's not as hard and fast this time, but`);
			}
			t.push(`${he} pounds ${himself} diligently, only breaking momentarily for increasingly worn out gasps and moans, coating your couch ${eventSlave.balls !== 0 && eventSlave.prostate !== 0 ? "and clothing" : ""} with a mix of fluids each time. Only when ${his} legs refuse to support ${him} anymore and ${his} hips can barely shift do you let ${him} stop, admiring the sweat drenched spent slave draped over your`);
			if (V.PC.belly < 5000) {
				t.push(`chest.`);
			} else {
				t.push(`belly.`);
			}
			App.Events.addParagraph(node, t);

			t = [];
			t.push(`You stretch before gathering ${him} up,`);
			if (V.PC.belly < 10000) {
				t.push(`carrying`);
			} else {
				t.push(`coaxing`);
			}
			t.push(`${him} to the shower to clean ${him} off, teasing another orgasm out of ${him} before you're finished as a reward. ${His} smile is tired but delighted when you lay ${him} down on clean cushions, pleased that ${he}`);
			if (eventSlave.behavioralQuirk === "fitness") {
				t.push(`got such a great workout,`);
			} else {
				t.push(`did such a good job,`);
			}
			t.push(`before drifting off. ${He}'s earned a nap before ${he} returns to`);
			switch (eventSlave.assignment) {
				case Job.REST:
					t.push(`the dorm,`);
					break;
				case Job.HOUSE:
					t.push(`${his} chores,`);
					break;
				case Job.MILKED:
					t.push(`getting milked,`);
					break;
				case Job.PUBLIC:
					t.push(`${his} slutting,`);
					break;
				case Job.FUCKTOY:
					t.push(`servicing you,`);
					break;
				case Job.WHORE:
					t.push(`selling ${himself},`);
					break;
				case Job.CLASSES:
					t.push(`studying,`);
					break;
				case Job.CONFINEMENT:
					t.push(`${his} solitude,`);
					break;
				case Job.GLORYHOLE:
					t.push(`being used,`);
					break;
				case Job.SUBORDINATE:
					t.push(`serving ${his} superior,`);
					break;
				case Job.QUARTER:
					t.push(`${his} work as a servant,`);
					break;
				case Job.CONCUBINE:
					t.push(`your bed to await another set,`);
					break;
				case Job.MASTERSUITE:
					t.push(`the other fucktoys,`);
					break;
				default:
					t.push(`${his} post,`);
			}
			t.push(`especially if ${he} hopes to walk there after <span class="lime">burning so many calories.</span>`);
			if (eventSlave.behavioralQuirk === "fitness") {
				eventSlave.devotion += 7;
				eventSlave.trust += 7;
			} else {
				eventSlave.devotion += 3;
				eventSlave.trust += 3;
			}
			eventSlave.weight -= 5;
			return t;
		}

		function shoo() {
			let t = [];
			t.push(`All that ${he} should be worried about is serving you, not inconsequential changes to ${his} body.`);
			if (eventSlave.behavioralQuirk === "insecure") {
				t.push(`That's all ${he} needed to ${canHear(eventSlave) ? "hear" : "know"}. <span class="devotion inc">All's well and good</span> if ${WrittenMaster(eventSlave)} says so.`);
				eventSlave.devotion += 3;
			} else {
				t.push(`${He} nods in acceptance and silently heads on ${his} way; ${his} thoughts on your indifference is <span class="trust dec">written across ${his} face.</span>`);
				eventSlave.trust -= 5;
			}
			return t;
		}
	}
};


code:
/** draw event art, with the option to dress the slave in a particular way
 * @param {Node} node - DOM node to attach art to
 * @param {App.Entity.SlaveState|Array<App.Entity.SlaveState>} slaves - one or several slaves to draw art for
 * @param {string} [clothesMode] - if the slaves' clothing should be overridden, what should they be wearing?
 */
App.Events.drawEventArt = function(node, slaves, clothesMode) {
	// do nothing if the player doesn't want images
	if (!V.seeImages) {
		return;
	}

	// ensure that slaves is an array
	if (!Array.isArray(slaves)) {
		slaves = [slaves];
	}

	// if we were asked to change the slave's clothing, do it now
	let originalClothes = [];
	if (clothesMode) {
		// if there are "themes" of clothes that multiple events want to use ("swimwear", "athletic", "casual", etc), they can be added as special cases here instead of duplicating the logic in every event
		if (App.Data.misc.niceClothes.map(c => c.value).concat(App.Data.misc.harshClothes.map(c => c.value)).includes(clothesMode)) {
			// specific clothes have been selected
			originalClothes = slaves.map((s) => { return {ID: s.ID, clothes: s.clothes}; });
			slaves.forEach(s => s.clothes = clothesMode);
		} else {
			throw "Unrecognized clothes mode for event art";
		}
	}

	// actually draw the art - large if single slave, medium column if multiple slaves
	let artSpan = document.createElement("span");
	artSpan.id = "artFrame";
	if (slaves.length === 1) {
		let refDiv = document.createElement("div");
		refDiv.classList.add("imageRef", V.imageChoice === 1 ? "lrgVector" : "lrgRender");
		let maskDiv = document.createElement("div");
		maskDiv.classList.add("mask");
		maskDiv.appendChild(document.createTextNode("\u00a0"));
		refDiv.appendChild(maskDiv);
		refDiv.appendChild(App.Art.SlaveArtElement(slaves[0], 2, 0));
		artSpan.appendChild(refDiv);
	} else {
		let colDiv = document.createElement("div");
		colDiv.classList.add("imageColumn");
		for (const slave of slaves) {
			let refDiv = document.createElement("div");
			refDiv.classList.add("imageRef", "medImg");
			refDiv.appendChild(App.Art.SlaveArtElement(slave, 2, 0));
			colDiv.appendChild(refDiv);
		}
		artSpan.appendChild(colDiv);
	}
	node.appendChild(artSpan);

	// change clothing back, if necessary
	if (originalClothes.length > 0) {
		originalClothes.forEach((c) => slaves.find(s => s.ID === c.ID).clothes = c.clothes);
	}
};

/** intelligently adds spaces to an array of mixed strings and DOM nodes, merging consecutive strings in the process
 * @param {Array<string|HTMLElement|DocumentFragment>} sentences
 * @returns {Array<string|HTMLElement|DocumentFragment>}
 */
App.Events.spaceSentences = function(sentences) {
	if (sentences.length <= 1) {
		return sentences;
	}
	return sentences.reduce((res, cur) => {
		if (res.length === 0) {
			res.push(cur);
		} else if (typeof (res[res.length-1]) === "string") {
			if (typeof (cur) === "string") {
				res[res.length-1] += " " + cur;
			} else {
				res[res.length-1] += " ";
				res.push(cur);
			}
		} else {
			if (typeof (cur) === "string") {
				res.push(" " + cur);
			} else {
				res.push(" ");
				res.push(cur);
			}
		}
		return res;
	}, []);
};

/** assemble a DOM paragraph from an array of DOM nodes, sentences or sentence fragments (which may contain HTML)
 * @param {Node} node
 * @param {Array<string|HTMLElement|DocumentFragment>} sentences
 */
App.Events.addParagraph = function(node, sentences) {
	let para = document.createElement("p");
	$(para).append(...App.Events.spaceSentences(sentences));
	node.appendChild(para);
};

/** result handler callback - process the result and return an array of mixed strings and DOM nodes
 * @callback resultHandler
 * @returns {Array<string|HTMLElement|DocumentFragment>}
 */
/** a response to an event, and its result */
App.Events.Result = class {
	/** @param {string} [text] - the link text for the response
	 *  @param {resultHandler} [handler] - the function to call to generate the result when the link is clicked
	 *  @param {string} [note] - a note to provide alongside the link (for example, a cost or virginity loss warning)
	 *  To mark an option as disabled, construct the result with only the note.
	 */
	constructor(text, handler, note) {
		this.text = text;
		this.handler = handler;
		this.note = note;
	}

	/** call the result handler, replacing the contents of the given span ID
	 * @param {string} resultSpanID
	 */
	handle(resultSpanID) {
		let frag = document.createDocumentFragment();
		$(frag).append(...App.Events.spaceSentences(this.handler()));
		App.UI.DOM.replace(`#${resultSpanID}`, frag);
	}

	/** build the response DOM (for use by addResponses)
	 * @param {HTMLElement} node
	 * @returns {boolean} - true if something was written, false if not
	 */
	makeResponse(node) {
		let wrote = false;
		if (this.text && this.handler) {
			node.appendChild(App.UI.DOM.link(this.text, () => this.handle(node.id)));
			wrote = true;
		}
		if (wrote && this.note) {
			$(node).append(" ");
		}
		if (this.note) {
			node.appendChild(App.UI.DOM.makeElement("span", this.note, "detail"));
			wrote = true;
		}
		return wrote;
	}
};

/** add a list of results for an event
 * @param {Node} node
 * @param {Array<App.Events.Result>} results
 * @param {string} [elementID="result"]
 */
App.Events.addResponses = function(node, results, elementID="result") {
	let resultSpan = document.createElement("span");
	resultSpan.id = elementID;
	for (const result of results) {
		if (result.makeResponse(resultSpan)) {
			resultSpan.appendChild(document.createElement("br"));
		}
	}
	node.appendChild(resultSpan);
};


code:
App.Intro.generateEstablishedArcologies = function() {
	/* setup */
	let allowedFS = ["ArabianRevivalist", "AssetExpansionist", "AztecRevivalist", "BodyPurist", "ChattelReligionist", "ChineseRevivalist", "EdoRevivalist", "EgyptianRevivalist", "Eugenics", "HedonisticDecadence", "IntellectualDependency", "MaturityPreferentialist", "Multiculturalist", "Pastoralist", "Paternalist", "PetiteAdmiration", "PhysicalIdealist", "Repopulationist", "RomanRevivalist", "SlaveProfessionalism", "SlimnessEnthusiast", "StatuesqueGlorification", "Subjugationist", "Supremacist", "TransformationFetishist", "YouthPreferentialist"];
	if (V.seeDicks !== 0) {
		allowedFS.push("GenderRadicalist");
	}
	if (V.seeDicks !== 100) {
		allowedFS.push("GenderFundamentalist");
	}
	if (V.seeExtreme !== 0) {
		allowedFS.push("Degradationist");
	}
	const terrainTypes = ["marine", "marine", "oceanic", "ravine", "rural", "rural", "rural", "urban", "urban"];
	const continents = ["Africa", "Asia", "Asia", "Australia", "Europe", "Europe", "Japan", "North America", "North America", "South America", "the Middle East"];
	const races = ["amerindian", "asian", "black", "indo-aryan", "latina", "malay", "middle eastern", "mixed race", "pacific islander", "semitic", "southern european", "white"];

	let targets = 4;
	if (V.PC.career === "arcology owner") {
		targets += 2;
	}

	/* generation */
	const fragment = document.createDocumentFragment();
	for (let i = 0; i < targets; i++) {
		fragment.append(arcologyCard());
	}
	return fragment;

	function arcologyCard() {
		const arcology = generateArcology();
		const div = document.createElement("div");
		div.classList.add("card");

		div.append(App.UI.DOM.passageLink(arcology.name, "Intro Summary", () => {
			V.targetArcology = arcology;
			V.terrain = arcology.terrain;
			V.continent = arcology.continent;
			V.language = arcology.language;
			arcology.apply();
		}));

		div.append(" is an established arcology located in a Free City ");
		if (arcology.terrain === "urban") {
			div.append(`carved out of an urban area of ${arcology.continent}.`);
		} else if (arcology.terrain === "rural") {
			div.append(`built in a rural area of ${arcology.continent}.`);
		} else if (arcology.terrain === "marine") {
			div.append(`constructed just offshore of ${arcology.continent}.`);
		} else if (arcology.terrain === "ravine") {
			div.append(`constructed in a large canyon of ${arcology.continent}.`);
		} else {
			div.append(`in the middle of the ocean.`);
		}

		function newLine(...content) {
			const line = document.createElement("div");
			line.classList.add("indent");
			line.append(...content);
			div.append(line);
		}

		if (arcology.prosperity >= 60) {
			newLine("It is unusually prosperous for a vulnerable arcology.");
		} else if (arcology.prosperity <= 40) {
			newLine("It has little economic prosperity and is vulnerable.");
		}

		if (arcology.citizens > 0) {
			newLine("It has an unusually high ratio of citizens to sex slaves, increasing demand for sexual services.");
		} else if (arcology.citizens < 0) {
			newLine("It has an unusually low ratio of citizens to sex slaves, reducing demand for sexual services.");
		}

		let innerDiv = document.createElement("div");
		innerDiv.classList.add("indent");
		div.append(innerDiv);

		innerDiv.append("Its society ");
		if (arcology.FSProgress >= 50) {
			innerDiv.append("has advanced towards");
		} else if (arcology.FSProgress >= 30) {
			innerDiv.append("has devoted resources to");
		} else {
			innerDiv.append("has just begun to adopt");
		}
		innerDiv.append(" ");
		switch (arcology.fs) {
			case "Supremacist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Supremacy of the ${arcology.race} ${arcology.race !== "mixed race" ? "race" : ""}.`, ["intro", "question"]));
				break;
			case "Subjugationist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Subjugation of the ${arcology.race} ${arcology.race !== "mixed race" ? "race" : ""}.`, ["intro", "question"]));
				break;
			case "GenderRadicalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Gender Radicalism,`, ["intro", "question"]), " a movement that supports feminization of slavegirls with dicks.");
				break;
			case "GenderFundamentalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Gender Fundamentalism,`, ["intro", "question"]), " a reaction to modern libertinism that seeks to reinforce gender roles.");
				break;
			case "Paternalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Paternalism,`, ["intro", "question"]), " an optimistic strain of slavery that protects and improves slaves.");
				break;
			case "Degradationist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Degradationism,`, ["intro", "question"]), " an extreme branch of modern slavery that treats slaves as subhuman.");
				break;
			case "AssetExpansionist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Asset Expansionism,`, ["intro", "question"]), " a societal preoccupation with expansion of body parts, especially breasts.");
				break;
			case "SlimnessEnthusiast":
				innerDiv.append(App.UI.DOM.makeElement("span", `Slimness Enthusiasm,`, ["intro", "question"]), " an aesthetic movement that fetishizes the lithe female form.");
				break;
			case "TransformationFetishist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Transformation Fetishism,`, ["intro", "question"]), " a focus on implants and other kinds of surgical alteration.");
				break;
			case "BodyPurist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Body Purism,`, ["intro", "question"]), " a reaction to extreme surgical fetishism that prefers bodies grown biologically.");
				break;
			case "MaturityPreferentialist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Maturity Preferentialism,`, ["intro", "question"]), " an appetite for mature slaves based on MILF fetishism.");
				break;
			case "YouthPreferentialist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Youth Preferentialism,`, ["intro", "question"]), " which focuses on youth and virginity in slaves.");
				break;
			case "Pastoralist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Pastoralism,`, ["intro", "question"]), " an appetite for products of the human body, especially milk.");
				break;
			case "PhysicalIdealist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Physical Idealism,`, ["intro", "question"]), " an aspirational movement which fetishizes muscle and physical fitness.");
				break;
			case "ChattelReligionist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Chattel Religionism,`, ["intro", "question"]), " a religious revival in the context of modern slavery.");
				break;
			case "RomanRevivalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Roman Revivalism,`, ["intro", "question"]), " which seeks to recreate the glory that was ancient Rome.");
				innerDiv.append(App.UI.DOM.makeElement("div", "It has an established lingua franca: Latin."));
				break;
			case "AztecRevivalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Aztec Revivalism,`, ["intro", "question"]), " which aspires to reach the heights of the Aztec Empire at it's peak.");
				innerDiv.append(App.UI.DOM.makeElement("div", "It has an established lingua franca: Nahuatl."));
				break;
			case "EgyptianRevivalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Egyptian Revivalism,`, ["intro", "question"]), " a movement to rebuild the monuments and greatness of ancient Egypt.");
				innerDiv.append(App.UI.DOM.makeElement("div", "It has an established lingua franca: Ancient Egyptian."));
				break;
			case "EdoRevivalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Edo Revivalism,`, ["intro", "question"]), " an insular movement with a focus on the cultural superiority of old Japan.");
				innerDiv.append(App.UI.DOM.makeElement("div", "It has an established lingua franca: Japanese."));
				break;
			case "ArabianRevivalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Arabian Revivalism,`, ["intro", "question"]), " a melding of Arabian history and recent mythology of the Near East.");
				innerDiv.append(App.UI.DOM.makeElement("div", "It has an established lingua franca: Arabic."));
				break;
			case "ChineseRevivalist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Chinese Revivalism,`, ["intro", "question"]), " which modernizes the assumed superiority of the Middle Kingdom.");
				innerDiv.append(App.UI.DOM.makeElement("div", "It has an established lingua franca: Chinese."));
				break;
			case "Repopulationist":
				innerDiv.append(App.UI.DOM.makeElement("span", `Repopulationism,`, ["intro", "question"]), " the belief that the key to humanity's survival is a child in every fertile womb.");
				break;
			case "Eugenics":
				innerDiv.append(App.UI.DOM.makeElement("span", `Eugenics,`, ["intro", "question"]), " the belief that the world's failings were caused by rampant breeding of the inferior, and as such, only society's best should reproduce.");
				break;
			case "HedonisticDecadence":
				innerDiv.append(App.UI.DOM.makeElement("span", `Decadent Hedonism,`, ["intro", "question"]), " a movement to embody life's pleasures, particularly eating and sex.");
				break;
			case "IntellectualDependency":
				innerDiv.append(App.UI.DOM.makeElement("span", `Intellectual Dependency,`, ["intro", "question"]), " an appetite for horny, stupid slaves based on bimbo fetishism.");
				break;
			case "SlaveProfessionalism":
				innerDiv.append(App.UI.DOM.makeElement("span", `Slave Professionalism,`, ["intro", "question"]), " a strain of slavery that seeks smart, skilled, elegant slaves to hone to perfection.");
				break;
			case "PetiteAdmiration":
				innerDiv.append(App.UI.DOM.makeElement("span", `Petite Admiration,`, ["intro", "question"]), " which prefers its slaves to stand heads and shoulders shorter than their masters.");
				break;
			case "StatuesqueGlorification":
				innerDiv.append(App.UI.DOM.makeElement("span", `Statuesque Glorification,`, ["intro", "question"]), " an obsession, both sexual and otherwise, over height.");
				break;
			default:
				innerDiv.append(App.UI.DOM.makeElement("span", `Multiculturalism,`, ["intro", "question"]), " a celebration of the total liberty that was the original purpose of the Free Cities.");
		}
		div.append(innerDiv);
		div.append(App.UI.DOM.makeElement("span", arcology.building.render(), "intro"));
		return div;
	}

	function generateArcology() {
		const arcology = {};
		arcology.fs = getFS();
		arcology.name = getName();
		arcology.FSProgress = either(10, 30, 50);
		arcology.prosperity = either(40, 50, 60);
		arcology.citizens = random(-1, 1);
		arcology.terrain = terrainTypes.random();
		arcology.continent = continents.random();
		arcology.language = getLanguage();

		const env = {terrain: arcology.terrain, established: true, fs: arcology.fs};
		const preset = App.Arcology.randomPreset(env).construct(env);
		arcology.building = preset.building;
		arcology.apply = preset.apply;

		return arcology;

		function getFS() {
			const type = allowedFS.pluck();
			if (type === "Supremacist" || type === "Subjugationist") {
				arcology.race = races.random();
			}
			return type;
		}

		function getName() {
			switch (arcology.fs) {
				case "Supremacist":
					switch (arcology.race) {
						case "white":
							return setup.ArcologyNamesSupremacistWhite.random();
						case "asian":
							return setup.ArcologyNamesSupremacistAsian.random();
						case "latina":
							return setup.ArcologyNamesSupremacistLatina.random();
						case "middle eastern":
							return setup.ArcologyNamesSupremacistMiddleEastern.random();
						case "black":
							return setup.ArcologyNamesSupremacistBlack.random();
						case "indo-aryan":
							return setup.ArcologyNamesSupremacistIndoAryan.random();
						case "pacific islander":
							return setup.ArcologyNamesSupremacistPacificIslander.random();
						case "malay":
							return setup.ArcologyNamesSupremacistMalay.random();
						case "amerindian":
							return setup.ArcologyNamesSupremacistAmerindian.random();
						case "southern european":
							return setup.ArcologyNamesSupremacistSouthernEuropean.random();
						case "semitic":
							return setup.ArcologyNamesSupremacistSemitic.random();
						default:
							return setup.ArcologyNamesSupremacistMixedRace.random();
					}
				case "Subjugationist":
					switch (arcology.race) {
						case "white":
							return setup.ArcologyNamesSubjugationistWhite.random();
						case "asian":
							return setup.ArcologyNamesSubjugationistAsian.random();
						case "latina":
							return setup.ArcologyNamesSubjugationistLatina.random();
						case "middle eastern":
							return setup.ArcologyNamesSubjugationistMiddleEastern.random();
						case "black":
							return setup.ArcologyNamesSubjugationistBlack.random();
						case "indo-aryan":
							return setup.ArcologyNamesSubjugationistIndoAryan.random();
						case "pacific islander":
							return setup.ArcologyNamesSubjugationistPacificIslander.random();
						case "malay":
							return setup.ArcologyNamesSubjugationistMalay.random();
						case "amerindian":
							return setup.ArcologyNamesSubjugationistAmerindian.random();
						case "southern european":
							return setup.ArcologyNamesSubjugationistSouthernEuropean.random();
						case "semitic":
							return setup.ArcologyNamesSubjugationistSemitic.random();
						default:
							return setup.ArcologyNamesSubjugationistMixedRace.random();
					}
				case "GenderRadicalist":
					return setup.ArcologyNamesGenderRadicalist.random();
				case "GenderFundamentalist":
					return setup.ArcologyNamesGenderFundamentalist.random();
				case "Paternalist":
					return setup.ArcologyNamesPaternalist.random();
				case "Degradationist":
					return setup.ArcologyNamesDegradationist.random();
				case "AssetExpansionist":
					return setup.ArcologyNamesAssetExpansionist.random();
				case "SlimnessEnthusiast":
					return setup.ArcologyNamesSlimnessEnthusiast.random();
				case "TransformationFetishist":
					return setup.ArcologyNamesTransformationFetishist.random();
				case "BodyPurist":
					return setup.ArcologyNamesBodyPurist.random();
				case "MaturityPreferentialist":
					return setup.ArcologyNamesMaturityPreferentialist.random();
				case "YouthPreferentialist":
					if (V.pedo_mode === 1 || V.minimumSlaveAge < 6) {
						return setup.ArcologyNamesYouthPreferentialistLow.random();
					} else if (V.minimumSlaveAge < 14) {
						return setup.ArcologyNamesYouthPreferentialist.concat(setup.ArcologyNamesYouthPreferentialistLow).random();
					} else {
						return setup.ArcologyNamesYouthPreferentialist.random();
					}
				case "Pastoralist":
					return setup.ArcologyNamesPastoralist.random();
				case "PhysicalIdealist":
					return setup.ArcologyNamesPhysicalIdealist.random();
				case "ChattelReligionist":
					return setup.ArcologyNamesChattelReligionist.random();
				case "RomanRevivalist":
					return setup.ArcologyNamesRomanRevivalist.random();
				case "AztecRevivalist":
					return setup.ArcologyNamesAztecRevivalist.random();
				case "EgyptianRevivalist":
					return setup.ArcologyNamesEgyptianRevivalist.random();
				case "EdoRevivalist":
					return setup.ArcologyNamesEdoRevivalist.random();
				case "ArabianRevivalist":
					return setup.ArcologyNamesArabianRevivalist.random();
				case "ChineseRevivalist":
					return setup.ArcologyNamesChineseRevivalist.random();
				case "Repopulationist":
					return setup.ArcologyNamesRepopulationist.random();
				case "Eugenics":
					return setup.ArcologyNamesEugenics.random();
				case "HedonisticDecadence":
					return setup.ArcologyNamesHedonisticDecadence.random();
				case "IntellectualDependency":
					return setup.ArcologyNamesIntellectualDependency.random();
				case "SlaveProfessionalism":
					return setup.ArcologyNamesSlaveProfessionalism.random();
				case "PetiteAdmiration":
					return setup.ArcologyNamesPetiteAdmiration.random();
				case "StatuesqueGlorification":
					return setup.ArcologyNamesStatuesqueGlorification.random();
				default:
					return "Arcology X-4";
			}
		}

		function getLanguage() {
			switch (arcology.fs) {
				case "RomanRevivalist":
					return "Latin";
				case "AztecRevivalist":
					return "Nahuatl";
				case "EgyptianRevivalist":
					return "Ancient Egyptian";
				case "EdoRevivalist":
					return "Japanese";
				case "ArabianRevivalist":
					return "Arabic";
				case "ChineseRevivalist":
					return "Chinese";
				default:
					switch (arcology.terrain) {
						case "South America":
							return "Spanish";
						case "Brazil":
							return "Portuguese";
						case "the Middle East":
						case "Africa": /* shouldn't that be portuguese, spanish or something? */
							return "Arabic";
						case "Asia":
							return "Chinese";
						case "Europe":
							return "German";
						case "Japan":
							return "Japanese";
						case "oceanic":
						case "North America":
						case "Australia":
						default:
							return "English";
					}
			}
		}
	}
};


code:
:: Economy Intro [nobr]

<<if $PC.career == "arcology owner" || $saveImported == 1>>
	<<goto "Takeover Target">>
<<else>>

		It is the year 2037, and the past 21 years have not been kind. The world is starting to fall apart. The climate is deteriorating, resources are being exhausted, and there are more people to feed every year. Technology is advancing, but not fast enough to save everyone. Exactly how bad is the situation?

		<<if $baseDifficulty == 1>>

					Not truly dire. Not yet.

					Very Easy

				[[Harder|Economy Intro][$economy = 125, $baseDifficulty = 2]]

		<<elseif $baseDifficulty == 2>>

					Getting a touch dire.

					Easy

				[[Harder|Economy Intro][$economy = 100, $baseDifficulty = 3]] | [[Easier|Economy Intro][$economy = 200, $baseDifficulty = 1]]

		<<elseif $baseDifficulty == 3>>

					Very serious.

					Default Difficulty

				[[Harder|Economy Intro][$economy = 80, $baseDifficulty = 4]] | [[Easier|Economy Intro][$economy = 125, $baseDifficulty = 2]]

		<<elseif $baseDifficulty == 4>>

					It won't be pretty.

					Hard

				[[Harder|Economy Intro][$economy = 67, $baseDifficulty = 5]] | [[Easier|Economy Intro][$economy = 100, $baseDifficulty = 3]]

		<<else>>

					This is the last dance.

					Very Hard

				[[Easier|Economy Intro][$economy = 80, $baseDifficulty = 4]]

		<</if>>

	/*Economy settings*/

		How fast is it crumbling?

		Some economic content requires this to be set to harder than vanilla

	<<if $difficultySwitch == 0>>

				Barely noticeable, for now.

				Vanilla

			[[Harder|Economy Intro][$econRate = 1, $difficultySwitch = 1]]

	<<elseif $econRate == 1>>

				A slow decline.

				Easy

			[[Harder|Economy Intro][$econRate = 2]] | [[Easier|Economy Intro][$difficultySwitch = 0]]

	<<elseif $econRate == 2>>

				It's visibly deteriorating before your eyes.

				Default Difficulty

			[[Harder|Economy Intro][$econRate = 4]] | [[Easier|Economy Intro][$econRate = 1]]

	<<else>>

				It's going to hell in a handbasket.

				Hard

			[[Easier|Economy Intro][$econRate = 2]]

	<</if>>

	/* Not functional yet, place $incomeRate = 1 in storyInit when ready for use

		All the things you need to run your arcology are getting more expensive
		<<if $incomeMod == 0>>
			while all forms of income
			remain static. [[Easier|Economy Intro][$incomeRate = 1]]
		<<elseif $incomeMod == 1>>
			while all forms of income rise but cannot keep pace. [[Easier|Economy Intro][$incomeRate = 2]] | [[Harder|Economy Intro][$incomeRate = 0]]
		<<else>>
			but luckily all forms of income rise in lockstep. [[Harder|Economy Intro][$incomeRate = 1]]
		<</if>>

		[[Play with static economy|Economy Intro][$difficultySwitch = 0]]

	*/

		[[Next|Trade Intro]]

		[[Skip Intro|Intro Summary]]

			This will preclude you from taking over an established arcology.

<</if>>


code:
:: Extreme Intro [nobr]

	The early Free Cities were wild places where the writ of law did not run. In some of the most depraved, slaves' bodies, minds and even lives were playthings of the wealthy and powerful. Though modern Free Cities are tremendously varied, a majority of the new communities made a choice about whether extreme practices were a flaw in a lawless society or one of its benefits.

		How did most Free Cities react to the excesses of the early days?

	[[They drew back from them.|Gender Intro][$seeExtreme = 0]]

		Extreme content such as amputation and castration will not appear.

	[[They reveled in them.|Gender Intro][$seeExtreme = 1]]

		Extreme content will appear.

	[[They drew back from them, but remained creative.|Gender Intro][$seeExtreme = 0,$seeHyperPreg = 1]]

		Extreme content will not appear, but hyper-pregnancy related content might appear.

	[[They reveled in them and were particularly inventive.|Gender Intro][$seeExtreme = 1,$seeHyperPreg = 1]]

		Extreme content will appear, including hyper-pregnancy related content


code:
:: Gender Intro [nobr]

	The Free Cities are sexually libertine places, and sexual slavery is ubiquitous. Some of the early Free Cities upheld or even strengthened traditional gender roles, expecting men to be men and women to be women. Others subscribed to an interesting refinement of those gender roles, considering any sex slave female, regardless of her biology. A small minority even went so far as to strongly favor societal feminization of slaves born male; in these, biologically female slaves were a rare sight.

		Which kind of Free City came to predominate?

	[[Free Cities that were open-minded about who could be a slave girl.|Slave Age Intro][$seeDicks = 25]]

		Default setting. The majority of slaves will be biologically female, and all content will be available.

	[[Free Cities that understood that girls are girls.|Slave Age Intro][$seeDicks = 0]]

		Almost all slaves will be biologically female, restricting some content.

	[[Free Cities that understood that girls are girls with some exceptions.|Slave Age Intro][$makeDicks = 1, $seeDicks = 0]]

		This option will make almost all generated slaves female, but will allow for the attachment of a certain organ through surgery.

	[[Free Cities that preferred girls with dicks.|Slave Age Intro][$seeDicks = 100]]

		Almost all slaves will be biologically male, restricting some content.