From 464302d2d785c13e5a193f35ff3cc74eae67e46e Mon Sep 17 00:00:00 2001
From: Pregmodder <pregmodder@gmail.com>
Date: Sat, 14 Jul 2018 01:00:24 -0400
Subject: [PATCH] resync

---
 devNotes/twine JS.txt         | 474 +++++++++++++++++++++++-----------
 src/js/slaveSummaryWidgets.tw |   4 +-
 2 files changed, 320 insertions(+), 158 deletions(-)

diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt
index b5373e2c63e..5aa23c45c4c 100644
--- a/devNotes/twine JS.txt	
+++ b/devNotes/twine JS.txt	
@@ -36,9 +36,7 @@ if (typeof interpolate == "undefined") {
 	};
 	window.interpolate = interpolate;
 }
-config.history.maxStates = 1;
 
-config.saves.autosave = "autosave";
 window.isFullyPotent = function(slave) {
 	if (!slave) {
 		return null;
@@ -3359,6 +3357,76 @@ window.getSlaveTrustClass = function (slave) {
 	}
 };
 
+//takes an integer e.g. $activeSlave.hLength, returns a string in the format 10 inches
+window.cmToInchString = function(s) {
+	return Math.round(s/2.54) + (Math.round(s/2.54) === 1?" inch":" inches");
+};
+
+//takes an integer e.g. $activeSlave.height, returns a string in the format 6'5"
+window.cmToFootInchString = function(s) {
+	if (Math.round(s/2.54) < 12)
+		return cmToInchString(s);
+	return Math.trunc(Math.round(s/2.54)/12) + `'` + Math.round(s/2.54)%12 + `"`;
+};
+
+//takes a dick value e.g. $activeSlave.dick, returns a string in the format 6 inches
+window.dickToInchString = function(s) {
+	return cmToInchString(dickToCM(s));
+};
+
+//takes a dick value e.g. $activeSlave.dick, returns an int of the dick length in cm
+window.dickToCM = function(s) {
+	return (s<9?s*5:(s===9?50:s*6));
+};
+
+//takes a ball value e.g. $activeSlave.balls, returns a string in the format 3 inches
+window.ballsToInchString = function(s) {
+	return cmToInchString(ballsToCM(s));
+};
+
+//takes a ball value e.g. $activeSlave.balls, returns an int of the ball size in cm
+window.ballsToCM = function(s) {
+	if (s < 2)
+		return 0;
+	return (s<10?(s-1)*2:s*2);
+};
+
+//takes a dick value e.g. $activeSlave.dick, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm`
+window.dickToEitherUnit = function(s) {
+	if (State.variables.showInches === 1)
+		return dickToCM(s) + "cm (" + dickToInchString(s) + ")";
+	if (State.variables.showInches === 2)
+		return dickToInchString(s);
+	return dickToCM(s) + "cm";
+};
+
+//takes a ball value e.g. $activeSlave.balls, returns a string in the format of either `20cm (8 inches)`, `8 inches`, or `20cm`
+window.ballsToEitherUnit = function(s) {
+	if (State.variables.showInches === 1)
+		return ballsToCM(s) + "cm (" + ballsToInchString(s) + ")";
+	if (State.variables.showInches === 2)
+		return ballsToInchString(s);
+	return ballsToCM(s) + "cm";
+};
+
+//takes an int in centimetres e.g. $activeSlave.height, returns a string in the format of either `200cm (6'7")`, `6'7"`, or `200cm`
+window.heightToEitherUnit = function(s) {
+	if (State.variables.showInches === 1)
+		return s + "cm (" + cmToFootInchString(s) + ")";
+	if (State.variables.showInches === 2)
+		return cmToFootInchString(s);
+	return s + "cm";
+};
+
+//takes an int in centimetres e.g. $activeSlave.hLength, returns a string in the format of either `30cm (12 inches)`, `12 inches`, or `30cm`
+window.lengthToEitherUnit = function(s) {
+	if (State.variables.showInches === 1)
+		return s + "cm (" + cmToInchString(s) + ")";
+	if (State.variables.showInches === 2)
+		return cmToInchString(s);
+	return s + "cm";
+};
+
 /*:: Span Macro JS [script]*/
 
 /*
@@ -7138,6 +7206,61 @@ window.SlaveTitle = function SlaveTitle(slave) {
 	return r;
 };
 
+window.SlaveSort = function SlaveSort(slaves, main=false) {
+	const V = State.variables;
+	if (main) {
+		switch (V.sortSlavesBy) {
+		case "name":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.slaveName < b.slaveName ? -1 : 1);
+			else
+				slaves = slaves.sort((a, b) => a.slaveName > b.slaveName ? -1 : 1);
+			break;
+		case "assignment":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.assignment < b.assignment ? -1 : 1);
+			else
+				slaves = slaves.sort((a, b) => a.assignment > b.assignment ? -1 : 1);
+			break;
+		case "seniority":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => b.weekAcquired - a.weekAcquired);
+			else
+				slaves = slaves.sort((a, b) => a.weekAcquired - b.weekAcquired);
+			break;
+		case "actualAge":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.actualAge - b.actualAge);
+			else
+				slaves = slaves.sort((a, b) => b.actualAge - a.actualAge);
+			break;
+		case "visualAge":
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.visualAge - b.visualAge);
+			else
+				slaves = slaves.sort((a, b) => b.visualAge - a.visualAge);
+			break;
+		case "physicalAge":
+			if (V.sortSlavesOrder == "physicalAge")
+				slaves = slaves.sort((a, b) => a.physicalAge - b.physicalAge);
+			else
+				slaves = slaves.sort((a, b) => b.physicalAge - a.physicalAge);
+			break;
+		default:
+			if (V.sortSlavesOrder == "ascending")
+				slaves = slaves.sort((a, b) => a.devotion - b.devotion);
+			else
+				slaves = slaves.sort((a, b) => b.devotion - a.devotion);
+			break;
+		}
+		V.slaveIndices = slaves2indices();
+	} else {
+		V.slaveIndices = slaves2indices();
+		filterInPlace(slaves, s => V.slaveIndices[s] !== undefined);
+		slaves.sort((a, b) => V.slaveIndices[a] - V.slaveIndices[b]);
+	}
+};
+
 /*:: Summary Widgets JS [script]*/
 
 window.SlaveStatClamp = function SlaveStatClamp(slave) {
@@ -12067,7 +12190,7 @@ window.DefaultRules = (function() {
 						V.cash -= V.modCost*Math.trunc((rule.hLength-slave.hLength)/10);
 						r += `<br>${slave.slaveName} has been given extensions; her hair `;
 					}
-				r += `is now ${rule.hLength} cm long.`;
+				r += `is now ${lengthToEitherUnit(rule.hLength)} long.`;
 				slave.hLength = rule.hLength;
 				}
 			}
@@ -16958,28 +17081,24 @@ window.SlaveSummaryUncached = (function(){
 		}
 		if (V.abbreviateMental === 1) {
 			r += `<span class="lightgreen">`;
-			let _relationshipHandled = 0;
 			if (V.familyTesting === 1)
 				short_extended_family(slave);
 			else
 				short_legacy_family(slave);
 			r += `</span>`;
-			_relationshipHandled = 0;
 			short_rival(slave);
 		} else if (V.abbreviateMental === 2) {
-			let _relationshipHandled = 0;
 			if (V.familyTesting === 1)
 				long_extended_family(slave);
 			else
 				long_legacy_family(slave);
-			_relationshipHandled = 0;
 			long_rival(slave);
 		}
 		if (slave.fuckdoll === 0) {
 			if (V.abbreviateClothes === 2) {
 				r += `&nbsp;&nbsp;&nbsp;&nbsp;`;
 				if (slave.choosesOwnClothes === 1)
-					r += `Dressing herself.`;
+					r += `Dressing herself. `;
 				long_clothes(slave);
 				long_collar(slave);
 				long_belly(slave);
@@ -17009,14 +17128,15 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.devotion < -20) {
 			r += `<span class="mediumorchid">Res${V.summaryStats ? `[${slave.devotion}]` : ''}</span>`;
 		} else if (slave.devotion <= 20) {
-			r += `<span class="yellow">Ambiv${V.summaryStats ? `[${slave.devotion$}]` : ''}</span>`;
+			r += `<span class="yellow">Ambiv${V.summaryStats ? `[${slave.devotion}]` : ''}</span>`;
 		} else if (slave.devotion <= 50) {
-			r += `<span class="hotpink">Accept${V.summaryStats ? `[${slave.devotion$}]` : ''}</span>`;
+			r += `<span class="hotpink">Accept${V.summaryStats ? `[${slave.devotion}]` : ''}</span>`;
 		} else if (slave.devotion <= 95) {
-			r += `<span class="deeppink">Devo${V.summaryStats ? `[${slave.devotion$}]` : ''}</span>`;
+			r += `<span class="deeppink">Devo${V.summaryStats ? `[${slave.devotion}]` : ''}</span>`;
 		} else {
-			r += `<span class="magenta">Wor${V.summaryStats ? `[${slave.devotion$}]` : ''}</span>`;
+			r += `<span class="magenta">Wor${V.summaryStats ? `[${slave.devotion}]` : ''}</span>`;
 		}
+		r += " ";
 		if (slave.fetish === "mindbroken") {
 			return;
 		} else if (slave.trust < -95) {
@@ -17046,6 +17166,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<span class="seagreen">VTrust ${V.summaryStats ? `[${slave.trust}]` : ''}</span>`;
 			}
 		}
+		r += " ";
 	}
 	
 	function long_devotion(slave) {
@@ -17111,6 +17232,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>LS:Spa</strong>`;
 				break;
 		}
+		r += " ";
 		if (canTalk(slave)) {
 			switch (slave.speechRules) {
 				case "permissive":
@@ -17126,6 +17248,7 @@ window.SlaveSummaryUncached = (function(){
 					r += `<strong>SpR:R</strong>`;
 					break;
 			}
+			r += " ";
 		}
 		switch (slave.relationshipRules) {
 			case "permissive":
@@ -17138,6 +17261,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>ReR:R</strong>`;
 				break;
 		}
+		r += " ";
 		switch (slave.standardPunishment) {
 			case "confinement":
 				r += `<strong>Pun:Conf</strong>`;
@@ -17152,6 +17276,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>Pun:Situ</strong>`;
 				break;
 		}
+		r += " ";
 		switch (slave.standardReward) {
 			case "relaxation":
 				r += `<strong>Rew:Relx</strong>`;
@@ -17166,6 +17291,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>Rew:Situ</strong>`;
 				break;
 		}
+		r += " ";
 		switch (slave.releaseRules) {
 			case "permissive":
 				r += `<strong>MaR:P</strong>`;
@@ -17180,6 +17306,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>MaR:R</strong>`;
 				break;
 		}
+		r += " ";
 	}
 	
 	function long_rules(slave) {
@@ -17215,7 +17342,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong><span class="red">W++${V.summaryStats? `[${slave.weight}]` : ''}</span></strong>`;
 			}
 		} else if (slave.weight <= 130) {
-			if (slave.hips >= 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
 				r += `<strong>W+++${V.summaryStats? `[${slave.weight}]` : ''}</strong>`;
 			} else {
 				r += `<strong><span class="red">W+++${V.summaryStats? `[${slave.weight}]` : ''}</span></strong>`;
@@ -17239,6 +17366,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong><span class="red">W++++++${V.summaryStats? `[${slave.weight}]` : ''}</span></strong>`;
 			}
 		}
+		r += " ";
 	}
 	
 	function long_weight(slave) {
@@ -17263,7 +17391,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<span class="red">Overweight${V.summaryStats ? `[${slave.weight}]`: ''}.</span>`;
 			}
 		} else if (slave.weight <= 130) {
-			if (slave.hips >= 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
 				r += `Pleasantly soft and shapely${V.summaryStats? `[${slave.weight}]`: ''}.`;
 			} else {
 				r += `<span class="red">Fat${V.summaryStats ? `[${slave.weight}]`: ''}.</span>`;
@@ -17325,7 +17453,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>Di:F+</strong>`;
 				break;
 		}
-		r += `</span>`;
+		r += `</span> `;
 		r += `<span class="cyan">`;
 		if (slave.dietCum === 2) {
 			r += `<strong>Cum++</strong>`;
@@ -17338,7 +17466,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if ((slave.dietMilk === 2)) {
 			r += `<strong>Milk++</strong>`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function long_diet(slave) {
@@ -17398,6 +17526,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.health > 20) {
 			r += `<strong><span class="green">H${V.summaryStats? `[${slave.health}]` : ''}</span></strong>`;
 		}
+		r += " ";
 	}
 	
 	function long_health(slave) {
@@ -17522,14 +17651,14 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong>Dr:groStim</strong>`;
 				break;
 		}
-		r += `</span>`;
+		r += `</span> `;
 		r += `<span class="lightgreen">`;
 		if (slave.curatives === 2) {
 			r += `<strong>Cura</strong>`;
 		} else if (slave.curatives === 1) {
 			r += `<strong>Prev</strong>`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 		if (slave.aphrodisiacs !== 0) {
 			r += `<span class="lightblue">`;
 			if (slave.aphrodisiacs === 1) {
@@ -17539,7 +17668,7 @@ window.SlaveSummaryUncached = (function(){
 			} else {
 				r += `<strong>Anaph</strong>`;
 			}
-			r += `</span>`;
+			r += `</span> `;
 		}
 		if (slave.addict !== 0) {
 			r += `<span class="cyan">Add</span>`;
@@ -17554,7 +17683,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.hormones < 0) {
 			r += `<strong>Ho:M</strong>`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 		r += `<span class="mediumseagreen">`;
 		if ((slave.bellyImplant > -1)) {
 			r += `<strong>Belly Imp</strong>`;
@@ -17577,7 +17706,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.pregKnown === 1) {
 			r += `<strong>${slave.pregWeek} wks preg</strong>`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 		if (slave.induce === 1) {
 			r += `<span class="orange"><strong>Early Labor</strong></span>`;
 		}
@@ -17597,7 +17726,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.bellyFluid > 0) {
 			r += `<strong>${slave.bellyFluid}ccs ${slave.inflationType}</strong>`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function long_drugs(slave) {
@@ -17655,7 +17784,7 @@ window.SlaveSummaryUncached = (function(){
 			if (slave.pregType < 2 || slave.broodmother > 0) {
 				r += `${slave.pregWeek} weeks pregnant.`;
 			} else {
-				r += `${slave.pregWeek} weeks pregnant with`;
+				r += `${slave.pregWeek} weeks pregnant with `;
 				if (slave.pregType >= 40) {
 					r += `a tremendous brood of offspring.`;
 				} else if (slave.pregType >= 20) {
@@ -17791,6 +17920,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `${slave.race.charAt(0).toUpperCase() + slave.race.charAt(1) + slave.race.charAt(2)}`;
 				break;
 		}
+		r += " ";
 	}
 	
 	function short_nationality(slave) {
@@ -18461,7 +18591,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `${slave.nationality.charAt(0) + slave.nationality.charAt(1) + slave.nationality.charAt(2)}`;
 				break;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function long_nationality(slave) {
@@ -18520,7 +18650,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `${slave.skin.charAt(0).toUpperCase() + slave.skin.charAt(1) + slave.skin.charAt(2)}`;
 				break;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function short_genitals(slave) {
@@ -18554,7 +18684,7 @@ window.SlaveSummaryUncached = (function(){
 			} else if (slave.balls > 3) {
 				r += `Balls`;
 			}
-			r += `</span>`;
+			r += `</span> `;
 		}
 		if (slave.vagina === 0) {
 			r += `<span class="lime">VV</span>`;
@@ -18566,19 +18696,19 @@ window.SlaveSummaryUncached = (function(){
 		}
 		r += `<span class="pink">`;
 		if ((slave.vagina > 3) && (slave.anus > 3)) {
-			r += `V++A++`;
+			r += ` V++A++`;
 		} else if ((slave.vagina > 2) && (slave.anus > 2)) {
-			r += `V+A+`;
+			r += ` V+A+`;
 		} else if (slave.vagina > 3) {
-			r += `V++`;
+			r += ` V++`;
 		} else if (slave.vagina > 2) {
-			r += `V+`;
+			r += ` V+`;
 		} else if (slave.anus > 3) {
-			r += `A++`;
+			r += ` A++`;
 		} else if (slave.anus > 2) {
-			r += `A+`;
+			r += ` A+`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function long_genitals(slave) {
@@ -18662,6 +18792,7 @@ window.SlaveSummaryUncached = (function(){
 		if (slave.visualAge !== slave.physicalAge) {
 			r += `Lks${slave.visualAge}`;
 		}
+		r += " ";
 	}
 	
 	function short_face(slave) {
@@ -18680,6 +18811,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `<span class="pink">Face+++${V.summaryStats? `[${slave.face}]` : ''}</span>`;
 		}
+		r += " ";
 	}
 	
 	function short_eyes(slave) {
@@ -18688,6 +18820,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (((slave.eyes === -1) && (slave.eyewear !== "corrective glasses") && (slave.eyewear !== "corrective contacts"))) {
 			r += `<span class="yellow">Sight-</span>`;
 		}
+		r += " ";
 	}
 	
 	function short_lips(slave) {
@@ -18704,6 +18837,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `<span class="red">Lips-</span>${V.summaryStats? `[${slave.lips}]` : ''}`;
 		}
+		r += " ";
 	}
 	
 	function short_teeth(slave) {
@@ -18718,6 +18852,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.teeth === "pointy") {
 			r += `Fangs`;
 		}
+		r += " ";
 	}
 	
 	function short_muscles(slave) {
@@ -18744,6 +18879,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `<span class="red">Weak++</span>${V.summaryStats? `[${slave.muscles}]`: ''}`;
 		}
+		r += " ";
 	}
 	
 	function short_limbs(slave) {
@@ -18761,6 +18897,7 @@ window.SlaveSummaryUncached = (function(){
 			} else {
 				r += `Amp`;
 			}
+			r += " ";
 		}
 		if (!canWalk(slave)) {
 			r += `Immob`;
@@ -18768,7 +18905,7 @@ window.SlaveSummaryUncached = (function(){
 		if (slave.heels === 1) {
 			r += `Heel`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function short_voice(slave) {
@@ -18785,6 +18922,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<span class="pink">Acc</span>`;
 			}
 		}
+		r += " ";
 	}
 	
 	function short_tits_ass(slave) {
@@ -18816,7 +18954,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.butt > 4) {
 			r += `Ass`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function short_hips(slave) {
@@ -18854,7 +18992,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `Disp-`;
 			}
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function short_waist(slave) {
@@ -18873,6 +19011,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `<span class="pink">Wst+++${V.summaryStats? `[${slave.waist}]`: ''}</span>`;
 		}
+		r += " ";
 	}
 	
 	function short_implants(slave) {
@@ -18882,6 +19021,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `Impl`;
 		}
+		r += " ";
 	}
 	
 	function short_lactation(slave) {
@@ -18890,6 +19030,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.lactation === 2) {
 			r += `Lact++`;
 		}
