From 5f37769c12e41ab89c9c06b09cf70a512eab34fd Mon Sep 17 00:00:00 2001
From: kopareigns <kopareigns@gmail.com>
Date: Thu, 26 Jul 2018 01:02:33 -0400
Subject: [PATCH] Collecting art related JS

---
 devNotes/twine JS.txt                         | 172 ++++++++++--------
 src/{js/artColorToolsJS.tw => art/artJS.tw}   | 130 ++++++++++++-
 src/art/vector/Helper_Functions.tw            |  15 --
 .../vectorRevampedArtControlJS.tw             |   0
 src/js/artJS.tw                               | 115 ------------
 5 files changed, 221 insertions(+), 211 deletions(-)
 rename src/{js/artColorToolsJS.tw => art/artJS.tw} (53%)
 delete mode 100644 src/art/vector/Helper_Functions.tw
 rename src/{js => art/vector_revamp}/vectorRevampedArtControlJS.tw (100%)
 delete mode 100644 src/js/artJS.tw

diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt
index 5f11b45370b..57bcbcad9a4 100644
--- a/devNotes/twine JS.txt	
+++ b/devNotes/twine JS.txt	
@@ -11475,86 +11475,6 @@ window.getHeroSlave = function(heroSlave, baseHeroSlave) {
     return newSlave;
 }
 
