diff --git a/src/events/eventUtils.js b/src/events/eventUtils.js
index 2faec70e59e1d5dffdb3af5f7e5680ed1aa4fc03..e6fbce5ebaebbfce93cc5df59caba4665b7c0551 100644
--- a/src/events/eventUtils.js
+++ b/src/events/eventUtils.js
@@ -1,62 +1,83 @@
-/** 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;
-	}
+App.Events.drawEventArt = (function() {
+	const validSingleOutfits = App.Data.misc.niceClothes.map(c => c.value).concat(App.Data.misc.harshClothes.map(c => c.value));
 
-	// ensure that slaves is an array
-	if (!Array.isArray(slaves)) {
-		slaves = [slaves];
-	}
+	/** 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|App.Entity.SlaveState[]} slaves - one or several slaves to draw art for
+	 * @param {string|string[]} [clothesMode] - if the slaves' clothing should be overridden, what should they be wearing?
+	 */
+	function draw(node, slaves, clothesMode) {
+		// do nothing if the player doesn't want images
+		if (!V.seeImages) {
+			return;
+		}
 
-	// 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";
+		// ensure that slaves is an array
+		if (!Array.isArray(slaves)) {
+			slaves = [slaves];
 		}
-	}
 
-	// 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) {
+		// if we were asked to change the slave's clothing, do it now
+		let originalClothes = [];
+		if (clothesMode) {
+			// if clothesMode is just a single string, apply the same clothes to all the slaves
+			if (!Array.isArray(clothesMode)) {
+				clothesMode = new Array(slaves.length).fill(clothesMode);
+			}
+
+			// if clothesMode is not the right length now, throw.  it's all or nothing.
+			if (clothesMode.length !== slaves.length) {
+				throw "Incorrect number of outfits specified for slaves in event art";
+			}
+
+			// clothes have been specified - copy the slaves and change their clothing (a bit slow, but means we don't need housekeeping to change them back)
+			slaves.forEach((s, i) => {
+				originalClothes[i] = s.clothes;
+				// 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 (validSingleOutfits.includes(clothesMode[i])) {
+					s.clothes = clothesMode[i];
+				} else if (!clothesMode[i]) {
+					// no change of outfit, leave them dressed as they were
+				} else {
+					// unrecognized outfit - leave them dressed as they were, but error
+					console.error(`Unrecognized clothes mode for event art: ${clothesMode[i]}`);
+				}
+			});
+		}
+
+		// 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", "medImg");
-			refDiv.appendChild(App.Art.SlaveArtElement(slave, 2, 0));
-			colDiv.appendChild(refDiv);
+			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);
 		}
-		artSpan.appendChild(colDiv);
-	}
-	node.appendChild(artSpan);
+		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);
+		// change clothing back, if necessary
+		if (originalClothes.length > 0) {
+			slaves.forEach((s, i) => s.clothes = originalClothes[i]);
+		}
 	}
-};
+
+	return draw;
+})();
 
 /** intelligently adds spaces to an array of mixed strings and DOM nodes, merging consecutive strings in the process
  * @param {Array<string|HTMLElement|DocumentFragment>} sentences