+		r += " ";
 	}
 	
 	function short_mods(slave) {
@@ -18906,7 +19047,7 @@ window.SlaveSummaryUncached = (function(){
 		if (slave.brand !== 0) {
 			r += `Br`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function long_age(slave) {
@@ -19265,6 +19406,7 @@ window.SlaveSummaryUncached = (function(){
 					break;
 			}
 		}
+		r += " ";
 	} 
 	
 	function short_sex_skills(slave) {
@@ -19287,8 +19429,9 @@ window.SlaveSummaryUncached = (function(){
 				r += `S-`;
 			}
 			if (V.summaryStats) {
-				r += `[${_SSkills}]`;
+				r += `[${_SSkills}] `;
 			}
+			r += " ";
 			if (slave.whoreSkill >= 100) {
 				r += `W+++`;
 			} else if (slave.whoreSkill > 60) {
@@ -19300,9 +19443,10 @@ window.SlaveSummaryUncached = (function(){
 			}
 			if (slave.whoreSkill > 10) {
 				if (V.summaryStats) {
-					r += `[${slave.whoreSkill}]`;
+					r += `[${slave.whoreSkill}] `;
 				}
 			}
+			r += " ";
 			if (slave.entertainSkill >= 100) {
 				r += `E+++`;
 			} else if (slave.entertainSkill > 60) {
@@ -19314,10 +19458,11 @@ window.SlaveSummaryUncached = (function(){
 			}
 			if (slave.entertainSkill > 10) {
 				if (V.summaryStats) {
-					r += `[${slave.entertainSkill}]`;
+					r += `[${slave.entertainSkill}] `;
 				}
 			}
 		}
+		r += " ";
 	}
 	
 	function short_prestige(slave) {
@@ -19330,7 +19475,7 @@ window.SlaveSummaryUncached = (function(){
 			} else if (slave.prestige === 1) {
 				r += `Prest`;
 			}
-			r += `</span>`;
+			r += `</span> `;
 		}
 	}
 	
@@ -19534,7 +19679,7 @@ window.SlaveSummaryUncached = (function(){
 		if (V.summaryStats) {
 			r += `[${slave.fetishStrength}]`;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function short_attraction(slave) {
@@ -19559,6 +19704,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `<span class="green">XY+++${V.summaryStats? `[${slave.attrXY}]`: ''}</span>`;
 		}
+		r += " ";
 		if (slave.attrXX <= 5) {
 			r += `<span class="red">XX---${V.summaryStats? `[${slave.attrXX}]`: ''}</span>`;
 		} else if (slave.attrXX <= 15) {
@@ -19574,6 +19720,7 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.attrXY <= 95) {
 			r += `<span class="green">XX+++${V.summaryStats? `[${slave.attrXX}]`: ''}</span>`;
 		}
+		r += " ";
 		if (slave.energy > 95) {
 			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
 				r += `<span class="green">Nympho!</span>`;
@@ -19589,6 +19736,7 @@ window.SlaveSummaryUncached = (function(){
 		} else {
 			r += `<span class="red">SD--${V.summaryStats? `[${slave.energy}]`: ''}</span>`;
 		}
+		r += " ";
 	}
 	
 	function short_smart_fetish(slave) {
@@ -19668,6 +19816,7 @@ window.SlaveSummaryUncached = (function(){
 					break;
 			}
 		}
+		r += " ";
 	}
 	
 	function short_smart_attraction(slave) {
@@ -19708,6 +19857,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `SP:anti-men`;
 			}
 		}
+		r += " ";
 	}
 	
 	function short_behavior_flaw(slave) {
@@ -19744,7 +19894,7 @@ window.SlaveSummaryUncached = (function(){
 				slave.behavioralFlaw = "none";
 				break;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function short_sex_flaw(slave) {
@@ -19807,6 +19957,7 @@ window.SlaveSummaryUncached = (function(){
 				slave.sexualFlaw = "none";
 				break;
 		}
+		r += " ";
 	}	
 	
 	function short_behavior_quirk(slave) {
@@ -19843,6 +19994,7 @@ window.SlaveSummaryUncached = (function(){
 				slave.behavioralQuirk = "none";
 				break;
 		}
+		r += " ";
 	}
 	
 	function short_sex_quirk(slave) {
@@ -19878,7 +20030,7 @@ window.SlaveSummaryUncached = (function(){
 				slave.sexualQuirk = "none";
 				break;
 		}
-		r += `</span>`;
+		r += `</span> `;
 	}
 	
 	function long_fetish(slave) {
@@ -19974,40 +20126,40 @@ window.SlaveSummaryUncached = (function(){
 	
 	function long_attraction(slave) {
 		if (slave.attrXY <= 5) {
-			r += `<span class="red">Disgusted by men${V.summaryStats? `[${slave.attrXY}]` : ''},</span>`;
+			r += `<span class="red">Disgusted by men${V.summaryStats? `[${slave.attrXY}]` : ''},</span> `;
 		} else if (slave.attrXY <= 15) {
-			r += `<span class="red">Turned off by men${V.summaryStats? `[${slave.attrXY}]` : ''},</span>`;
+			r += `<span class="red">Turned off by men${V.summaryStats? `[${slave.attrXY}]` : ''},</span> `;
 		} else if (slave.attrXY <= 35) {
-			r += `<span class="red">Not attracted to men${V.summaryStats? `[${slave.attrXY}]` : ''},</span>`;
+			r += `<span class="red">Not attracted to men${V.summaryStats? `[${slave.attrXY}]` : ''},</span> `;
 		} else if (slave.attrXY <= 65) {
-			r += `Indifferent to men${V.summaryStats? `[${slave.attrXY}]` : ''},`;
+			r += `Indifferent to men${V.summaryStats? `[${slave.attrXY}]` : ''}, `;
 		} else if (slave.attrXY <= 85) {
-			r += `<span class="green">Attracted to men${V.summaryStats? `[${slave.attrXY}]` : ''},</span>`;
+			r += `<span class="green">Attracted to men${V.summaryStats? `[${slave.attrXY}]` : ''},</span> `;
 		} else if (slave.attrXY <= 95) {
-			r += `<span class="green">Aroused by men${V.summaryStats? `[${slave.attrXY}]` : ''},</span>`;
+			r += `<span class="green">Aroused by men${V.summaryStats? `[${slave.attrXY}]` : ''},</span> `;
 		} else if (slave.attrXX > 95) {
 			if (slave.energy <= 95) {
-				r += `<span class="green">Omnisexual!</span>`;
+				r += `<span class="green">Omnisexual!</span> `;
 			} else {
-				r += `<span class="green">Omnisexual nymphomaniac!</span>`;
+				r += `<span class="green">Omnisexual nymphomaniac!</span> `;
 			}
 		} else {
-			r += `<span class="green">Passionate about men${V.summaryStats? `[${slave.attrXY}]` : ''},</span>`;
+			r += `<span class="green">Passionate about men${V.summaryStats? `[${slave.attrXY}]` : ''},</span> `;
 		}
 		if (slave.attrXX <= 5) {
-			r += `<span class="red">disgusted by women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span>`;
+			r += `<span class="red">disgusted by women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span> `;
 		} else if (slave.attrXX <= 15) {
-			r += `<span class="red">turned off by women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span>`;
+			r += `<span class="red">turned off by women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span> `;
 		} else if (slave.attrXX <= 35) {
-			r += `<span class="red">not attracted to women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span>`;
+			r += `<span class="red">not attracted to women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span> `;
 		} else if (slave.attrXX <= 65) {
 			r += `indifferent to women${V.summaryStats? `[${slave.attrXX}]` : ''}. `;
 		} else if (slave.attrXX <= 85) {
-			r += `<span class="green">attracted to women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span>`;
+			r += `<span class="green">attracted to women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span> `;
 		} else if (slave.attrXX <= 95) {
-			r += `<span class="green">aroused by women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span>`;
+			r += `<span class="green">aroused by women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span> `;
 		} else if (slave.attrXY <= 95) {
-			r += `<span class="green">passionate about women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span>`;
+			r += `<span class="green">passionate about women${V.summaryStats? `[${slave.attrXX}]` : ''}.</span> `;
 		}
 		if (slave.energy > 95) {
 			if ((slave.attrXY <= 95) || (slave.attrXX <= 95)) {
@@ -20295,6 +20447,7 @@ window.SlaveSummaryUncached = (function(){
 	}
 	
 	function short_extended_family(slave) {
+		let handled = 0;
 		if (slave.mother > 0) {
 			let _ssj = V.slaves.findIndex(function(s) {
 				return s.ID === slave.mother;
@@ -20313,18 +20466,20 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` & wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 			}
+			r += " ";
 		} else if (slave.mother === -1) {
 			r += `Your daughter`;
 			if (slave.relationship === -3) {
-				r += `& wife`;
-				_relationshipHandled = 1;
+				r += ` & wife`;
+				handled = 1;
 			} else if (slave.relationship === -2) {
-				r += `& lover`;
-				_relationshipHandled = 1;
+				r += ` & lover`;
+				handled = 1;
 			}
+			r += " ";
 		}
 		if (slave.father > 0 && slave.father !== slave.mother) {
 			let _ssj = V.slaves.findIndex(function(s) {
@@ -20332,7 +20487,7 @@ window.SlaveSummaryUncached = (function(){
 			});
 			if (_ssj !== -1) {
 				r += `${SlaveFullName(V.slaves[_ssj])}'s daughter`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID && _relationshipHandled !== 1) {
+				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
 					if (slave.relationship === 1) {
 						r += ` & friend`;
 					} else if (slave.relationship === 2) {
@@ -20344,17 +20499,18 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` & wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 			}
+			r += " ";
 		} else if (slave.father === -1 && slave.mother !== -1) {
 			r += `Your daughter`;
 			if (slave.relationship === -3) {
-				r += `& wife`;
-				_relationshipHandled = 1;
+				r += ` & wife`;
+				handled = 1;
 			} else if (slave.relationship === -2) {
-				r += `& lover`;
-				_relationshipHandled = 1;
+				r += ` & lover`;
+				handled = 1;
 			}
 		}
 		if (slave.daughters === 1) {
@@ -20375,15 +20531,16 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` & wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 			}
+			r += " ";
 			_ssj = V.slaves.findIndex(function(s) {
 				return s.father === slave.ID;
 			});
 			if (_ssj !== -1) {
 				r += `${SlaveFullName(V.slaves[_ssj])}'s father`;
-				if (slave.relationshipTarget === V.slaves[_ssj].ID && _relationshipHandled !== 1) {
+				if (slave.relationshipTarget === V.slaves[_ssj].ID && handled !== 1) {
 					if (slave.relationship === 1) {
 						r += ` & friend`;
 					} else if (slave.relationship === 2) {
@@ -20395,11 +20552,12 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` & wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 			}
+			r += " ";
 		} else if (slave.daughters > 1) {
-			r += `multiple daughters`;
+			r += `multiple daughters `;
 		}
 		if (slave.sisters === 1) {
 			let _ssj = V.slaves.findIndex(function(s) {
@@ -20419,13 +20577,14 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` & wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 			}
+			r += " ";
 		} else if (slave.sisters > 1) {
-			r += `multiple sisters`;
+			r += `multiple sisters `;
 		}
-		if (slave.relationship > 0 && _relationshipHandled !== 1) {
+		if (slave.relationship > 0 && handled !== 1) {
 			let _ssj = V.slaves.findIndex(function(s) {
 				return s.ID === slave.relationshipTarget;
 			});
@@ -20433,19 +20592,19 @@ window.SlaveSummaryUncached = (function(){
 				r += `${SlaveFullName(V.slaves[_ssj])}'s`;
 				switch (slave.relationship) {
 					case 1:
-						r += `friend`;
+						r += ` friend`;
 						break;
 					case 2:
-						r += `BFF`;
+						r += ` BFF`;
 						break;
 					case 3:
-						r += `FWB`;
+						r += ` FWB`;
 						break;
 					case 4:
-						r += `lover`;
+						r += ` lover`;
 						break;
 					case 5:
-						r += `wife`;
+						r += ` wife`;
 						break;
 				}
 			}
@@ -20456,72 +20615,73 @@ window.SlaveSummaryUncached = (function(){
 		} else if (slave.relationship === -1) {
 			r += `E Slut`;
 		}
+		r += " ";
 	}
 	
 	function short_legacy_family(slave) {
 		if (slave.relation !== 0) {
-				let _ssj = V.slaves.findIndex(function(s) {
-					return s.ID === slave.relationTarget;
-				});
-				if (_ssj !== -1) {
-					r += `${SlaveFullName(V.slaves[_ssj])}'s ${slave.relation}`;
-				}
+			let _ssj = V.slaves.findIndex(function(s) {
+				return s.ID === slave.relationTarget;
+			});
+			if (_ssj !== -1) {
+				r += `${SlaveFullName(V.slaves[_ssj])}'s ${slave.relation}`;
 			}
-			if (slave.relationship > 0) {
-				let _ssj = V.slaves.findIndex(function(s) {
-					return s.ID === slave.relationshipTarget;
-				});
-				if (_ssj !== -1) {
-					switch (slave.relationship) {
-						case 1:
-							if (slave.relationshipTarget !== slave.relationTarget) {
-								r += `${SlaveFullName(V.slaves[_ssj])}'s`;
-							} else {
-								r += `&`;
-							}
-							r += `friend`;
-							break;
-						case 2:
-							if (slave.relationshipTarget !== slave.relationTarget) {
-								r += `${SlaveFullName(V.slaves[_ssj])}'s`;
-							} else {
-								r += `&`;
-							}
-							r += `BFF`;
-							break;
-						case 3:
-							if (slave.relationshipTarget !== slave.relationTarget) {
-								r += `${SlaveFullName(V.slaves[_ssj])}'s`;
-							} else {
-								r += `&`;
-							}
-							r += `FWB`;
-							break;
-						case 4:
-							if (slave.relationshipTarget !== slave.relationTarget) {
-								r += `${SlaveFullName(V.slaves[_ssj])}'s`;
-							} else {
-								r += `&`;
-							}
-							r += `lover`;
-							break;
-						case 5:
-							if (slave.relationshipTarget !== slave.relationTarget) {
-								r += `${SlaveFullName(V.slaves[_ssj])}'s`;
-							} else {
-								r += `&`;
-							}
-							r += `wife`;
-							break;
-					}
+		}
+		if (slave.relationship > 0) {
+			let _ssj = V.slaves.findIndex(function(s) {
+				return s.ID === slave.relationshipTarget;
+			});
+			if (_ssj !== -1) {
+				switch (slave.relationship) {
+					case 1:
+						if (slave.relationshipTarget !== slave.relationTarget) {
+							r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+						} else {
+							r += ` &`;
+						}
+						r += ` friend`;
+						break;
+					case 2:
+						if (slave.relationshipTarget !== slave.relationTarget) {
+							r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+						} else {
+							r += ` &`;
+						}
+						r += ` BFF`;
+						break;
+					case 3:
+						if (slave.relationshipTarget !== slave.relationTarget) {
+							r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+						} else {
+							r += ` &`;
+						}
+						r += ` FWB`;
+						break;
+					case 4:
+						if (slave.relationshipTarget !== slave.relationTarget) {
+							r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+						} else {
+							r += ` &`;
+						}
+						r += ` lover`;
+						break;
+					case 5:
+						if (slave.relationshipTarget !== slave.relationTarget) {
+							r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+						} else {
+							r += ` &`;
+						}
+						r += ` wife`;
+						break;
 				}
-			} else if (slave.relationship === -3) {
-				r += `Your wife`;
-			} else if (slave.relationship === -2) {
-				r += `E Bonded`;
-			} else if (slave.relationship === -1) {
-				r += `E Slut`;
 			}
+		} else if (slave.relationship === -3) {
+			r += `Your wife`;
+		} else if (slave.relationship === -2) {
+			r += `E Bonded`;
+		} else if (slave.relationship === -1) {
+			r += `E Slut`;
+		}
 	}
 	
 	function short_rival(slave) {
@@ -20539,12 +20699,13 @@ window.SlaveSummaryUncached = (function(){
 				} else {
 					r += `Hates ${SlaveFullName(V.slaves[_ssj])}`;
 				}
-				r += `</span>`;
+				r += `</span> `;
 			}
 		}
 	}
 	
 	function long_extended_family(slave) {
+		let handled = 0;
 		if (slave.mother > 0) {
 			let _ssj = V.slaves.findIndex(function(s) {
 				return s.ID === slave.mother;
@@ -20563,18 +20724,18 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` and wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 				r += `.</span> `;
 			}
 		} else if (slave.mother === -1) {
-			r += `Your`;
+			r += `Your `;
 			if (slave.relationship === -3) {
 				r += `<span class="lightgreen">daughter and wife.</span> `;
-				_relationshipHandled = 1;
+				handled = 1;
 			} else if (slave.relationship === -2) {
 				r += `<span class="lightgreen">daughter and lover.</span> `;
-				_relationshipHandled = 1;
+				handled = 1;
 			} else {
 				r += `<span class="lightgreen">daughter.</span> `;
 			}
@@ -20597,18 +20758,18 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` and wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 				r += `.</span> `;
 			}
 		} else if (slave.father === -1 && slave.father !== slave.mother) {
-			r += `Your`;
+			r += `Your `;
 			if (slave.relationship === -3) {
 				r += `<span class="lightgreen">daughter and wife.</span> `;
-				_relationshipHandled = 1;
+				handled = 1;
 			} else if (slave.relationship === -2) {
 				r += `<span class="lightgreen">daughter and lover.</span> `;
-				_relationshipHandled = 1;
+				handled = 1;
 			} else {
 				r += `<span class="lightgreen">daughter.</span> `;
 			}
@@ -20631,7 +20792,7 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` and wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 				r += `.</span> `;
 			}
@@ -20652,7 +20813,7 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` and wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 				r += `.</span> `;
 			}
@@ -20683,7 +20844,7 @@ window.SlaveSummaryUncached = (function(){
 					} else {
 						r += ` and wife`;
 					}
-					_relationshipHandled = 1;
+					handled = 1;
 				}
 				r += `.</span> `;
 			}
@@ -20696,12 +20857,12 @@ window.SlaveSummaryUncached = (function(){
 				r += `<span class="lightgreen">Has several sisters.</span> `;
 			}
 		}
-		if (slave.relationship > 0 && _relationshipHandled !== 1) {
+		if (slave.relationship > 0 && handled !== 1) {
 			let _ssj = V.slaves.findIndex(function(s) {
 				return s.ID === slave.relationshipTarget;
 			});
 			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+				r += `${SlaveFullName(V.slaves[_ssj])}'s `;
 				switch (slave.relationship) {
 					case 1:
 						r += `<span class="lightgreen">friend.</span> `;
@@ -20735,7 +20896,7 @@ window.SlaveSummaryUncached = (function(){
 				return s.ID === slave.relationTarget;
 			});
 			if (_ssj !== -1) {
-				r += `${SlaveFullName(V.slaves[_ssj])}'s`;
+				r += `${SlaveFullName(V.slaves[_ssj])}'s `;
 				if (slave.relationshipTarget !== slave.relationTarget) {
 					r += `<span class="lightgreen">${slave.relation}</span>. `;
 				} else {
@@ -21215,3 +21376,4 @@ window.SlaveSummaryUncached = (function(){
 	
 	return SlaveSummaryUncached;
 })();
+
diff --git a/src/js/slaveSummaryWidgets.tw b/src/js/slaveSummaryWidgets.tw
index ad41a1d1cfa..17e58512ca4 100644
--- a/src/js/slaveSummaryWidgets.tw
+++ b/src/js/slaveSummaryWidgets.tw
@@ -439,7 +439,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<strong><span class="red">W++${V.summaryStats? `[${slave.weight}]` : ''}</span></strong>`;
 			}
 		} else if (slave.weight <= 130) {
-			if (slave.hips >= 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
 				r += `<strong>W+++${V.summaryStats? `[${slave.weight}]` : ''}</strong>`;
 			} else {
 				r += `<strong><span class="red">W+++${V.summaryStats? `[${slave.weight}]` : ''}</span></strong>`;
@@ -488,7 +488,7 @@ window.SlaveSummaryUncached = (function(){
 				r += `<span class="red">Overweight${V.summaryStats ? `[${slave.weight}]`: ''}.</span>`;
 			}
 		} else if (slave.weight <= 130) {
-			if (slave.hips >= 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
+			if (slave.hips > 2 || V.arcologies[0].FSHedonisticDecadence !== "unset") {
 				r += `Pleasantly soft and shapely${V.summaryStats? `[${slave.weight}]`: ''}.`;
 			} else {
 				r += `<span class="red">Fat${V.summaryStats ? `[${slave.weight}]`: ''}.</span>`;
-- 
GitLab