diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt
index b1f2e1887b05c950e6a98e50a6208f783395dffd..5f11b45370b0ec796f4801a526156153424a359e 100644
--- a/devNotes/twine JS.txt	
+++ b/devNotes/twine JS.txt	
@@ -23157,4 +23157,120 @@ window.getHighestPorn = function(slave) {
 	}
 	
 	return max;
-}
\ No newline at end of file
+}
+
+/*:: 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;
+};
diff --git a/src/art/artWidgets.tw b/src/art/artWidgets.tw
index 27a152a7f6aef4cd2ca6ddfbef4c65e095b09971..acddbd12af62f046ebb8b61ad0df99dd4d1f37c2 100644
--- a/src/art/artWidgets.tw
+++ b/src/art/artWidgets.tw
@@ -1,42 +1,5 @@
 :: art widgets [nobr widget]
 
-/%
-Call as <<AssistantArt>>
-Displays assistant images. Currently passage-based.
-$args[0]: Image size/center.
-	3: Large, right. Example: description.
-	2: Medium, right. Example: random events.
-%/
-<<widget "AssistantArt">>
-
-<<if $imageChoice == 0>> /* RENDERED IMAGES BY SHOKUSHU */
-
-<<switch $assistantAppearance>>
-<<case "monstergirl">>
-	<<set _fileName = "'resources/renders/assistant monstergirl.png' ">>
-<<case "shemale">>
-	<<set _fileName = "'resources/renders/assistant shemale.png' ">>
-<<case "amazon">>
-	<<set _fileName = "'resources/renders/assistant amazon.png' ">>
-<<case "businesswoman">>
-	<<set _fileName = "'resources/renders/assistant businesswoman.png' ">>
-<<case "goddess">>
-	<<set _fileName = "'resources/renders/assistant goddess.png' ">>
-<<case "schoolgirl">>
-	<<set _fileName = "'resources/renders/assistant schoolgirl.png' ">>
-<<default>>
-	<<set _fileName = "'resources/renders/assistant default.png' ">>
-<</switch>>
-<<if $args[1] == 3>>
-	<<print "<img src=" + _fileName + "style='float:right; border:3px hidden'/>">>
-<<else>>
-	<<print "<img src=" + _fileName + "style='float:right; border:3px hidden' width='300' height='300'/>">>
-<</if>>
-
-<</if>> /* CLOSES IMAGE CHOICE */
-
-<</widget>>
-
 /%
 Call as <<SlaveArt>>
 Displays slave images. Currently passage-based.
@@ -598,70 +561,7 @@ vector art added later is drawn over previously added art
 	<<include Art_Vector_Revamped_Control_>> 
 <<else>> /* RENDERED IMAGES BY SHOKUSHU */
 
-<<if $args[0].vagina > -1>>
-	<<if $args[0].dick > 0>>
-		<<if $args[0].balls > 0>>
-			<<set _fileName = "futanari">>
-		<<else>>
-			<<set _fileName = "herm">>
-		<</if>>
-	<<else>>
-		<<set _fileName = "female">>
-	<</if>>
-<<else>>
-	<<if $args[0].balls > 0>>
-		<<set _fileName = "shemale">>
-	<<else>>
-		<<set _fileName = "gelding">>
-	<</if>>
-<</if>>
-<<if $args[0].belly > 1500>>
-	<<set _fileName = "preg " + _fileName>>
-<</if>>
-<<if $args[0].boobs < 400>>
-	<<set _fileName = _fileName + " small">>
-<<elseif $args[0].boobs < 800>>
-	<<set _fileName = _fileName + " big">>
-<<elseif $args[0].boobs < 6000>>
-	<<set _fileName = _fileName + " huge">>
-<<else>>
-	<<set _fileName = _fileName + " hyper">>
-<</if>>
-<<if $args[0].muscles > 30>>
-	<<set _fileName = _fileName + " muscle">>
-<<else>>
-	<<set _fileName = _fileName + " soft">>
-<</if>>
-<<if $args[0].fuckdoll > 0>>
-	<<set _fileName = _fileName + " rebellious">>
-<<elseif $args[0].devotion <= 20>>
-	<<if $args[0].trust < -20>>
-		<<set _fileName = _fileName + " reluctant">>
-	<<else>>
-		<<set _fileName = _fileName + " rebellious">>
-	<</if>>
-<<elseif $args[0].fetish == "mindbroken">>
-	<<set _fileName = _fileName + " reluctant">>
-<<elseif $args[0].devotion <= 50 || $args[0].fetishKnown != 1 || ($seeMainFetishes == 0 && $args[1] < 2)>>
-	<<set _fileName = _fileName + " obedient">>
-<<else>>
-	<<if $args[0].fetish == "none">>
-		<<set _fileName = _fileName + " obedient">>
-	<<else>>
-		<<set _fileName = _fileName + " " + $args[0].fetish>>
-	<</if>>
-<</if>>
-
-<<set _fileName = "'resources/renders/" + _fileName + ".png' ">>
-<<if $args[1] == 3>>
-	<<print "<img src=" + _fileName + "style='float:right; border:3px hidden'/>">>
-<<elseif $args[1] == 2>>
-	<<print "<img src=" + _fileName + "style='float:right; border:3px hidden' width='300' height='300'/>">>
-<<elseif $args[1] == 1>>
-	<<print "<img src=" + _fileName + "style='float:left; border:3px hidden' width='150' height='150'/>">>
-<<else>>
-	<<print "<img src=" + _fileName + "style='float:left; border:3px hidden' width='120' height='120'/>">>
-<</if>>
+	<<= ArtControlRendered($args[0], $args[1])>>
 
 <</if>> /* CLOSES IMAGE CHOICE */
 
