diff --git a/src/npc/descriptions/describeScars.js b/src/npc/descriptions/describeScars.js
index 99aa7caff5b5a3f3eaf5e27bc3d59adf14106a0e..ef75910d776895db2a2a989ca270af7ddd7b585d 100644
--- a/src/npc/descriptions/describeScars.js
+++ b/src/npc/descriptions/describeScars.js
@@ -5,7 +5,7 @@
  */
 App.Desc.scar = function(slave, surface) {
 	"use strict";
-	let r = ``;
+	let r = [];
 	const bellyAccessory = slave.bellyAccessory;
 	const {
 		him, his, He, His
@@ -16,28 +16,18 @@ App.Desc.scar = function(slave, surface) {
 			extraMarks = Object.keys(extraMarks);
 			let length = extraMarks.length;
 			if (length === 0) {
-				return r;
+				return "";
 			} else if (length === 1) {
-				r += `${He} also has a single unusual scar: `;
+				r.push(`${He} also has a single unusual scar:`);
 			} else {
-				r += `${He} also has several unusual scars: `;
+				r.push(`${He} also has several unusual scars:`);
 			}
-
-			// If L/R parts of this object match, they will be described in the same phrase. Length is used only to calculate punctuation, so we prepare to skip.
-			for (const bodyPart of extraMarks) {
-				if (bodyPart.startsWith("left ")) {
-					let right = "right " + bodyPart.replace("left ", "");
-					if (slave.scar[bodyPart] && slave.scar[right]) {
-						length--;
-					}
-				}
-			}
-			let counter = 0;
+			const scarPhrases = [];
 			for (const bodyPart of extraMarks) {
-				counter++;
+				const t = [];
 				surface = App.Desc.oppositeSides(bodyPart);
 				if (slave.scar[surface.center]) { // center defined, body part has no mirror.
-					r += `${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}`;
+					t.push(`${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}`);
 				} else { // Center not defined, body part has a mirror.
 					let left = App.Desc.expandScarString(slave, surface.left);
 					let right = App.Desc.expandScarString(slave, surface.right);
@@ -48,33 +38,30 @@ App.Desc.scar = function(slave, surface) {
 					} else if (left === right) {
 						// matching places and marks
 						// note that the slave.scar object won't have slave.scar["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match.
-						r += `${left} on both ${his} ${surface.both}`;
+						t.push(`${left} on both ${his} ${surface.both}`);
 					} else if (slave.scar[surface.left] && slave.scar[surface.right]) {
 						// matching places but different marks
-						r += `both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}`;
+						t.push(`both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}`);
 					} else if (slave.scar[surface.left]) {
 						// left
-						r += `${left} on ${his} ${surface.left}`;
+						t.push(`${left} on ${his} ${surface.left}`);
 					} else if (slave.scar[surface.right]) {
 						// right
-						r += `${right} on ${his} ${surface.right}`;
+						t.push(`${right} on ${his} ${surface.right}`);
 					}
 				}
-				if (counter === length) {
-					r += `. `;
-				} else if (counter === length - 1) {
-					r += `, and `;
-				} else if (counter < length) {
-					r += `, `;
-				}
+				scarPhrases.push(t.join(" "));
+			}
+			if (scarPhrases.length > 0) {
+				r.push(`${toSentence(scarPhrases)}.`);
 			}
 		} else if (surface) { /* describes a single scarred body part */
 			surface = App.Desc.oppositeSides(surface);
 			if (surface.center === "belly" && App.Data.misc.fakeBellies.includes(bellyAccessory) && slave.scar.hasOwnProperty("belly")) {
-				r += `${His} fake belly has the same scar, ${App.Desc.expandScarString(slave, surface.center)}, as ${his} real one. `;
+				r.push(`${His} fake belly has the same scar, ${App.Desc.expandScarString(slave, surface.center)}, as ${his} real one.`);
 			} else {
 				if (slave.scar[surface.center]) { // center defined, body part has no mirror.
-					r += `${He} has ${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}. `;
+					r.push(`${He} has ${App.Desc.expandScarString(slave, surface.center)} on ${his} ${surface.center}.`);
 				} else { // Center not defined, body part has a mirror.
 					let left = App.Desc.expandScarString(slave, surface.left);
 					let right = App.Desc.expandScarString(slave, surface.right);
@@ -83,38 +70,38 @@ App.Desc.scar = function(slave, surface) {
 					} else if (left === right) {
 						// matching places and marks
 						// note that the slave.scar object won't have slave.scar["upper armS"] with an S defined, just the left and right, so we just use the left since we know they match.
-						r += `${He} has ${left} on both ${his} ${surface.both}. `;
+						r.push(`${He} has ${left} on both ${his} ${surface.both}.`);
 					} else if (slave.scar[surface.left] && slave.scar[surface.right]) {
 						// matching places but different marks
-						r += `${He} has both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}. `;
+						r.push(`${He} has both ${left} on ${his} ${surface.left}, and ${right} scared into ${his} ${surface.right}.`);
 					} else if (slave.scar[surface.left]) {
 						// left
-						r += `${He} has ${left} on ${his} ${surface.left}. `;
+						r.push(`${He} has ${left} on ${his} ${surface.left}.`);
 					} else if (right) {
 						// right
-						r += `${He} has ${right} on ${his} ${surface.right}. `;
+						r.push(`${He} has ${right} on ${his} ${surface.right}.`);
 					}
 				}
 			}
 		} else { /* describes all scarred body parts */
 			for (let [key, value] of Object.entries(slave.scar)) {
-				if (r === ``) {
-					r += `${He} has `;
+				if (r.length === 0) {
+					r.push(`${He} has`);
 				}
 				if (key === "belly" && App.Data.misc.fakeBellies.includes(bellyAccessory) && slave.scar.hasOwnProperty("belly")) {
-					r += `${value} scared on both ${his} real belly and ${his} fake one, `;
+					r.push(`${value} scared on both ${his} real belly and ${his} fake one,`);
 				} else {
-					r += `${value} on ${his} ${key}, `;
+					r.push(`${value} on ${his} ${key},`);
 				}
 			}
-			if (r !== ``) {
-				r += `marking ${him} as yours. `;
+			if (r.length !== 0) {
+				r.push(`marking ${him} as yours.`);
 			} else {
-				r += `${His} body is unmarked by scars. `;
+				r.push(`${His} body is unmarked by scars.`);
 			}
 		}
 	}
-	return r;
+	return r.join(" ");
 };
 
 /**
@@ -123,81 +110,80 @@ App.Desc.scar = function(slave, surface) {
  * @returns {string} Slave's scar. Slave is the slave in question, but call the body part without modifiers. Rather than using "left breast" and "right breast" just use "breast". The function will then describe any scars on the breasts, if present, in natural language.
  */
 App.Desc.expandScarString = function(slave, surface) { // scars can sometimes be an int. This function generates a reasonable description. It can later be expanded to apply to different body parts, or include features of the slave such as skin tone or weight
-	let r = "";
 	if (!slave.scar[surface]) {
-		return r;
+		return "";
 	}
+	let r;
 	const {he, his} = getPronouns(slave);
 	const bodypart = Object.keys(slave.scar[surface]);
+	const scarPhrases = [];
 	for (const kind of bodypart) {
 		let scar = slave.scar[surface][kind];
+		r = [];
 		if (scar === 0) {
 			continue;
 		}
-		if (r !== "") {
-			r += ", ";
-		}
 		switch (kind) {
 			case "generic":
-				r += "a generic scar";
+				r.push("a generic scar");
 				break;
 			case "whip":
 				if (["back"].includes(surface)) {
-					r += "a ";
+					r.push("a");
 					if (scar > 2) {
-						r += "deeply scored ";
+						r.push("deeply scored");
 					}
 					if (scar > 1) {
-						r += "network of welts like a map of hell";
+						r.push("network of welts like a map of hell");
 					} else {
-						r += "record of being beaten";
+						r.push("record of being beaten");
 					}
 				} else if (["left breast", "right breast", "left buttock", "right buttock"].includes(surface)) {
 					if (scar > 2) {
-						r += "thick ";
+						r.push("thick");
 					} else {
-						r += "thin ";
+						r.push("thin");
 					}
-					r += "raised lines from a whip tracing the curves";
+					r.push("raised lines from a whip tracing the curves");
 				} else if (["left upper arm", "right upper arm"].includes(surface)) {
-					r += `rough edges where a whip abused ${his} skin`;
+					r.push(`rough edges where a whip abused ${his} skin`);
 				} else {
 					if (scar > 2) {
-						r += "frightening ";
+						r.push("frightening");
 					} else if (scar > 1) {
-						r += "serious ";
+						r.push("serious");
 					}
-					r += "whip scars";
+					r.push("whip scars");
 				}
 				break;
 			case "chain":
 				if (["left wrist", "right wrist", "left ankle", "right ankle"].includes(surface)) {
 					if (scar > 1) {
-						r += "scars from heavy manacles";
+						r.push("scars from heavy manacles");
 					} else {
-						r += "scars from manacles";
+						r.push("scars from manacles");
 					}
 				} else {
 					if (scar > 1) {
-						r += "scars from heavy chains";
+						r.push("scars from heavy chains");
 					} else {
-						r += "scars from chains";
+						r.push("scars from chains");
 					}
 				}
 				break;
 			case "burn":
 				if (scar > 2) {
-					r += "frightening ";
+					r.push("frightening");
 				} else if (scar > 1) {
-					r += "serious ";
+					r.push("serious");
 				}
-				r += "burn scars";
+				r.push("burn scars");
 				break;
 			case "menacing":
-				r += "a menacing scar";
+				r.push("a menacing scar");
 				break;
 			case "exotic":
-				r += "an exotic scar";
+				r.push("an exotic scar");
 				break;
 			case "surgical":
 				if (surface === "left breast" || surface === "right breast") {
@@ -205,47 +191,47 @@ App.Desc.expandScarString = function(slave, surface) { // scars can sometimes be
 				} else if (surface === "left buttock" || surface === "right buttock") {
 					implantScars(slave.buttImplant === 0, scar);
 				} else if (surface === "belly") {
-					r += "scars from ";
+					r.push("scars from");
 					if (scar > 1) {
-						r += "a crazy network of scars, as though a hack had tried internal surgery";
+						r.push("a crazy network of scars, as though a hack had tried internal surgery");
 					} else {
-						r += "some faint scarring as though from internal surgery";
+						r.push("some faint scarring as though from internal surgery");
 					}
 				} else {
-					r += "a ";
+					r.push("a");
 					if (scar > 1) {
-						r += "pronounced ";
+						r.push("pronounced");
 					} else {
-						r += "faint ";
+						r.push("faint");
 					}
-					r += "surgical scar";
+					r.push("surgical scar");
 				}
 				break;
 			case "c-section":
-				r += "an ";
+				r.push("an");
 				if (scar > 1) {
-					r += "especially ";
+					r.push("especially");
 				}
-				r += "unsightly c-section scar";
+				r.push("unsightly c-section scar");
 				break;
 			case "cutting":
 				if (["left wrist", "right wrist", "neck"].includes(surface)) {
-					r += `some scars as though ${he} attempted self harm`;
+					r.push(`some scars as though ${he} attempted self harm`);
 				} else {
-					r += "some cuts as though from a razor";
+					r.push("some cuts as though from a razor");
 				}
 				break;
 			default:
 				if (scar > 2) {
-					r += "serious ";
+					r.push(`serious ${kind}`);
 				} else if (scar) {
-					r += kind;
+					r.push(kind);
 				}
 				break;
 		}
+		scarPhrases.push(r.join(" "));
 	}
-	r = r.replace(/,(?=[^,]*$)/, ' and'); /* replace the last comma with the word "and" so we can use this in a sentence.*/
-	return r;
+	return toSentence(scarPhrases);
 
 	/**
 	 * @param {boolean} removed if true, scars come from removal, otherwise from implantation
@@ -253,25 +239,25 @@ App.Desc.expandScarString = function(slave, surface) { // scars can sometimes be
 	 */
 	function implantScars(removed, scar) {
 		if (removed) {
-			r += "scars from ";
+			r.push("scars from");
 			if (scar > 3) {
-				r += "horribly botched ";
+				r.push("horribly botched");
 			} else if (scar > 2) {
-				r += "sloppily done ";
+				r.push("sloppily done");
 			} else if (scar > 1) {
-				r += "carelessly done ";
+				r.push("carelessly done");
 			}
-			r += "surgery to remove implants";
+			r.push("surgery to remove implants");
 		} else {
-			r += "scars from ";
+			r.push("scars from");
 			if (scar > 3) {
-				r += "horribly botched ";
+				r.push("horribly botched");
 			} else if (scar > 2) {
-				r += "sloppily inserted ";
+				r.push("sloppily inserted");
 			} else if (scar > 1) {
-				r += "carelessly inserted ";
+				r.push("carelessly inserted");
 			}
-			r += "implants";
+			r.push("implants");
 		}
 	}
 };