From f05c69e67898d4f176300353bdfce3dd83bbb055 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Sun, 29 Nov 2020 19:02:39 -0500
Subject: [PATCH] begind cheatmode

---
 src/events/intro/introSummary.js      | 457 +------------------------
 src/events/intro/pcAppearance.js      | 464 +++++++++++++++++++++++++-
 src/events/intro/pcAppearanceIntro.tw |   2 +-
 src/events/intro/pcBodyIntro.js       |   4 +-
 4 files changed, 465 insertions(+), 462 deletions(-)

diff --git a/src/events/intro/introSummary.js b/src/events/intro/introSummary.js
index 8a091bfd4e8..ca397aefc67 100644
--- a/src/events/intro/introSummary.js
+++ b/src/events/intro/introSummary.js
@@ -45,7 +45,7 @@ App.Intro.summary = function() {
 		{
 			title: "Player Character",
 			id: "player",
-			get node() { return playerContent(); }
+			get node() { return App.UI.Player.design(); }
 		},
 		{
 			title: "UI",
@@ -605,434 +605,6 @@ App.Intro.summary = function() {
 		return el;
 	}
 
-	function playerContent() {
-		const el = new DocumentFragment();
-		let options = new App.UI.OptionsGroup();
-		let option;
-		let r;
-		let linkArray;
-
-		if (V.freshPC === 1 || V.saveImported === 0) {
-			options.addOption("You are a", "title", V.PC)
-				.addValue("Masculine Master", 1, () => V.PC.genes = "XY").addValue("Feminine Mistress", 0, () => V.PC.genes = "XX");
-
-			App.Intro.PCNames(options);
-
-			V.PC.physicalAge = V.PC.actualAge;
-			V.PC.visualAge = V.PC.actualAge;
-			options.addOption("You are", "actualAge", V.PC).showTextBox()
-				.addRange(25, 35, "<", "Surprisingly young").addRange(40, 50, "<", "Entering middle age")
-				.addRange(55, 65, "<", "Well into middle age").addRange(70, 65, ">=", "Old");
-
-			options.addOption(`Your birthday was <strong>${V.PC.birthWeek}</strong> weeks ago.`, "birthWeek", V.PC).showTextBox();
-
-			options.addOption("Player aging is", "playerAging")
-				.addValue("Enabled", 2).on().addValue("Celebrate birthdays, but don't age.", 1).neutral().addValue("Disabled", 0).off()
-				.addComment("This option cannot be changed during the game.");
-
-			if (V.PC.customTitle) {
-				options.addOption("Custom title", "customTitle", V.PC).showTextBox()
-					.addValue("Reset to default", "", () => { delete V.PC.customTitle; delete V.PC.customTitleLisp; });
-
-				options.addOption("Lisped custom title", "customTitleLisp", V.PC).showTextBox()
-					.addComment('If using a custom title, select Master or Mistress to set the gender of your title. Make sure to replace your "s"s with "th"s to have working lisps in your lisped title.');
-			} else {
-				options.addOption("Custom title", "customTitle", V.PC)
-					.addValue("Set custom title", "Master", () => V.PC.customTitleLisp = 'Mather');
-			}
-
-			App.Intro.pcAppearance(options);
-
-			options.addOption("Your face is", "faceShape", V.PC)
-				.addValueList([
-					["Normal", "normal"],
-					["Androgynous", "androgynous"],
-					["Masculine", "masculine"],
-					["Cute", "cute"],
-					["Sensual", "sensual"],
-					["Exotic", "exotic"]
-				]);
-
-			App.Intro.refreshmentChoice(options);
-
-			option = options.addOption("Before you came to the Free Cities, you were a", "career", V.PC);
-			if (V.PC.career === "arcology owner") {
-				option.addValue("Arcology owner", "arcology owner");
-			} else {
-				option.addValueList([
-					["Member of the idle wealthy", "wealth"],
-					["Business leader", "capitalist"],
-					["Mercenary", "mercenary"],
-					["Slaver", "slaver"],
-					["Engineer", "engineer"],
-					["Doctor", "medicine"],
-					["Hacker", "BlackHat"],
-					["Minor celebrity", "celebrity"],
-					["Escort", "escort"],
-					["Servant", "servant"],
-					["Gang leader", "gang"]]
-				);
-				if (V.secExpEnabled > 0) {
-					switch (V.PC.career) {
-						case "capitalist":
-							option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
-							break;
-						case "mercenary":
-							option.addComment(`<div><span class="green">Easier to maintain security</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-							break;
-						case "slaver":
-							option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-							break;
-						case "engineer":
-							option.addComment(`<div><span class="yellowgreen">construction and upgrade of facilities will be cheaper.</span></div>`);
-							break;
-						case "medicine":
-							option.addComment(`<div><span class="yellowgreen">Drug upgrades will be cheaper.</span></div>`);
-							break;
-						case "celebrity":
-							option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
-							break;
-						case "escort":
-							option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-							break;
-						case "servant":
-							option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-							break;
-						case "gang":
-							option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
-							break;
-						case "BlackHat":
-							option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
-							break;
-						default:
-							option.addComment(`<div><span class="red">Harder to maintain authority,</span> but <span class="yellowgreen">the propaganda hub's upgrades will be cheaper.</span></div>`);
-					}
-				}
-			}
-
-			options.addOption("It is rumored that you acquired your arcology through", "rumor", V.PC)
-				.addValueList([
-					["Wealth", "wealth"],
-					["Hard work", "diligence"],
-					["Force", "force"],
-					["Social engineering", "social engineering"],
-					["Blind luck", "luck"]
-				]);
-
-			el.append(options.render());
-
-			App.UI.DOM.appendNewElement("h2", el, "Sexuality");
-			options = new App.UI.OptionsGroup();
-
-			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
-				State.temporary.vaginaPenis = 2;
-			} else if (V.PC.vagina !== -1) {
-				State.temporary.vaginaPenis = 1;
-			} else {
-				State.temporary.vaginaPenis = 0;
-			}
-
-			option = options.addOption("You have a", "vaginaPenis", State.temporary)
-				.addValue("Penis", 0, () => {
-					V.PC.preg = 0;
-					V.PC.pregType = 0;
-					V.PC.dick = 4;
-					V.PC.balls = 3;
-					V.PC.scrotum = 3;
-					V.PC.prostate = 1;
-					V.PC.vagina = -1;
-					V.PC.ovaries = 0;
-				}).addValue("Vagina", 1, () => {
-					V.PC.dick = 0;
-					V.PC.balls = 0;
-					V.PC.scrotum = 0;
-					V.PC.prostate = 0;
-					V.PC.vagina = 1;
-					V.PC.ovaries = 1;
-				}).addValue("Penis and Vagina", 2, () => {
-					V.PC.dick = 4;
-					V.PC.balls = 3;
-					V.PC.scrotum = 3;
-					V.PC.prostate = 1;
-					V.PC.vagina = 1;
-					V.PC.ovaries = 1;
-				});
-			if (State.temporary.vaginaPenis === 0) {
-				option.addComment("Standard sex scenes; easiest reputation maintenance.");
-			} else if (State.temporary.vaginaPenis === 1) {
-				option.addComment("Sex scene variations; most difficult reputation maintenance.");
-			} else {
-				option.addComment("Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts.");
-			}
-
-			if (V.PC.vagina !== -1) {
-				option = options.addOption("You are", "preg", V.PC)
-					.addValue("Taking contraceptives", -1, () => { V.PC.pregType = 0; V.PC.labor = 0; })
-					.addValue("Not taking contraceptives", 0, () => { V.PC.pregType = 0; V.PC.labor = 0; })
-					.addRange(16, 37, "<=", "Pregnant").addCallback(() => { V.PC.pregType = 1; V.PC.labor = 0; })
-					.addRange(40, 42, "<=", "Ready to drop").addCallback(() => { V.PC.pregType = 1; V.PC.labor = 0; })
-					.addRange(43, 42, ">", "Ready to drop with octuplets").addCallback(() => { V.PC.pregType = 8; V.PC.labor = 1; });
-				if (V.PC.preg === -1) {
-					option.addComment("You can't get pregnant, however there will be a slight increase to living expenses.");
-				}
-
-				if (V.PC.counter.birthsTotal > 0) {
-					options.addOption("").addComment(`You have given birth to <strong>${V.PC.counter.birthsTotal}</strong> babies.`);
-				}
-
-				option = options.addOption("Hormone effects", "pregMood", V.PC)
-					.addValueList([
-						["None", 0],
-						["Caring and motherly", 1],
-						["Aggressive and domineering", 2]
-					]);
-				if (V.PC.pregMood === 1) {
-					option.addComment("Sex scene alterations; slaves will trust you more, but may try to take advantage of your mercy.");
-				} else if (V.PC.pregMood === 2) {
-					option.addComment("Sex scene alterations; slaves will fear you more, but will become more submissive to you.");
-				}
-			}
-
-			if (V.PC.title === 1 && V.PC.boobs <= 100) {
-				option = options.addOption("Your chest is", "boobs", V.PC).addValue("Manly", 100, () => V.PC.boobsImplant = 0);
-			} else {
-				option = options.addOption("Your breasts are", "boobs", V.PC).addValue("Flat", 100, () => V.PC.boobsImplant = 0);
-			}
-			option.addValueList([
-				["C-cups", 500],
-				["DD-cups", 900],
-				["F-cups", 1100],
-				["G-cups", 1300]
-			]);
-
-			if (V.PC.boobs >= 500) {
-				options.addOption("Your breasts are", "boobsImplant", V.PC)
-					.addValueList([
-						["All natural", 0],
-						["Fake", 400]
-					]);
-			}
-
-			el.append(options.render());
-		} else {
-			r = [];
-			r.push(`You are a`);
-			if (V.PC.title === 1) {
-				r.push(`masculine <strong>Master</strong>`);
-			} else {
-				r.push(`feminine ''Mistress'`);
-			}
-			r.push(`and everyone that matters calls you	${PlayerName()}.`);
-
-			r.push(`You are ${V.PC.actualAge} years old which is`);
-			if (V.PC.actualAge >= 65) {
-				r.push(`<strong>old</strong>.`);
-			} else if (V.PC.actualAge >= 50) {
-				r.push(`<strong>well into middle age</strong>.`);
-			} else if (V.PC.actualAge >= 35) {
-				r.push(`<strong>entering middle age</strong>.`);
-			} else {
-				r.push(`<strong>surprisingly young</strong>.`);
-			}
-			App.Events.addNode(el, r, "p");
-
-			r = [];
-
-			r.push(`You are a ${V.PC.nationality} ${V.PC.race} with`);
-			if (V.PC.markings === "heavily freckled") {
-				r.push(`heavily freckled`);
-			} else if (V.PC.markings === "freckles") {
-				r.push(`lightly freckled`);
-			} else {
-				r.push(`clear`);
-			}
-			r.push(`${V.PC.skin} skin, ${V.PC.hColor} hair and ${App.Desc.eyesColor(V.PC)}. You have a ${V.PC.faceShape} face.`);
-			App.Events.addNode(el, r, "p");
-			options = new App.UI.OptionsGroup();
-			options.addOption("Player aging is", "playerAging")
-				.addValue("Enabled", 2).on().addValue("Celebrate birthdays, but don't age.", 1).neutral().addValue("Disabled", 0).off()
-				.addComment("This option cannot be changed during the game.");
-
-			if (V.PC.customTitle) {
-				options.addOption("Custom title", "customTitle", V.PC).showTextBox()
-					.addValue("Reset to default", "", () => { delete V.PC.customTitle; delete V.PC.customTitleLisp; });
-
-				options.addOption("Lisped custom title", "customTitleLisp", V.PC).showTextBox()
-					.addComment('If using a custom title, select Master or Mistress to set the gender of your title. Make sure to replace your "s"s with "th"s to have working lisps in your lisped title.');
-			} else {
-				options.addOption("Custom title", "customTitle", V.PC)
-					.addValue("Set custom title", "Master", () => V.PC.customTitleLisp = 'Mather');
-			}
-
-			App.Intro.refreshmentChoice(options);
-
-			el.append(options.render());
-
-			r = [];
-			switch (V.PC.career) {
-				case "wealth":
-					r.push(`Prior to being an arcology owner, you were a member of the idle wealthy.`);
-					break;
-				case "capitalist":
-					r.push(`Prior to being an arcology owner, you were a business leader.`);
-					break;
-				case "mercenary":
-					r.push(`Prior to being an arcology owner, you were a mercenary.`);
-					break;
-				case "slaver":
-					r.push(`Prior to being an arcology owner, you were a slaver.`);
-					break;
-				case "engineer":
-					r.push(`Prior to being an arcology owner, you were an engineer.`);
-					break;
-				case "medicine":
-					r.push(`Prior to being an arcology owner, you were a surgeon.`);
-					break;
-				case "celebrity":
-					r.push(`Prior to being an arcology owner, you were a minor celebrity.`);
-					break;
-				case "BlackHat":
-					r.push(`Prior to being an arcology owner, you specialized in cracking databases and making mockeries of cyber security.`);
-					break;
-				case "arcology owner":
-					r.push(`Being an arcology owner defines your life now.`);
-					break;
-				case "escort":
-					r.push(`Prior to being an arcology owner, you knew how to survive off your looks and body.`);
-					break;
-				case "servant":
-					r.push(`Prior to being an arcology owner, you served a well-off`);
-					if (V.PC.counter.birthMaster >= 2) {
-						r.push(`master and bore him several children.`);
-					} else {
-						r.push(`master.`);
-					}
-					break;
-				case "gang":
-					r.push(`Prior to being an arcology owner, you were the leader of a ruthless gang.`);
-					break;
-			}
-
-			r.push(`Word in the arcology is you acquired it through`);
-			switch (V.PC.rumor) {
-				case "wealth":
-					r.push(`a rather ridiculous amount of money.`);
-					break;
-				case "diligence":
-					r.push(`sheer effort.`);
-					break;
-				case "force":
-					r.push(`brutal force.`);
-					break;
-				case "social engineering":
-					r.push(`clever social manipulation.`);
-					break;
-				case "luck":
-					r.push(`blind luck.`);
-					break;
-			}
-			App.Events.addNode(el, r, "p");
-
-			r = [];
-			r.push(`You have a`);
-			if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
-				r.push(`penis and vagina`);
-			} else if (V.PC.dick !== 0) {
-				r.push(`penis.`);
-			} else if (V.PC.vagina !== -1) {
-				r.push(`vagina`);
-			}
-			if (V.PC.vagina !== -1) {
-				r.push(`and are`);
-				if (V.PC.pregWeek < 0) {
-					r.push(`recovering from your last pregnancy.`);
-				} else if (V.PC.preg === -2) {
-					r.push(`infertile.`);
-				} else if (V.PC.preg === -1) {
-					r.push(`taking contraceptives.`);
-				} else if (V.PC.preg === 0) {
-					r.push(`fertile.`);
-				} else if (V.PC.preg > 37) {
-					r.push(`extremely pregnant.`);
-				} else if (V.PC.preg > 0) {
-					r.push(`pregnant.`);
-				}
-
-				linkArray = [];
-				if (V.PC.preg > 20 || V.PC.counter.birthsTotal > 0) {
-					if (V.PC.pregMood === 1) {
-						r.push(`You tend to be caring and motherly when you're pregnant.`);
-						linkArray.push(noChange(), aggressive());
-					} else if (V.PC.pregMood === 0) {
-						r.push(`Pregnancy doesn't really affect your mood.`);
-						linkArray.push(motherly(), aggressive());
-					} else {
-						r.push(`You tend to be very demanding and aggressive when you're pregnant.`);
-						linkArray.push(noChange(), motherly());
-					}
-				} else {
-					if (V.PC.pregMood === 1) {
-						r.push(`You tend to be caring and motherly when you're hormonal.`);
-						linkArray.push(noChange(), aggressive());
-					} else if (V.PC.pregMood === 0) {
-						r.push(`Your mood isn't tied to your hormones.`);
-						linkArray.push(motherly(), aggressive());
-					} else {
-						r.push(`You tend to be very demanding and aggressive when you're hormonal.`);
-						linkArray.push(noChange(), motherly());
-					}
-				}
-
-				r.push(App.UI.DOM.generateLinksStrip(linkArray));
-				if (V.PC.counter.birthsTotal > 0) {
-					r.push(`You have given birth to ${V.PC.counter.birthsTotal} babies.`);
-				}
-			}
-
-			if (V.PC.boobs >= 300) {
-				r.push(`You have a`);
-				if (V.PC.title > 0) {
-					r.push(`masculine`);
-				} else {
-					r.push(`feminine`);
-				}
-				r.push(`body with`);
-				if (V.PC.boobs >= 1400) {
-					r.push(`giant${(V.PC.boobsImplant !== 0) ? `, fake` : ``} cow tits.`);
-				} else if (V.PC.boobs >= 1200) {
-					r.push(`huge`);
-					if (V.PC.boobsImplant !== 0) {
-						r.push(`fake`);
-					}
-					r.push(`breasts.`);
-				} else if (V.PC.boobs >= 1000) {
-					r.push(`big`);
-					if (V.PC.boobsImplant !== 0) {
-						r.push(`fake`);
-					}
-					r.push(`breasts.`);
-				} else if (V.PC.boobs >= 800) {
-					r.push(`noticeable breasts.`);
-				} else if (V.PC.boobs >= 650) {
-					r.push(`unremarkable breasts.`);
-				} else if (V.PC.boobs >= 500) {
-					r.push(`average breasts.`);
-				} else {
-					r.push(`small breasts.`);
-				}
-			} else {
-				if (V.PC.title > 0) {
-					r.push(`You have a manly chest.`);
-				} else {
-					r.push(`You are flat as a board.`);
-				}
-			}
-			App.Events.addNode(el, r, "p");
-		}
-
-		return el;
-	}
-
 	function interfaceContent() {
 		const el = new DocumentFragment();
 		let options = new App.UI.OptionsGroup();
@@ -1060,31 +632,4 @@ App.Intro.summary = function() {
 		el.append(App.UI.artOptions());
 		return el;
 	}
-
-	function noChange() {
-		return App.UI.DOM.link(
-			"Change to no change",
-			() => { V.PC.pregMood = 0; },
-			[],
-			"Intro Summary"
-		);
-	}
-
-	function motherly() {
-		return App.UI.DOM.link(
-			"Change to motherly",
-			() => { V.PC.pregMood = 1; },
-			[],
-			"Intro Summary"
-		);
-	}
-
-	function aggressive() {
-		return App.UI.DOM.link(
-			"Change to aggressive",
-			() => { V.PC.pregMood = 2; },
-			[],
-			"Intro Summary"
-		);
-	}
 };
diff --git a/src/events/intro/pcAppearance.js b/src/events/intro/pcAppearance.js
index cec9e6a2ac5..70bda99103e 100644
--- a/src/events/intro/pcAppearance.js
+++ b/src/events/intro/pcAppearance.js
@@ -1,4 +1,6 @@
-App.Intro.pcAppearance = function(options) {
+App.UI.Player = {};
+
+App.UI.Player.appearance = function(options) {
 	options.addOption("Your nationality is", "nationality", V.PC).showTextBox()
 		.addValueList(Object.keys(App.Data.SlaveSummary.short.nationality))
 		.addComment("For best result capitalize it.");
@@ -23,7 +25,7 @@ App.Intro.pcAppearance = function(options) {
 	}
 };
 
-App.Intro.refreshmentChoice = function(options) {
+App.UI.Player.refreshmentChoice = function(options) {
 	options.addOption("Your preferred refreshment is", "refreshment", V.PC).showTextBox()
 		.addValue("Cigars", "cigar", () => { V.PC.refreshmentType = 0; })
 		.addValue("Whiskey", "whiskey", () => { V.PC.refreshmentType = 1; });
@@ -42,7 +44,7 @@ App.Intro.refreshmentChoice = function(options) {
 	option.addComment(comment);
 };
 
-App.Intro.PCNames = function(options) {
+App.UI.Player.names = function(options) {
 	options.addOption(`Everyone calls you <b>${PlayerName()}.</b>`);
 	options.addOption("Your given name is", "slaveName", V.PC).showTextBox();
 
@@ -56,3 +58,459 @@ App.Intro.PCNames = function(options) {
 			.addComment("Surnames cannot be changed during the game outside of special circumstances.");
 	}
 };
+
+App.UI.Player.design = function() {
+	const el = new DocumentFragment();
+	let options = new App.UI.OptionsGroup();
+	let option;
+	let r;
+	let linkArray;
+	const freshStart = (V.freshPC === 1 || V.saveImported === 0);
+
+	if (freshStart) {
+		options.addOption("You are a", "title", V.PC)
+			.addValue("Masculine Master", 1, () => V.PC.genes = "XY").addValue("Feminine Mistress", 0, () => V.PC.genes = "XX");
+
+		App.UI.Player.names(options);
+
+		V.PC.physicalAge = V.PC.actualAge;
+		V.PC.visualAge = V.PC.actualAge;
+		options.addOption("You are", "actualAge", V.PC).showTextBox()
+			.addRange(25, 35, "<", "Surprisingly young").addRange(40, 50, "<", "Entering middle age")
+			.addRange(55, 65, "<", "Well into middle age").addRange(70, 65, ">=", "Old");
+
+		options.addOption(`Your birthday was <strong>${V.PC.birthWeek}</strong> weeks ago.`, "birthWeek", V.PC).showTextBox();
+
+		options.addOption("Player aging is", "playerAging")
+			.addValue("Enabled", 2).on().addValue("Celebrate birthdays, but don't age.", 1).neutral().addValue("Disabled", 0).off()
+			.addComment("This option cannot be changed during the game.");
+
+		if (V.PC.customTitle) {
+			options.addOption("Custom title", "customTitle", V.PC).showTextBox()
+				.addValue("Reset to default", "", () => { delete V.PC.customTitle; delete V.PC.customTitleLisp; });
+
+			options.addOption("Lisped custom title", "customTitleLisp", V.PC).showTextBox()
+				.addComment('If using a custom title, select Master or Mistress to set the gender of your title. Make sure to replace your "s"s with "th"s to have working lisps in your lisped title.');
+		} else {
+			options.addOption("Custom title", "customTitle", V.PC)
+				.addValue("Set custom title", "Master", () => V.PC.customTitleLisp = 'Mather');
+		}
+
+		App.UI.Player.appearance(options);
+
+		options.addOption("Your face is", "faceShape", V.PC)
+			.addValueList([
+				["Normal", "normal"],
+				["Androgynous", "androgynous"],
+				["Masculine", "masculine"],
+				["Cute", "cute"],
+				["Sensual", "sensual"],
+				["Exotic", "exotic"]
+			]);
+
+		App.UI.Player.refreshmentChoice(options);
+
+		option = options.addOption("Before you came to the Free Cities, you were a", "career", V.PC);
+		if (V.PC.career === "arcology owner") {
+			option.addValue("Arcology owner", "arcology owner");
+		} else {
+			option.addValueList([
+				["Member of the idle wealthy", "wealth"],
+				["Business leader", "capitalist"],
+				["Mercenary", "mercenary"],
+				["Slaver", "slaver"],
+				["Engineer", "engineer"],
+				["Doctor", "medicine"],
+				["Hacker", "BlackHat"],
+				["Minor celebrity", "celebrity"],
+				["Escort", "escort"],
+				["Servant", "servant"],
+				["Gang leader", "gang"]]
+			);
+			if (V.secExpEnabled > 0) {
+				switch (V.PC.career) {
+					case "capitalist":
+						option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
+						break;
+					case "mercenary":
+						option.addComment(`<div><span class="green">Easier to maintain security</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+						break;
+					case "slaver":
+						option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+						break;
+					case "engineer":
+						option.addComment(`<div><span class="yellowgreen">construction and upgrade of facilities will be cheaper.</span></div>`);
+						break;
+					case "medicine":
+						option.addComment(`<div><span class="yellowgreen">Drug upgrades will be cheaper.</span></div>`);
+						break;
+					case "celebrity":
+						option.addComment(`<div><span class="yellowgreen">The propaganda hub's upgrades will be cheaper.</span></div>`);
+						break;
+					case "escort":
+						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+						break;
+					case "servant":
+						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+						break;
+					case "gang":
+						option.addComment(`<div><span class="green">Easier to maintain authority</span> and <span class="yellowgreen">the security HQ's upgrades will be cheaper.</span></div>`);
+						break;
+					case "BlackHat":
+						option.addComment(`<div><span class="red">Harder to maintain authority.</span></div>`);
+						break;
+					default:
+						option.addComment(`<div><span class="red">Harder to maintain authority,</span> but <span class="yellowgreen">the propaganda hub's upgrades will be cheaper.</span></div>`);
+				}
+			}
+		}
+
+		options.addOption("It is rumored that you acquired your arcology through", "rumor", V.PC)
+			.addValueList([
+				["Wealth", "wealth"],
+				["Hard work", "diligence"],
+				["Force", "force"],
+				["Social engineering", "social engineering"],
+				["Blind luck", "luck"]
+			]);
+
+		el.append(options.render());
+
+		App.UI.DOM.appendNewElement("h2", el, "Sexuality");
+		options = new App.UI.OptionsGroup();
+
+		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
+			State.temporary.vaginaPenis = 2;
+		} else if (V.PC.vagina !== -1) {
+			State.temporary.vaginaPenis = 1;
+		} else {
+			State.temporary.vaginaPenis = 0;
+		}
+
+		option = options.addOption("You have a", "vaginaPenis", State.temporary)
+			.addValue("Penis", 0, () => {
+				V.PC.preg = 0;
+				V.PC.pregType = 0;
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = 3;
+				V.PC.prostate = 1;
+				V.PC.vagina = -1;
+				V.PC.ovaries = 0;
+			}).addValue("Vagina", 1, () => {
+				V.PC.dick = 0;
+				V.PC.balls = 0;
+				V.PC.scrotum = 0;
+				V.PC.prostate = 0;
+				V.PC.vagina = 1;
+				V.PC.ovaries = 1;
+			}).addValue("Penis and Vagina", 2, () => {
+				V.PC.dick = 4;
+				V.PC.balls = 3;
+				V.PC.scrotum = 3;
+				V.PC.prostate = 1;
+				V.PC.vagina = 1;
+				V.PC.ovaries = 1;
+			});
+		if (State.temporary.vaginaPenis === 0) {
+			option.addComment("Standard sex scenes; easiest reputation maintenance.");
+		} else if (State.temporary.vaginaPenis === 1) {
+			option.addComment("Sex scene variations; most difficult reputation maintenance.");
+		} else {
+			option.addComment("Sex scene variations; more difficult reputation maintenance; some unique opportunities, especially with breasts.");
+		}
+
+		if (V.PC.vagina !== -1) {
+			option = options.addOption("You are", "preg", V.PC)
+				.addValue("Taking contraceptives", -1, () => { V.PC.pregType = 0; V.PC.labor = 0; })
+				.addValue("Not taking contraceptives", 0, () => { V.PC.pregType = 0; V.PC.labor = 0; })
+				.addRange(16, 37, "<=", "Pregnant").addCallback(() => { V.PC.pregType = 1; V.PC.labor = 0; })
+				.addRange(40, 42, "<=", "Ready to drop").addCallback(() => { V.PC.pregType = 1; V.PC.labor = 0; })
+				.addRange(43, 42, ">", "Ready to drop with octuplets").addCallback(() => { V.PC.pregType = 8; V.PC.labor = 1; });
+			if (V.PC.preg === -1) {
+				option.addComment("You can't get pregnant, however there will be a slight increase to living expenses.");
+			}
+
+			if (V.PC.counter.birthsTotal > 0) {
+				options.addOption("").addComment(`You have given birth to <strong>${V.PC.counter.birthsTotal}</strong> babies.`);
+			}
+
+			option = options.addOption("Hormone effects", "pregMood", V.PC)
+				.addValueList([
+					["None", 0],
+					["Caring and motherly", 1],
+					["Aggressive and domineering", 2]
+				]);
+			if (V.PC.pregMood === 1) {
+				option.addComment("Sex scene alterations; slaves will trust you more, but may try to take advantage of your mercy.");
+			} else if (V.PC.pregMood === 2) {
+				option.addComment("Sex scene alterations; slaves will fear you more, but will become more submissive to you.");
+			}
+		}
+
+		if (V.PC.title === 1 && V.PC.boobs <= 100) {
+			option = options.addOption("Your chest is", "boobs", V.PC).addValue("Manly", 100, () => V.PC.boobsImplant = 0);
+		} else {
+			option = options.addOption("Your breasts are", "boobs", V.PC).addValue("Flat", 100, () => V.PC.boobsImplant = 0);
+		}
+		option.addValueList([
+			["C-cups", 500],
+			["DD-cups", 900],
+			["F-cups", 1100],
+			["G-cups", 1300]
+		]);
+
+		if (V.PC.boobs >= 500) {
+			options.addOption("Your breasts are", "boobsImplant", V.PC)
+				.addValueList([
+					["All natural", 0],
+					["Fake", 400]
+				]);
+		}
+
+		el.append(options.render());
+	} else {
+		r = [];
+		r.push(`You are a`);
+		if (V.PC.title === 1) {
+			r.push(`masculine <strong>Master</strong>`);
+		} else {
+			r.push(`feminine ''Mistress'`);
+		}
+		r.push(`and everyone that matters calls you	${PlayerName()}.`);
+
+		r.push(`You are ${V.PC.actualAge} years old which is`);
+		if (V.PC.actualAge >= 65) {
+			r.push(`<strong>old</strong>.`);
+		} else if (V.PC.actualAge >= 50) {
+			r.push(`<strong>well into middle age</strong>.`);
+		} else if (V.PC.actualAge >= 35) {
+			r.push(`<strong>entering middle age</strong>.`);
+		} else {
+			r.push(`<strong>surprisingly young</strong>.`);
+		}
+		App.Events.addNode(el, r, "p");
+
+		r = [];
+
+		r.push(`You are a ${V.PC.nationality} ${V.PC.race} with`);
+		if (V.PC.markings === "heavily freckled") {
+			r.push(`heavily freckled`);
+		} else if (V.PC.markings === "freckles") {
+			r.push(`lightly freckled`);
+		} else {
+			r.push(`clear`);
+		}
+		r.push(`${V.PC.skin} skin, ${V.PC.hColor} hair and ${App.Desc.eyesColor(V.PC)}. You have a ${V.PC.faceShape} face.`);
+		App.Events.addNode(el, r, "p");
+		options = new App.UI.OptionsGroup();
+		options.addOption("Player aging is", "playerAging")
+			.addValue("Enabled", 2).on().addValue("Celebrate birthdays, but don't age.", 1).neutral().addValue("Disabled", 0).off()
+			.addComment("This option cannot be changed during the game.");
+
+		if (V.PC.customTitle) {
+			options.addOption("Custom title", "customTitle", V.PC).showTextBox()
+				.addValue("Reset to default", "", () => { delete V.PC.customTitle; delete V.PC.customTitleLisp; });
+
+			options.addOption("Lisped custom title", "customTitleLisp", V.PC).showTextBox()
+				.addComment('If using a custom title, select Master or Mistress to set the gender of your title. Make sure to replace your "s"s with "th"s to have working lisps in your lisped title.');
+		} else {
+			options.addOption("Custom title", "customTitle", V.PC)
+				.addValue("Set custom title", "Master", () => V.PC.customTitleLisp = 'Mather');
+		}
+
+		App.UI.Player.refreshmentChoice(options);
+
+		el.append(options.render());
+
+		r = [];
+		switch (V.PC.career) {
+			case "wealth":
+				r.push(`Prior to being an arcology owner, you were a member of the idle wealthy.`);
+				break;
+			case "capitalist":
+				r.push(`Prior to being an arcology owner, you were a business leader.`);
+				break;
+			case "mercenary":
+				r.push(`Prior to being an arcology owner, you were a mercenary.`);
+				break;
+			case "slaver":
+				r.push(`Prior to being an arcology owner, you were a slaver.`);
+				break;
+			case "engineer":
+				r.push(`Prior to being an arcology owner, you were an engineer.`);
+				break;
+			case "medicine":
+				r.push(`Prior to being an arcology owner, you were a surgeon.`);
+				break;
+			case "celebrity":
+				r.push(`Prior to being an arcology owner, you were a minor celebrity.`);
+				break;
+			case "BlackHat":
+				r.push(`Prior to being an arcology owner, you specialized in cracking databases and making mockeries of cyber security.`);
+				break;
+			case "arcology owner":
+				r.push(`Being an arcology owner defines your life now.`);
+				break;
+			case "escort":
+				r.push(`Prior to being an arcology owner, you knew how to survive off your looks and body.`);
+				break;
+			case "servant":
+				r.push(`Prior to being an arcology owner, you served a well-off`);
+				if (V.PC.counter.birthMaster >= 2) {
+					r.push(`master and bore him several children.`);
+				} else {
+					r.push(`master.`);
+				}
+				break;
+			case "gang":
+				r.push(`Prior to being an arcology owner, you were the leader of a ruthless gang.`);
+				break;
+		}
+
+		r.push(`Word in the arcology is you acquired it through`);
+		switch (V.PC.rumor) {
+			case "wealth":
+				r.push(`a rather ridiculous amount of money.`);
+				break;
+			case "diligence":
+				r.push(`sheer effort.`);
+				break;
+			case "force":
+				r.push(`brutal force.`);
+				break;
+			case "social engineering":
+				r.push(`clever social manipulation.`);
+				break;
+			case "luck":
+				r.push(`blind luck.`);
+				break;
+		}
+		App.Events.addNode(el, r, "p");
+
+		r = [];
+		r.push(`You have a`);
+		if (V.PC.vagina !== -1 && V.PC.dick !== 0) {
+			r.push(`penis and vagina`);
+		} else if (V.PC.dick !== 0) {
+			r.push(`penis.`);
+		} else if (V.PC.vagina !== -1) {
+			r.push(`vagina`);
+		}
+		if (V.PC.vagina !== -1) {
+			r.push(`and are`);
+			if (V.PC.pregWeek < 0) {
+				r.push(`recovering from your last pregnancy.`);
+			} else if (V.PC.preg === -2) {
+				r.push(`infertile.`);
+			} else if (V.PC.preg === -1) {
+				r.push(`taking contraceptives.`);
+			} else if (V.PC.preg === 0) {
+				r.push(`fertile.`);
+			} else if (V.PC.preg > 37) {
+				r.push(`extremely pregnant.`);
+			} else if (V.PC.preg > 0) {
+				r.push(`pregnant.`);
+			}
+
+			linkArray = [];
+			if (V.PC.preg > 20 || V.PC.counter.birthsTotal > 0) {
+				if (V.PC.pregMood === 1) {
+					r.push(`You tend to be caring and motherly when you're pregnant.`);
+					linkArray.push(noChange(), aggressive());
+				} else if (V.PC.pregMood === 0) {
+					r.push(`Pregnancy doesn't really affect your mood.`);
+					linkArray.push(motherly(), aggressive());
+				} else {
+					r.push(`You tend to be very demanding and aggressive when you're pregnant.`);
+					linkArray.push(noChange(), motherly());
+				}
+			} else {
+				if (V.PC.pregMood === 1) {
+					r.push(`You tend to be caring and motherly when you're hormonal.`);
+					linkArray.push(noChange(), aggressive());
+				} else if (V.PC.pregMood === 0) {
+					r.push(`Your mood isn't tied to your hormones.`);
+					linkArray.push(motherly(), aggressive());
+				} else {
+					r.push(`You tend to be very demanding and aggressive when you're hormonal.`);
+					linkArray.push(noChange(), motherly());
+				}
+			}
+
+			r.push(App.UI.DOM.generateLinksStrip(linkArray));
+			if (V.PC.counter.birthsTotal > 0) {
+				r.push(`You have given birth to ${V.PC.counter.birthsTotal} babies.`);
+			}
+		}
+
+		if (V.PC.boobs >= 300) {
+			r.push(`You have a`);
+			if (V.PC.title > 0) {
+				r.push(`masculine`);
+			} else {
+				r.push(`feminine`);
+			}
+			r.push(`body with`);
+			if (V.PC.boobs >= 1400) {
+				r.push(`giant${(V.PC.boobsImplant !== 0) ? `, fake` : ``} cow tits.`);
+			} else if (V.PC.boobs >= 1200) {
+				r.push(`huge`);
+				if (V.PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts.`);
+			} else if (V.PC.boobs >= 1000) {
+				r.push(`big`);
+				if (V.PC.boobsImplant !== 0) {
+					r.push(`fake`);
+				}
+				r.push(`breasts.`);
+			} else if (V.PC.boobs >= 800) {
+				r.push(`noticeable breasts.`);
+			} else if (V.PC.boobs >= 650) {
+				r.push(`unremarkable breasts.`);
+			} else if (V.PC.boobs >= 500) {
+				r.push(`average breasts.`);
+			} else {
+				r.push(`small breasts.`);
+			}
+		} else {
+			if (V.PC.title > 0) {
+				r.push(`You have a manly chest.`);
+			} else {
+				r.push(`You are flat as a board.`);
+			}
+		}
+		App.Events.addNode(el, r, "p");
+	}
+
+	return el;
+
+	function noChange() {
+		return App.UI.DOM.link(
+			"Change to no change",
+			() => { V.PC.pregMood = 0; },
+			[],
+			"Intro Summary"
+		);
+	}
+
+	function motherly() {
+		return App.UI.DOM.link(
+			"Change to motherly",
+			() => { V.PC.pregMood = 1; },
+			[],
+			"Intro Summary"
+		);
+	}
+
+	function aggressive() {
+		return App.UI.DOM.link(
+			"Change to aggressive",
+			() => { V.PC.pregMood = 2; },
+			[],
+			"Intro Summary"
+		);
+	}
+};
diff --git a/src/events/intro/pcAppearanceIntro.tw b/src/events/intro/pcAppearanceIntro.tw
index 3c9e22e1a7c..3854ab1ddab 100644
--- a/src/events/intro/pcAppearanceIntro.tw
+++ b/src/events/intro/pcAppearanceIntro.tw
@@ -7,7 +7,7 @@
 	</div>
 </p>
 <<set _options = new App.UI.OptionsGroup()>>
-<<run App.Intro.pcAppearance(_options)>>
+<<run App.UI.Player.appearance(_options)>>
 <<includeDOM _options.render()>>
 
 <p>
diff --git a/src/events/intro/pcBodyIntro.js b/src/events/intro/pcBodyIntro.js
index 9be66507771..f22df55907d 100644
--- a/src/events/intro/pcBodyIntro.js
+++ b/src/events/intro/pcBodyIntro.js
@@ -150,8 +150,8 @@ App.Intro.PCBodyIntro = function() {
 
 		App.UI.DOM.appendNewElement("div", el, `What is your name and alternate indulgence?`, ["intro", "question"]);
 
-		App.Intro.PCNames(options);
-		App.Intro.refreshmentChoice(options);
+		App.UI.Player.names(options);
+		App.UI.Player.refreshmentChoice(options);
 
 		el.append(options.render());
 
-- 
GitLab