-/*:: Art Color Tools JS [script]*/
-
-/* 
-This takes a textual hair colour description and tries to guess the appropriate HTML compliant color code.
-
-hColor should be a color name, but can also be a string describing hair colour.
-
-This code's working is described to the user in the Encyclopedia, chapter "Lore", section "Dyes".
-*/
-window.extractHairColor = function(hColor) {
-	/* 
-	these are color names known and used in FreeCities 
-	attributed color names are at the front of the array
-	*/
-	var FCname2HTMLarray = [
-		["blazing red", "#E00E2B"],
-		["neon green", "#25d12b"],
-		["neon blue", "#2284C3"],
-		["neon pink", "#cc26aa"],
-		["strawberry-blonde", "#e5a88c"],
-		["platinum blonde", "#fcf3c1"],
-		["dark brown", "#463325"],
-		["brown", "#8D4F21"],
-		["auburn", "#7e543e"],
-		["black", "#3F4040"],
-		["blonde", "#F4F1A3"],
-		["blue", "#4685C5"],
-		["burgundy", "#5f3946"],
-		["chestnut", "#663622"],
-		["chocolate", "#6e4937"],
-		["copper", "#a16145"],
-		["ginger", "#da822d"],
-		["golden", "#ffdf31"],
-		["green", "#5FBA46"],
-		["grey", "#9e9fa4"],
-		["hazel", "#8d6f1f"],
-		["pink", "#D18CBC"],
-		["red", "#BB2027"],
-		["deep red", "#6D1318"],
-		["blue-violet", "#8790B7"],
-		["silver", "#cdc9c6"],
-		["light olive", "#d4c6bb"],
-		["dark", "#a46237"],
-		/* these are not actually FreeCities canon, but like to appear in custom descriptions */
-		["dark", "#463325"],
-		["brunette", "#8D4F21"]
-	];
-	
-	/* these are HTML color names supported by most browsers */
-	var HTMLstandardColors = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred ","indigo ","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"];
-	
-	var FCnames = new Map(FCname2HTMLarray);
-	hColor = hColor.toLowerCase(); /* normalization: lowercase color name */
-	var colorCode = FCnames.get(hColor); /* look up in FreeCities color names */
-	if (!colorCode) { /* not a FreeCities color name*/
-		if (HTMLstandardColors.includes(hColor) || hColor.match(/^#([0-9a-f]{3}){1,2}$/) !== null) {
-			colorCode = hColor; /* is a HTML color name or value, use it directly */
-		} else { 
-			/* 
-			is not even a HTML color name. hColor probably is a description.
-			look for anything resembling a valid color name within the description.
-			*/
-			var hColorNoSpaces = hColor.replace(/\s+/g, ''); /* remove all spaces from description */
-			var FCkeys = Array.from(FCnames.keys());
-			var colorCodes = [
-				FCnames.get(FCkeys.find(function (e){return hColor.startsWith(e);})),
-				HTMLstandardColors.find(function (e){return hColorNoSpaces.startsWith(e);}),
-				FCnames.get(FCkeys.find(function (e){return hColor.includes(e);})),
-				HTMLstandardColors.find(function (e){return hColorNoSpaces.includes(e);})
-			];
-			colorCode = colorCodes.find(function (e){return e;}); /* picks the first successful guess */
-		}
-	}
-	if (!colorCode) {
-		console.log("Art Color Tools JS: Unable to determine HTML compliant color code for hair color string '"+hColor+"'.");
-		colorCode = "fuchsia"; /* use fuchsia as error marker */
-	}
-	return colorCode;
-};
-
 /*SFJS [script]*/
 
 window.simpleWorldEconomyCheck = function() {
@@ -23274,3 +23194,95 @@ window.ArtControlRendered = function ArtControlRendered(slave, sizePlacement) {
 	}
 	return r;
 };
+
+/* 
+This takes a textual hair colour description and tries to guess the appropriate HTML compliant color code.
+
+hColor should be a color name, but can also be a string describing hair colour.
+
+This code's working is described to the user in the Encyclopedia, chapter "Lore", section "Dyes".
+*/
+window.extractHairColor = function(hColor) {
+	/* 
+	these are color names known and used in FreeCities 
+	attributed color names are at the front of the array
+	*/
+	var FCname2HTMLarray = [
+		["blazing red", "#E00E2B"],
+		["neon green", "#25d12b"],
+		["neon blue", "#2284C3"],
+		["neon pink", "#cc26aa"],
+		["strawberry-blonde", "#e5a88c"],
+		["platinum blonde", "#fcf3c1"],
+		["dark brown", "#463325"],
+		["brown", "#8D4F21"],
+		["auburn", "#7e543e"],
+		["black", "#3F4040"],
+		["blonde", "#F4F1A3"],
+		["blue", "#4685C5"],
+		["burgundy", "#5f3946"],
+		["chestnut", "#663622"],
+		["chocolate", "#6e4937"],
+		["copper", "#a16145"],
+		["ginger", "#da822d"],
+		["golden", "#ffdf31"],
+		["green", "#5FBA46"],
+		["grey", "#9e9fa4"],
+		["hazel", "#8d6f1f"],
+		["pink", "#D18CBC"],
+		["red", "#BB2027"],
+		["deep red", "#6D1318"],
+		["blue-violet", "#8790B7"],
+		["silver", "#cdc9c6"],
+		["light olive", "#d4c6bb"],
+		["dark", "#a46237"],
+		/* these are not actually FreeCities canon, but like to appear in custom descriptions */
+		["dark", "#463325"],
+		["brunette", "#8D4F21"]
+	];
+	
+	/* these are HTML color names supported by most browsers */
+	var HTMLstandardColors = ["aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred ","indigo ","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen"];
+	
+	var FCnames = new Map(FCname2HTMLarray);
+	hColor = hColor.toLowerCase(); /* normalization: lowercase color name */
+	var colorCode = FCnames.get(hColor); /* look up in FreeCities color names */
+	if (!colorCode) { /* not a FreeCities color name*/
+		if (HTMLstandardColors.includes(hColor) || hColor.match(/^#([0-9a-f]{3}){1,2}$/) !== null) {
+			colorCode = hColor; /* is a HTML color name or value, use it directly */
+		} else { 
+			/* 
+			is not even a HTML color name. hColor probably is a description.
+			look for anything resembling a valid color name within the description.
+			*/
+			var hColorNoSpaces = hColor.replace(/\s+/g, ''); /* remove all spaces from description */
+			var FCkeys = Array.from(FCnames.keys());
+			var colorCodes = [
+				FCnames.get(FCkeys.find(function (e){return hColor.startsWith(e);})),
+				HTMLstandardColors.find(function (e){return hColorNoSpaces.startsWith(e);}),
+				FCnames.get(FCkeys.find(function (e){return hColor.includes(e);})),
+				HTMLstandardColors.find(function (e){return hColorNoSpaces.includes(e);})
+			];
+			colorCode = colorCodes.find(function (e){return e;}); /* picks the first successful guess */
+		}
+	}
+	if (!colorCode) {
+		console.log("Art Color Tools JS: Unable to determine HTML compliant color code for hair color string '"+hColor+"'.");
+		colorCode = "fuchsia"; /* use fuchsia as error marker */
+	}
+	return colorCode;
+};
+
+window.clothing2artSuffix = function(v) {
+  if (v == "restrictive latex") { v = "latex"; } /* universal "special case": latex art is actually "restrictive latex" TODO: align name in vector source */
+  return v.replace(/^a[n]? /,"") /* remove "a" and "an" from the beginning*/
+          .replace(/ ?(outfit|clothing) ?/,"") /* remove "outfit" and "clothing" (redundant) */
+          .replace(/ and .+/,"") /* remove concatenated descriptions */
+          .replace(/\w\S*/g, 
+            function(txt){
+                return txt.charAt(0).toUpperCase() + 
+                       txt.substr(1).toLowerCase();
+            }
+          ) /* CamelCase by whitespace */
+          .replace(/\W/g,""); /* remove remaining whitespace */
+};
diff --git a/src/js/artColorToolsJS.tw b/src/art/artJS.tw
similarity index 53%
rename from src/js/artColorToolsJS.tw
rename to src/art/artJS.tw
index b2aab8762c8..a9df7d82269 100644
--- a/src/js/artColorToolsJS.tw
+++ b/src/art/artJS.tw
@@ -1,4 +1,118 @@
-:: Art Color Tools JS [script]
+:: Art JS [script]
+
+/*
+Displays assistant images. Currently passage-based.
+sizePlacement: Image size/center.
+	3: Large, right. Example: description.
+	2: Medium, right. Example: random events.
+*/
+window.AssistantArtRendered = function AssistantArtRendered(sizePlacement) {
+	const V = State.variables;
+	let fileName = "";
+
+	if (V.imageChoice === 0) {
+		switch (V.assistantAppearance) {
+			case "monstergirl":
+				fileName = "'resources/renders/assistant monstergirl.png'";;
+				break;
+			case "shemale":
+				fileName = "'resources/renders/assistant shemale.png'";
+				break;
+			case "amazon":
+				fileName = "'resources/renders/assistant amazon.png'";
+				break;
+			case "businesswoman":
+				fileName = "'resources/renders/assistant businesswoman.png'";
+				break;
+			case "goddess":
+				fileName = "'resources/renders/assistant goddess.png'";
+				break;
+			case "schoolgirl":
+				fileName = "'resources/renders/assistant schoolgirl.png'";
+				break;
+			default:
+				fileName = "'resources/renders/assistant default.png'";
+		}
+		if (sizePlacement === 3) {
+			fileName = `<img src=${fileName} style='float:right; border:3px hidden'/>`;
+		} else {
+			fileName = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'/>`;
+		}
+	}
+	return fileName;
+};
+
+window.ArtControlRendered = function ArtControlRendered(slave, sizePlacement) {
+	const V = State.variables;
+	let fileName = "";
+	let r = "";
+
+	if (slave.vagina > -1) {
+		if (slave.dick > 0) {
+			if (slave.balls > 0) {
+				fileName = "futanari";
+			} else {
+				fileName = "herm";
+			}
+		} else {
+			fileName = "female";
+		}
+	} else {
+		if (slave.balls > 0) {
+			fileName = "shemale";
+		} else {
+			fileName = "gelding";
+		}
+	}
+	if (slave.belly > 1500) {
+		fileName = `preg ${fileName}`;
+	}
+	if (slave.boobs < 400) {
+		fileName = `${fileName} small`;
+	} else if (slave.boobs < 800) {
+		fileName = `${fileName} big`;
+	} else if (slave.boobs < 6000) {
+		fileName = `${fileName} huge`;
+	} else {
+		fileName = `${fileName} hyper`;
+	}
+	if (slave.muscles > 30) {
+		fileName = `${fileName} muscle`;
+	} else {
+		fileName = `${fileName} soft`;
+	}
+	if (slave.fuckdoll > 0) {
+		fileName = `${fileName} rebellious`;
+	} else if (slave.devotion <= 20) {
+		if (slave.trust < -20) {
+			fileName = `${fileName} reluctant`;
+		} else {
+			fileName = `${fileName} rebellious`;
+		}
+	} else if (slave.fetish === "mindbroken") {
+		fileName = `${fileName} reluctant`;
+	} else if (slave.devotion <= 50 || slave.fetishKnown !== 1 || V.seeMainFetishes === 0 && sizePlacement < 2) {
+		fileName = `${fileName} obedient`;
+	} else {
+		if (slave.fetish === "none") {
+			fileName = `${fileName} obedient`;
+		} else {
+			fileName = `${fileName} ${slave.fetish}`;
+		}
+	}
+
+	fileName = `'resources/renders/${fileName}.png'`;
+	if (sizePlacement === 3) {
+		r = `<img src=${fileName} style='float:right; border:3px hidden'>`;
+	} else if (sizePlacement === 2) {
+		r = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'>`;
+	} else if (sizePlacement === 1) {
+		r = `<img src=${fileName} style='float:left; border:3px hidden' width='150' height='150'>`;
+	} else {
+		r = `<img src=${fileName} style='float:left; border:3px hidden' width='120' height='120'>`;
+	}
+	return r;
+};
 
 /* 
 This takes a textual hair colour description and tries to guess the appropriate HTML compliant color code.
@@ -77,3 +191,17 @@ window.extractHairColor = function(hColor) {
 	}
 	return colorCode;
 };
+
+window.clothing2artSuffix = function(v) {
+  if (v == "restrictive latex") { v = "latex"; } /* universal "special case": latex art is actually "restrictive latex" TODO: align name in vector source */
+  return v.replace(/^a[n]? /,"") /* remove "a" and "an" from the beginning*/
+          .replace(/ ?(outfit|clothing) ?/,"") /* remove "outfit" and "clothing" (redundant) */
+          .replace(/ and .+/,"") /* remove concatenated descriptions */
+          .replace(/\w\S*/g, 
+            function(txt){
+                return txt.charAt(0).toUpperCase() + 
+                       txt.substr(1).toLowerCase();
+            }
+          ) /* CamelCase by whitespace */
+          .replace(/\W/g,""); /* remove remaining whitespace */
+};
diff --git a/src/art/vector/Helper_Functions.tw b/src/art/vector/Helper_Functions.tw
deleted file mode 100644
index b19ee1383b5..00000000000
--- a/src/art/vector/Helper_Functions.tw
+++ /dev/null
@@ -1,15 +0,0 @@
-:: Art_Vector_Helper_Functions_ [script]
-
-window.clothing2artSuffix = function(v) {
-  if (v == "restrictive latex") { v = "latex"; } /* universal "special case": latex art is actually "restrictive latex" TODO: align name in vector source */
-  return v.replace(/^a[n]? /,"") /* remove "a" and "an" from the beginning*/
-          .replace(/ ?(outfit|clothing) ?/,"") /* remove "outfit" and "clothing" (redundant) */
-          .replace(/ and .+/,"") /* remove concatenated descriptions */
-          .replace(/\w\S*/g, 
-            function(txt){
-                return txt.charAt(0).toUpperCase() + 
-                       txt.substr(1).toLowerCase();
-            }
-          ) /* CamelCase by whitespace */
-          .replace(/\W/g,""); /* remove remaining whitespace */
-}
diff --git a/src/js/vectorRevampedArtControlJS.tw b/src/art/vector_revamp/vectorRevampedArtControlJS.tw
similarity index 100%
rename from src/js/vectorRevampedArtControlJS.tw
rename to src/art/vector_revamp/vectorRevampedArtControlJS.tw
diff --git a/src/js/artJS.tw b/src/js/artJS.tw
deleted file mode 100644
index 3405c98d0c1..00000000000
--- a/src/js/artJS.tw
+++ /dev/null
@@ -1,115 +0,0 @@
-:: Art JS [script]
-
-/*
-Displays assistant images. Currently passage-based.
-sizePlacement: Image size/center.
-	3: Large, right. Example: description.
-	2: Medium, right. Example: random events.
-*/
-window.AssistantArtRendered = function AssistantArtRendered(sizePlacement) {
-	const V = State.variables;
-	let fileName = "";
-
-	if (V.imageChoice === 0) {
-		switch (V.assistantAppearance) {
-			case "monstergirl":
-				fileName = "'resources/renders/assistant monstergirl.png'";;
-				break;
-			case "shemale":
-				fileName = "'resources/renders/assistant shemale.png'";
-				break;
-			case "amazon":
-				fileName = "'resources/renders/assistant amazon.png'";
-				break;
-			case "businesswoman":
-				fileName = "'resources/renders/assistant businesswoman.png'";
-				break;
-			case "goddess":
-				fileName = "'resources/renders/assistant goddess.png'";
-				break;
-			case "schoolgirl":
-				fileName = "'resources/renders/assistant schoolgirl.png'";
-				break;
-			default:
-				fileName = "'resources/renders/assistant default.png'";
-		}
-		if (sizePlacement === 3) {
-			fileName = `<img src=${fileName} style='float:right; border:3px hidden'/>`;
-		} else {
-			fileName = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'/>`;
-		}
-	}
-	return fileName;
-};
-
-window.ArtControlRendered = function ArtControlRendered(slave, sizePlacement) {
-	const V = State.variables;
-	let fileName = "";
-	let r = "";
-
-	if (slave.vagina > -1) {
-		if (slave.dick > 0) {
-			if (slave.balls > 0) {
-				fileName = "futanari";
-			} else {
-				fileName = "herm";
-			}
-		} else {
-			fileName = "female";
-		}
-	} else {
-		if (slave.balls > 0) {
-			fileName = "shemale";
-		} else {
-			fileName = "gelding";
-		}
-	}
-	if (slave.belly > 1500) {
-		fileName = `preg ${fileName}`;
-	}
-	if (slave.boobs < 400) {
-		fileName = `${fileName} small`;
-	} else if (slave.boobs < 800) {
-		fileName = `${fileName} big`;
-	} else if (slave.boobs < 6000) {
-		fileName = `${fileName} huge`;
-	} else {
-		fileName = `${fileName} hyper`;
-	}
-	if (slave.muscles > 30) {
-		fileName = `${fileName} muscle`;
-	} else {
-		fileName = `${fileName} soft`;
-	}
-	if (slave.fuckdoll > 0) {
-		fileName = `${fileName} rebellious`;
-	} else if (slave.devotion <= 20) {
-		if (slave.trust < -20) {
-			fileName = `${fileName} reluctant`;
-		} else {
-			fileName = `${fileName} rebellious`;
-		}
-	} else if (slave.fetish === "mindbroken") {
-		fileName = `${fileName} reluctant`;
-	} else if (slave.devotion <= 50 || slave.fetishKnown !== 1 || V.seeMainFetishes === 0 && sizePlacement < 2) {
-		fileName = `${fileName} obedient`;
-	} else {
-		if (slave.fetish === "none") {
-			fileName = `${fileName} obedient`;
-		} else {
-			fileName = `${fileName} ${slave.fetish}`;
-		}
-	}
-
-	fileName = `'resources/renders/${fileName}.png'`;
-	if (sizePlacement === 3) {
-		r = `<img src=${fileName} style='float:right; border:3px hidden'>`;
-	} else if (sizePlacement === 2) {
-		r = `<img src=${fileName} style='float:right; border:3px hidden' width='300' height='300'>`;
-	} else if (sizePlacement === 1) {
-		r = `<img src=${fileName} style='float:left; border:3px hidden' width='150' height='150'>`;
-	} else {
-		r = `<img src=${fileName} style='float:left; border:3px hidden' width='120' height='120'>`;
-	}
-	return r;
-};
-- 
GitLab