diff --git a/src/js/artJS.tw b/src/js/artJS.tw
new file mode 100644
index 0000000000000000000000000000000000000000..3405c98d0c18b2451b836d861e590780b38c988a
--- /dev/null
+++ b/src/js/artJS.tw
@@ -0,0 +1,115 @@
+:: 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;
+};
diff --git a/src/pregmod/assistantAppearancePackTwo.tw b/src/pregmod/assistantAppearancePackTwo.tw
index a8cb264ecbdf988cae91c9849f151673e55cf16e..7be9a3cb85ad394aa2f420006bc2072d2d44ef93 100644
--- a/src/pregmod/assistantAppearancePackTwo.tw
+++ b/src/pregmod/assistantAppearancePackTwo.tw
@@ -1,6 +1,6 @@
 :: Assistant Appearance Pack Two [nobr]
 
-<<if $seeImages == 1>><<AssistantArt 3>><</if>>
+<<if $seeImages == 1>><<= AssistantArtRendered(3)>><</if>>
 
 "Cool! New appearances to play around with!" Your assistant happily chimes. "Let's see what's inside! This looks heavenly..." She hunches forward as a large pair of white feathered wings extend from her upper back. She takes several experimental flaps before taking to the sky. "I feel positively radiant! Maybe a smaller version will be more to your liking?" She loses both height and wingspan until she stands roughly equivalent to <<= heightToEitherUnit(120)>>. She flutters around cutely. "This is neat, I'm like cupid. Want me to hook you up with anyone?" She winks as her wings become bat-like and a pair of cute little nubs appears on her head. "Or maybe you'd just like to play with me instead." The impish figure flirts, before landing and blossoming into a stunning woman. "You know a succubus can take her lover's ideal form." She runs her hands down her sides and to her crotch. <<if $seeDicks != 0>>She begins rubbing her clit as it steadily grows into a meaty cock. "Or an incubus, for the ladies." She returns to her previous form. <</if>>"Says here it comes with 'bonus novice witch' too. Neat. What's this though? It looks like an appeara"
 
diff --git a/src/uncategorized/RESS.tw b/src/uncategorized/RESS.tw
index 883921dd3a77cd2ca564f066914aec58acd23b07..53383d3a98827193becba08f9e6d1dc7c8af2c2f 100644
--- a/src/uncategorized/RESS.tw
+++ b/src/uncategorized/RESS.tw
@@ -2526,7 +2526,7 @@ running her tongue over her<<if $activeSlave.lips > 40>> whorish<<elseif $active
 
 <<case "PA flirting">>
 
-<<if $seeImages == 1>><<AssistantArt 2>><</if>>
+<<if $seeImages == 1>><<= AssistantArtRendered(2)>><</if>>
 
 Partway through <<EventNameLink $activeSlave>>'s weekly inspection, you have to leave for a moment to deal with a minor matter. Inspecting such a devoted slave is a pleasure, but you tear yourself away. Such sacrifices must be made.
 <br><br>
diff --git a/src/uncategorized/assistantEvents.tw b/src/uncategorized/assistantEvents.tw
index 4440b557e226b63493eb0515e90ebe5c7e180b41..4b6873329a55c26975e291aa37a2523c9d05cabd 100644
--- a/src/uncategorized/assistantEvents.tw
+++ b/src/uncategorized/assistantEvents.tw
@@ -4,7 +4,7 @@
 
 <<set $nextButton = "Continue", $nextLink = "Random Nonindividual Event">>
 
-<<if $seeImages == 1>><<AssistantArt 3>><</if>>
+<<if $seeImages == 1>><<= AssistantArtRendered(3)>><</if>>
 
 <<switch $Event>>
 <<case "assistant">>
diff --git a/src/uncategorized/personalAssistantOptions.tw b/src/uncategorized/personalAssistantOptions.tw
index 51d1502d6b984a3e31536c5716b1a62e58637aa6..6c64aecee43f062b2ed125f48027ba0ef7ce2268 100644
--- a/src/uncategorized/personalAssistantOptions.tw
+++ b/src/uncategorized/personalAssistantOptions.tw
@@ -5,7 +5,7 @@
 
 <<if $marketAssistantLimit>><<set $marketAssistantLimit to Math.clamp($marketAssistantLimit, 10000, 10000000)>><</if>>
 
-<<if $seeImages == 1>><<AssistantArt 3>><</if>>
+<<if $seeImages == 1>><<= AssistantArtRendered(3)>><</if>>
 
 Seated at your desk, you glance at the visual representation of $assistantName, down in one corner of your desk's glass top.