From 3cb0f60ee3a799cfc7214b9df7f7b75194739493 Mon Sep 17 00:00:00 2001
From: lowercasedonkey <lowercasedonkey@gmail.com>
Date: Wed, 16 Dec 2020 17:31:51 -0500
Subject: [PATCH] Hair and skin

---
 src/facilities/salon/salonPassage.js | 64 +++++++++++++++++++++++-----
 src/js/rulesAssistantOptions.js      |  8 +---
 src/js/salon.js                      | 37 +++++++++-------
 3 files changed, 76 insertions(+), 33 deletions(-)

diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js
index 5c8b678c639..8165ec052c5 100644
--- a/src/facilities/salon/salonPassage.js
+++ b/src/facilities/salon/salonPassage.js
@@ -30,7 +30,9 @@ App.UI.salon = function(slave, cheat = false) {
 		if (slave.horn !== "none") {
 			el.append(horns());
 		}
+		el.append(hair());
 		el.append(makeup());
+		el.append(skin());
 		return el;
 	}
 
@@ -143,24 +145,64 @@ App.UI.salon = function(slave, cheat = false) {
 		return el;
 	}
 
+	function hair() {
+		const el = new DocumentFragment();
+		App.UI.DOM.appendNewElement("h2", el, "Hair");
+
+		el.append(App.Medicine.Salon.hair(slave, {cheat: cheat}));
+		return el;
+	}
+
 	function skin() {
 		const el = new DocumentFragment();
 		App.UI.DOM.appendNewElement("h2", el, "Skin");
 		const options = new App.UI.OptionsGroup();
+		let comment = [];
 
-		options.addOption(App.Desc.makeup(slave), "makeup", slave)
-			.addValue("Nice", 1, billMod)
-			.addValue("Gorgeous", 2, billMod)
-			.addValue("Slutty", 4, billMod)
-			.addValue("Color-coordinate with hair", 3, billMod);
+		let option = options.addOption(`${His} skin is ${slave.skin}.`, "skin", slave);
+		if (App.Data.misc.dyedSkins.includes(slave.skin)) {
+			option.addValue("Remove coloring", slave.origSkin, billMod);
+		} else if (((slave.skin === "sun tanned") || (slave.skin === "spray tanned"))) {
+			option.addValue("Remove tanning", slave.origSkin, billMod);
+		}
 
-		options.addOption("", "makeup", slave)
-			.addValue("Neon", 5, billMod)
-			.addValue("Neon, color-coordinate with hair", 6, billMod);
+		if (!App.Data.misc.dyedSkins.includes(slave.skin)) {
+			if (slave.skin === "sun tanned" || slave.skin === "spray tanned") {
+				comment.push(`${His} skin tanning must be removed before any advanced procedure to change ${his} skin color.`);
+			} else {
+				if (skinToneLevel(slave.skin) > 1) {
+					option.addValue("Bleach", changeSkinTone(slave.skin, -2), billMod);
+				}
+				if (skinToneLevel(slave.skin) > 8) {
+					option.addValue("Lighten", changeSkinTone(slave.skin, -1), billMod);
+				}
+				if (skinToneLevel(slave.skin) < 18) {
+					option.addValue("Darken", changeSkinTone(slave.skin, 1), billMod);
+				}
+				if (skinToneLevel(slave.skin) < 25) {
+					option.addValue("Blacken", changeSkinTone(slave.skin, 2), billMod);
+				}
+			}
+			if (slave.skin !== "sun tanned") {
+				if (skinToneLevel(slave.skin) < 6) {
+					comment.push(`${His} skin is so light in color that any attempt at natural tanning is more likely to damage ${his} skin.`);
+				} else if ((skinToneLevel(slave.skin) > 20)) {
+					comment.push(`${His} skin is so dark in color that any attempt at natural tanning is not likely to appear on ${his} skin.`);
+				} else {
+					option.addValue("Sun tan", "sun tanned", billMod);
+				}
+			}
+			if (slave.skin !== "spray tanned") {
+				option.addValue("Spray tan", "sun tanned", billMod)
+			}
+			option.addComment(comment.join(" "));
+		}
 
-		options.addOption("", "makeup", slave)
-			.addValue("Metallic", 7, billMod)
-			.addValue("Metallic, color-coordinate with hair", 8, billMod);
+		option = options.addOption(`Dye or paint`, "skin", slave);
+		for (const dye of App.Data.misc.dyedSkins) {
+			option.addValue(capFirstChar(dye), dye, billMod);
+		}
+		option.pulldown();
 
 		el.append(options.render());
 
diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js
index 03ce426239d..82a082bc044 100644
--- a/src/js/rulesAssistantOptions.js
+++ b/src/js/rulesAssistantOptions.js
@@ -4022,13 +4022,7 @@ globalThis.rulesAssistantOptions = (function() {
 				["pure black"],
 				["sun tanned"],
 				["spray tanned"],
-				["dyed red"],
-				["dyed green"],
-				["dyed blue"],
-				["dyed pink"],
-				["dyed gray"],
-				["tiger striped"],
-				["camouflage patterned"],
+				...App.Data.misc.dyedSkins
 			];
 			super("Dye or tan skin", items);
 			this.setValue(current_rule.set.skinColor);
diff --git a/src/js/salon.js b/src/js/salon.js
index 92a5bb4b770..04e21f62dd8 100644
--- a/src/js/salon.js
+++ b/src/js/salon.js
@@ -335,30 +335,37 @@ App.Medicine.Salon.ears = function(slave, {primaryEarColor = 0, secondaryEarColo
  * @param {number|string} [params.primaryHairColor]
  * @param {string} [params.secondaryHairColor]
  * @param {Boolean} [params.cheat=false]
- * @returns {JQuery<HTMLElement>}
+ * @returns {HTMLElement}
  */
 App.Medicine.Salon.hair = function(slave, {primaryHairColor = 0, secondaryHairColor = "", cheat = false} = {}) {
-	const frag = new DocumentFragment();
 	let updatePrimary = (newVal) => { primaryHairColor = newVal.value; apply(); };
 	let updateSecondary = (newVal) => { secondaryHairColor = newVal.value; apply(); };
 	const {His, his, He, him} = getPronouns(slave);
+	const div = document.createElement("div");
+	div.id = "salon-hair";
+	div.append(contents());
 
-	if (slave.bald !== 1) {
-		frag.append(hairDye());
-		frag.append(hairStyle());
-		frag.append(hairLength());
-		frag.append(hairMaint());
-	} else {
-		// Bald
-		if (slave.hStyle === "bald") {
-			frag.append(`${He} is completely bald. `);
+	return div;
+
+	function contents() {
+		const frag = new DocumentFragment();
+		if (slave.bald !== 1) {
+			frag.append(hairDye());
+			frag.append(hairStyle());
+			frag.append(hairLength());
+			frag.append(hairMaint());
 		} else {
-			frag.append(wigDye());
+			// Bald
+			if (slave.hStyle === "bald") {
+				frag.append(`${He} is completely bald. `);
+			} else {
+				frag.append(wigDye());
+			}
+			frag.append(wigStyle());
+			frag.append(wigLength());
 		}
-		frag.append(wigStyle());
-		frag.append(wigLength());
+		return frag;
 	}
-	return jQuery("#salon-hair").empty().append(frag);
 
 	function hairDye() {
 		const frag = new DocumentFragment();
-- 
GitLab