diff --git a/devNotes/twine JS.txt b/devNotes/twine JS.txt
index 20d4919b7fb20a1f2924ee750f1ccbf829745688..0d92046955cc4906b9d82c143934d1514ebeb542 100644
--- a/devNotes/twine JS.txt	
+++ b/devNotes/twine JS.txt	
@@ -12689,349 +12689,254 @@ window.saChoosesOwnClothes = (function() {
 
 })();
 
-/* :: FResult [script]*/
-
-// this is a port of the FResult widget
-// it has been broken up into several functions, because it grew too long
-// it has been wrapped in a closure so as not to pollute the global namespace
-// and so that nested functions are only evaluated once
-
-window.FResult = (function() {
-	"use strict";
-	// we can't initialise our global variables on load, because SugarCube.State isn't initialised
-	// instead, declare them and initialise on run time
-	let V, result, incest_bonus;
-	function FResult(slave) {
-		V = State.variables;
-		incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1;
-
-		calcUseWeights(slave);
-		if (!slave.fuckdoll)
-			calcNotFuckdoll(slave);
-		else
-			result += slave.fuckdoll/10;
-
-		result += Math.max(0, slave.aphrodisiacs) * 2;
-
-		if (slave.inflationType === "aphrodisiac")
-			result += slave.inflation*4;
-
-		if (slave.lactation > 0)
-			result += 1;
+/* End Week Passage Conversions */
 
-		if (slave.nipples === "fuckable")
-			calcFuckableTits(slave);
+/*:: SA rest [script]*/
 
-		if (V.seeAge === 1)
-			calcAge(slave);
-		if (slave.fetish === "mindbroken")
-			result = Math.trunc(result*0.4);
-		else
-			result = Math.trunc(result*0.7);
+window.saRest = function saRest(slave) {
 
-		if (slave.pregWeek < 0)
-			result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth
+	var pronouns = getPronouns(slave);
+	var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun;
+	var He = capFirstChar(he), His = capFirstChar(his);
+	var V = State.variables;
 
-		calcAmputation(slave);
+	var t = " takes the week off.";
 
-		if (V.arcologies[0].FSHedonisticDecadence > 20)
-			calcHedonismWeight(slave);
-		if (result < 2) {
-			if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20)
-				result = 0;
-			else
-				result = 2;
+	if (slave.fuckdoll > 0) {
+		t += " ${He} has nothing to do but ";
+		if (slave.amp == 0) {
+			t += "lie ";
+		} else {
+			t += "stand ";
 		}
-		return result;
+		t += "in place.";
 	}
 
-	function calcUseWeights(slave) {
-		result = (3 - slave.anus)+(slave.muscles/30);
-		if (slave.muscles < -95)
-			result -= 5;
-		else if (slave.muscles < -30)
-			result -= 2;
-
-		const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight;
-		if (uses <= 0) return;
-
-		result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30);
-		if (slave.sexualFlaw === "cum addict")
-			result += (V.oralUseWeight/uses) * (slave.oralSkill/30);
-		if (canDoVaginal(slave)) {
-			result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30);
-			result += (3 - slave.vagina);
-			result += slave.vaginaLube;
-		}
-		if (canDoAnal(slave)) {
-			result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30);
-			if (slave.sexualFlaw === "anal addict")
-				result += (V.analUseWeight/uses) * (slave.analSkill/30);
-			if (slave.inflationType === "aphrodisiac")
-				result += (V.analUseWeight/uses) * (slave.inflation * 3);
+	if (slave.health > 90) {
+		t += ` ${His} health is so outstanding that rest does not improve it.`;
+	} else if (slave.health > -100) {
+		t += ` ${His} <span class='green'>health recovers</span> with rest.`;
+		slave.health += 10;
+		if (!(canHear(slave))) {
+			t += ` Since ${he} is deaf, the hustle and bustle of daily life in the penthouse <span class='green'>didn't bother ${him} at all.</span>`;
+			slave.health += 3;
+		} else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) {
+			t += ` Since ${he} is hard of hearing, the hustle and bustle of daily life in the penthouse <span class='green'>didn't disturb ${his} rest as much.</span>`;
+			slave.health += 1;
 		}
 	}
 
-	function calcFuckableTits(slave) {
-		result += 2;
-		if (slave.fetish === "boobs")
-			result += Math.trunc(slave.fetishStrength/20);
-	}
-
-	function calcWorksWithRelatives(slave) {
-		V.slaves.forEach(islave => {
-			if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) {
-				result += 1;
-				if (incest_bonus) result += 1;
+	if (slave.fuckdoll == 0 && slave.fetish != "mindbroken") {
+		if (slave.devotion > 20) {
+			if (slave.trust <= 20) {
+				t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`;
+				slave.trust += 4;
+			} else if (slave.trust <= 50) {
+				t += ` Being allowed to rest <span class='mediumaquamarine'>builds ${his} trust</span> in you.`;
+				slave.trust += 2;
+			} else {
+				t += ` Being allowed to rest <span class='mediumaquamarine'>confirms ${his} trust</span> in you.`;
+				slave.trust += 2;
 			}
-			if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) {
-				result += 1;
-				if (incest_bonus) result += 1;
+		} else {
+			if (slave.trust < -20) {
+				t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`;
+				slave.trust += 4;
 			}
-		});
-	}
-
-	function calcWorksWithRelativesVanilla(slave) {
-		const fre = getSlave(slave.relationTarget)
-		if (fre !== undefined && sameAssignmentP(slave, fre)) {
-			result += 2;
-			if (incest_bonus) result += 2;
 		}
 	}
 
-	function calcWorksWithRelationship(slave) {
-		const fre = V.slaves.findIndex(s => {
-			return haveRelationshipP(slave, s) && sameAssignmentP(slave, s);
-		});
-		if (fre !== -1) result += 1;
+	if (V.showVignettes == 1 && slave.assignment === Job.REST) {
+		var _vignette = GetVignette(slave);
+		t += ` __This week__ ${_vignette.text} `
+		if (_vignette.type == "cash") {
+			if (_vignette.effect > 0) {
+				t += `<span class='yellowgreen'>making you an extra ${cashFormat(Math.trunc(V.FResult*_vignette.effect))}.</span>`;
+			} else if (_vignette.effect < 0) {
+				t += `<span class='red'>losing you ${cashFormat(Math.abs(Math.trunc(V.FResult*_vignette.effect)))}.</span>`;
+			} else {
+				t += `an incident without lasting effect.`;
+			}
+			V.cash += Math.trunc(V.FResult*_vignette.effect);
+		} else if (_vignette.type == "devotion") {
+			if (_vignette.effect > 0) {
+				if (slave.devotion > 50) {
+					t += `<span class='hotpink'>increasing ${his} devotion to you.</span>`;
+				} else if (slave.devotion >= -20) {
+					t += `<span class='hotpink'>increasing ${his} acceptance of you.</span>`;
+				} else if (slave.devotion > -10) {
+					t += `<span class='hotpink'>reducing ${his} dislike of you.</span>`;
+				} else {
+					t += `<span class='hotpink'>reducing ${his} hatred of you.</span>`;
+				}
+			} else if (_vignette.effect < 0) {
+				if (slave.devotion > 50) {
+					t += `<span class='mediumorchid'>reducing ${his} devotion to you.</span>`;
+				} else if (slave.devotion >= -20) {
+					t += `<span class='mediumorchid'>reducing ${his} acceptance of you.</span>`;
+				} else if (slave.devotion > -10) {
+					t += `<span class='mediumorchid'>increasing ${his} dislike of you.</span>`;
+				} else {
+					t += `<span class='mediumorchid'>increasing ${his} hatred of you.</span>`;
+				}
+			} else {
+				t += `an incident without lasting effect.`;
+			}
+			slave.devotion += (1*_vignette.effect);
+		} else if (_vignette.type == "trust") {
+			if (_vignette.effect > 0) {
+				if (slave.trust > 20) {
+					t += `<span class='mediumaquamarine'>increasing ${his} trust in you.</span>`;
+				} else if (slave.trust > -10) {
+					t += `<span class='mediumaquamarine'>reducing ${his} fear of you.</span>`;
+				} else {
+					t += `<span class='mediumaquamarine'>reducing ${his} terror of you.</span>`;
+				}
+			} else if (_vignette.effect < 0) {
+				if (slave.trust > 20) {
+					t += `<span class='gold'>reducing ${his} trust in you.</span>`;
+				} else if (slave.trust >= -20) {
+					t += `<span class='gold'>increasing ${his} fear of you.</span>`;
+				} else {
+					t += `<span class='gold'>increasing ${his} terror of you.</span>`;
+				}
+			} else {
+				t += `an incident without lasting effect.`;
+			}
+			slave.trust += (1*_vignette.effect);
+		} else if (_vignette.type == "health") {
+			if (_vignette.effect > 0) {
+				t += `<span class='green'>improving ${his} health.</span>`;
+			} else if (_vignette.effect < 0) {
+				t += `<span class='red'>affecting ${his} health.</span>`;
+			} else {
+				t += `an incident without lasting effect.`;
+			}
+			slave.health += (2*_vignette.effect);
+		} else {
+			if (_vignette.effect > 0) {
+				t += `<span class='green'>gaining you a bit of reputation.</span>`;
+			} else if (_vignette.effect < 0) {
+				t += `<span class='red'>losing you a bit of reputation.</span>`;
+			} else {
+				t += `an incident without lasting effect.`;
+			}
+			V.rep += Math.trunc(V.FResult*_vignette.effect*0.1);
+		}
 	}
 
-	function calcWorksWithRival(slave) {
-		const en = getSlave(slave.rivalryTarget);
-		if (en !== undefined && sameAssignmentP(slave, en)) result -= 1;
-	}
+	return t;
+}
 
-	function calcHInjectionsDiet(slave) {
-		if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections")
-			result -= 10;
-		if (slave.diet === "XXY")
-			result += 2;
-		else if (slave.diet === "XY" || slave.diet === "XX")
-			result += 1;
-		else if (slave.diet === "cum production")
-			result += 1;
-		else if (slave.diet === "fertility")
-			result += 1;
-	}
-	function calcPreg(slave) {
-		if (V.arcologies[0].FSRepopulationFocus > 20) {
-			if (slave.preg > 10) result += 2;
-			else result -= 2;
-		} else if (V.arcologies[0].FSRestart > 20) {
-			if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1)
-				result += 1;
-			else if (slave.preg > 10)
-				result -= 10;
-			else
-				result += 0;
-		}
-	}
+/*:: SA servant [script]*/
 
-	function calcRace(slave) {
-		if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave))
-			result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10);
-		if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave))
-			result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME);
-	}
+window.saServant = function saServant(slave) {
 
-	function calcSexAttributes(slave) {
-		if (slave.clitPiercing > 2) result += 1;
-		if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none")
-			result += slave.fetishStrength/5;
-
-		if (slave.attrKnown === 1) {
-			result += Math.trunc(slave.attrXX/20);
-			result += Math.trunc(slave.attrXY/20);
-			if (slave.energy > 95) result += 3;
-			else if (slave.energy > 80) result += 2;
-			else if (slave.energy > 60) result += 1;
-			else if (slave.energy <= 20) result -= 2;
-			else if (slave.energy <= 40) result -= 1;
-		}
-		if (slave.sexualFlaw !== "none") result -= 2;
-		if (slave.sexualQuirk !== "none") result += 2;
-		if (slave.behavioralFlaw !== "none") result -= 2;
-		if (slave.behavioralQuirk !== "none") result += 2;
-	}
-
-	function calcCareer(slave) {
-		if (setup.whoreCareers.includes(slave.career))
-			result += 1;
-		else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000)
-			result += 1;
-	}
-
-	function calcSight(slave) {
-		if (!canSee(slave)) result -= 3;
-		else if (slave.eyes <= -1) {
-			if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts")
-				result -= 1;
-		} else if (slave.eyewear === "blurring glasses")
-			result -= 1;
-		else if (slave.eyewear === "blurring contacts")
-			result -= 1;
-	}
+	var pronouns = getPronouns(slave);
+	var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun;
+	var He = capFirstChar(he), His = capFirstChar(his);
+	var V = State.variables;
 
-	function calcHearing(slave) {
-		if (!canHear(slave)) result -= 2;
-		else if (slave.hears <= -1) {
-			if (slave.earwear !== "hearing aids")
-				result -= 1;
-		} else if (slave.earwear === "muffling ear plugs")
-			result -= 1;
-	}
+	var t = `works as a servant. ${He} performs the lowest jobs in your penthouse, cleaning up after your other slaves, bathing them, helping them dress, and giving them sexual relief.`;
 
-	function calcEgyptianBonus(slave) {
-		if (V.racialVarieties === undefined) V.racialVarieties = [];
-		if (!V.racialVarieties.includes(slave.race))
-			V.racialVarieties.push(slave.race);
+	if (V.servantsQuarters > 0) {
+		if ((V.universalRulesFacilityWork == 1 && slave.assignment == "be a servant" && V.servantsQuartersSpots > 0) || (slave.assignment == "work as a servant")) {
+			if (slave.assignment == "be a servant") {
+				t += ` Since there's extra space in the servants' quarters, ${V.assistantName} attaches ${him} to the cadre of maids there.`;
+				V.servantsQuartersSpots--;
+			}
+			if (V.Stewardess != 0) {
+				t += ` This brings ${him} under ${V.Stewardess.slaveName}'s supervision. The Stewardess `;
+				if (slave.devotion < -20) {
+					t += `subjects ${him} to <span class='gold'>corrective rape</span> when ${his} service is imperfect, <span class='hotpink'>when ${he} steps out of line</span>, or when the Stewardess just feels like raping ${him}, forcing the poor slave to <span class='yellowgreen'>find refuge in work.</span>`;
+					slave.devotion += 2;
+					slave.trust -= 2;
+				} else if (slave.devotion <= 20) {
+					t += `molests ${him}, encouraging the poor slave to <span class='hotpink'>keep ${his} head down</span> and <span class='yellowgreen'>work harder.</span>`;
+					slave.devotion += 2;
+				} else {
+					t += `uses <span class='hotpink'>sex as a reward</span>, getting ${him} off when ${he} <span class='yellowgreen'>works harder.</span>`;
+					slave.devotion++;
+				}
+				if (!(canHear(slave))) {
+					t += ` However, ${his} inability to hear often leaves ${him} oblivious to ${V.Stewardess.slaveName}'s orders, limiting their meaningful interactions.`;
+					V.cash += (V.stewardessBonus/4);
+				} else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) {
+					t += ` However, ${he} often doesn't catch what ${V.Stewardess.slaveName} says, leading to frustration, confusion and less work done.`;
+					V.cash += (V.stewardessBonus/2);
+				} else {
+					V.cash += V.stewardessBonus;
+				}
+			}
+		}
 	}
 
-	function calcYouthBonus(slave) {
-		if (slave.visualAge < 30) {
-			if (slave.actualAge > 30)
-				result += 5; // experienced for her apparent age
-			if (slave.physicalAge > 30)
-				result -= slave.physicalAge/2; // too old :(
+	t += ` ${He} is `;
+	if (slave.trust < -20) {
+		t += "frightened of punishment and works very hard, <span class='yellowgreen'>reducing the upkeep</span> of your slaves.";
+	} else if (slave.devotion < -20) {
+		if (slave.trust >= 20) {
+			t += `uninterested in doing such work and barely lifts a finger to <span class='yellowgreen'>reduce the upkeep</span> of your slaves.`;
+		} else {
+			t += `reluctant, requiring your other slaves to force ${his} services, and does not <span class='yellowgreen'>reduce upkeep</span> of your slaves much.`;
 		}
+	} else if (slave.devotion <= 20) {
+		t += `hesitant, requiring your other slaves to demand ${his} services, and only slightly <span class='yellowgreen'>reduces upkeep</span> of your slaves.`;
+	} else if (slave.devotion <= 50) {
+		t += `obedient, offering your other slaves ${his} services, and moderately <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`;
+	} else if (slave.devotion <= 95) {
+		t += `devoted, happily giving your other slaves ${his} services, and <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`;
+	} else {
+		t += `so happy to serve your other slaves that ${he} often sees to their needs before they know they have them, and greatly <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`;
 	}
 
-	function calcMatureBonus(slave) {
-		if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge)
-			result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit
-	}
+	let _oral = jsRandom(5,10);
+	slave.oralCount += _oral;
+	V.oralTotal += _oral;
 
-	function calcNotFuckdoll(slave) {
-		if (V.familyTesting === 1 && totalRelatives(slave) > 0)
-			calcWorksWithRelatives(slave);
-		else if(!V.familyTesting && slave.relation !==0)
-			calcWorksWithRelativesVanilla(slave);
-		if (slave.relationship > 0) calcWorksWithRelationship(slave);
-		if (slave.rivalry !== 0) calcWorksWithRival(slave);
-		calcHInjectionsDiet(slave);
-		calcPreg(slave);
-		calcRace(slave);
-		calcSexAttributes(slave);
-		calcCareer(slave);
-		calcSight(slave);
-		calcHearing(slave);
-		if (V.arcologies[0].FSEgyptianRevivalist !== "unset")
-			calcEgyptianBonus(slave);
-		if (V.arcologies[0].FSYouthPreferentialist !== "unset")
-			calcYouthBonus(slave);
-		else if (V.arcologies[0].FSMaturityPreferentialist !== "unset")
-			calcMatureBonus(slave);
+	if (slave.relationship == -2) {
+		t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`;
+	} else if (slave.relationship == -3 && slave.devotion > 50) {
+		t += ` ${He} does ${his}very best to be the perfect housewife, making ${him} an outstanding servant.`;
 	}
 
-	function calcAge(slave) {
-		if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) {
-			result += 1;
-			if (slave.birthWeek === 0) result += result;
-			else if (slave.birthWeek < 4) result += 0.2*result;
-		} else if (slave.physicalAge === V.minimumSlaveAge) {
-			result += 1;
-			if (slave.birthWeek === 0 ) result += 0.5*result;
-			else if (slave.birthWeek < 4) result += 0.1*result;
-		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) {
-			result += 1;
-			if (slave.birthWeek === 0)
-				result += 0.5*result;
-			else if (slave.birthWeek < 4)
-				result += 0.1*result;
-		}
+	if (setup.servantCareers.includes(slave.career)) {
+		t += ` ${He} has experience with house keeping from ${his} life before ${he} was a slave, making ${him} more effective.`;
+	} else if (slave.skillS >= V.masteredXP) {
+		t += ` ${He} has experience with house keeping from working for you, making ${him} more effective.`;
+	} else {
+		slave.skillS += jsRandom(1,Math.ceil((slave.intelligence+slave.intelligenceImplant)/15) + 8);
 	}
 
-	function calcAmputation(slave) {
-		switch(slave.amp) {
-		case 0:
-		case -2:
-		case -5:
-			break;
-		case 1:
-			result -= 2;
-			break;
-		default:
-			result -= 1;
+	if (slave.fetishStrength > 60) {
+		if (slave.fetish == "submissive" && slave.fetishKnown == 1) {
+			t += ` ${His} natural affinity for submission increases ${his} effectiveness.`;
+		} else if (slave.fetishKnown == 1 && slave.fetish == "dom") {
+			t += ` ${His} sexual appetite for domination reduces ${his} effectiveness.`;
 		}
 	}
 
-	function calcHedonismWeight(slave) {
-		if (slave.weight < 10)
-			result -= 2;
-		else if (slave.weight > 190)
-			result -= 5; // too fat
-	}
-	return FResult;
-})();
-
-/* End Week Passage Conversions */
-
-/*:: SA rest [script]*/
-
-window.saRest = function saRest(slave) {
-
-	var pronouns = getPronouns(slave);
-	var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun;
-	var He = capFirstChar(he), His = capFirstChar(his);
-	var V = State.variables;
-
-	var t = " takes the week off.";
-
-	if (slave.fuckdoll > 0) {
-		t += " ${He} has nothing to do but ";
-		if (slave.amp == 0) {
-			t += "lie ";
-		} else {
-			t += "stand ";
-		}
-		t += "in place.";
+	if (slave.energy < 20) {
+		t += ` ${His} frigidity allows ${him} to ignore the intercourse all around ${him}, making ${him} very efficient.`;
+	} else if (slave.energy < 40) {
+		t += ` ${His} low sex drive keeps ${him} from becoming too distracted by the intercourse all around ${him}, making ${him} more efficient.`;
 	}
 
-	if (slave.health > 90) {
-		t += ` ${His} health is so outstanding that rest does not improve it.`;
-	} else if (slave.health > -100) {
-		t += ` ${His} <span class='green'>health recovers</span> with rest.`;
-		slave.health += 10;
-		if (!(canHear(slave))) {
-			t += ` Since ${he} is deaf, the hustle and bustle of daily life in the penthouse <span class='green'>didn't bother ${him} at all.</span>`;
-			slave.health += 3;
-		} else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) {
-			t += ` Since ${he} is hard of hearing, the hustle and bustle of daily life in the penthouse <span class='green'>didn't disturb ${his} rest as much.</span>`;
-			slave.health += 1;
-		}
+	if ((slave.eyes <= -1 && slave.eyewear != "corrective glasses" && slave.eyewear != "corrective contacts") || (slave.eyewear == "blurring glasses") || (slave.eyewear == "blurring contacts")) {
+		t += ` ${His} bad vision makes ${him} a worse servant.`;
 	}
 
-	if (slave.fuckdoll == 0 && slave.fetish != "mindbroken") {
-		if (slave.devotion > 20) {
-			if (slave.trust <= 20) {
-				t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`;
-				slave.trust += 4;
-			} else if (slave.trust <= 50) {
-				t += ` Being allowed to rest <span class='mediumaquamarine'>builds ${his} trust</span> in you.`;
-				slave.trust += 2;
-			} else {
-				t += ` Being allowed to rest <span class='mediumaquamarine'>confirms ${his} trust</span> in you.`;
-				slave.trust += 2;
-			}
+	if (slave.lactation > 0) {
+		t += ` Since ${he} is lactating, `;
+		if (slave.devotion > 20 || slave.trust < -20) {
+			t += ` ${he} serves `;
 		} else {
-			if (slave.trust < -20) {
-				t += ` Being allowed to rest <span class='mediumaquamarine'>reduces ${his} fear</span> of you.`;
-				slave.trust += 4;
-			}
+			t += `and disobedient, ${he} is restrained to serve `;
 		}
+		t += `as a drink dispenser at mealtimes, and makes a meaningful contribution to ${his} fellow slaves' nutrition in concert with the feeding systems.`;
 	}
 
-	if (V.showVignettes == 1 && slave.assignment === Job.REST) {
+	if (V.showVignettes == 1 && (slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER)) {
 		var _vignette = GetVignette(slave);
 		t += ` __This week__ ${_vignette.text} `
 		if (_vignette.type == "cash") {
@@ -13111,201 +13016,11 @@ window.saRest = function saRest(slave) {
 	}
 
 	return t;
-}
-
-/*:: SA servant [script]*/
+};
 
-window.saServant = function saServant(slave) {
+/*:: SA stay confined [script]*/
 
-	var pronouns = getPronouns(slave);
-	var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun;
-	var He = capFirstChar(he), His = capFirstChar(his);
-	var V = State.variables;
-
-	var t = `works as a servant. ${He} performs the lowest jobs in your penthouse, cleaning up after your other slaves, bathing them, helping them dress, and giving them sexual relief.`;
-
-	if (V.servantsQuarters > 0) {
-		if ((V.universalRulesFacilityWork == 1 && slave.assignment == "be a servant" && V.servantsQuartersSpots > 0) || (slave.assignment == "work as a servant")) {
-			if (slave.assignment == "be a servant") {
-				t += ` Since there's extra space in the servants' quarters, ${V.assistantName} attaches ${him} to the cadre of maids there.`;
-				V.servantsQuartersSpots--;
-			}
-			if (V.Stewardess != 0) {
-				t += ` This brings ${him} under ${V.Stewardess.slaveName}'s supervision. The Stewardess `;
-				if (slave.devotion < -20) {
-					t += `subjects ${him} to <span class='gold'>corrective rape</span> when ${his} service is imperfect, <span class='hotpink'>when ${he} steps out of line</span>, or when the Stewardess just feels like raping ${him}, forcing the poor slave to <span class='yellowgreen'>find refuge in work.</span>`;
-					slave.devotion += 2;
-					slave.trust -= 2;
-				} else if (slave.devotion <= 20) {
-					t += `molests ${him}, encouraging the poor slave to <span class='hotpink'>keep ${his} head down</span> and <span class='yellowgreen'>work harder.</span>`;
-					slave.devotion += 2;
-				} else {
-					t += `uses <span class='hotpink'>sex as a reward</span>, getting ${him} off when ${he} <span class='yellowgreen'>works harder.</span>`;
-					slave.devotion++;
-				}
-				if (!(canHear(slave))) {
-					t += ` However, ${his} inability to hear often leaves ${him} oblivious to ${V.Stewardess.slaveName}'s orders, limiting their meaningful interactions.`;
-					V.cash += (V.stewardessBonus/4);
-				} else if ((slave.hears == -1 && slave.earwear != "hearing aids") || (slave.hears == 0 && slave.earwear == "muffling ear plugs")) {
-					t += ` However, ${he} often doesn't catch what ${V.Stewardess.slaveName} says, leading to frustration, confusion and less work done.`;
-					V.cash += (V.stewardessBonus/2);
-				} else {
-					V.cash += V.stewardessBonus;
-				}
-			}
-		}
-	}
-
-	t += ` ${He} is `;
-	if (slave.trust < -20) {
-		t += "frightened of punishment and works very hard, <span class='yellowgreen'>reducing the upkeep</span> of your slaves.";
-	} else if (slave.devotion < -20) {
-		if (slave.trust >= 20) {
-			t += `uninterested in doing such work and barely lifts a finger to <span class='yellowgreen'>reduce the upkeep</span> of your slaves.`;
-		} else {
-			t += `reluctant, requiring your other slaves to force ${his} services, and does not <span class='yellowgreen'>reduce upkeep</span> of your slaves much.`;
-		}
-	} else if (slave.devotion <= 20) {
-		t += `hesitant, requiring your other slaves to demand ${his} services, and only slightly <span class='yellowgreen'>reduces upkeep</span> of your slaves.`;
-	} else if (slave.devotion <= 50) {
-		t += `obedient, offering your other slaves ${his} services, and moderately <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`;
-	} else if (slave.devotion <= 95) {
-		t += `devoted, happily giving your other slaves ${his} services, and <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`;
-	} else {
-		t += `so happy to serve your other slaves that ${he} often sees to their needs before they know they have them, and greatly <span class='yellowgreen'>reduces the upkeep</span> of your slaves.`;
-	}
-
-	let _oral = jsRandom(5,10);
-	slave.oralCount += _oral;
-	V.oralTotal += _oral;
-
-	if (slave.relationship == -2) {
-		t += ` ${He} does ${his} best to perfect your domesticity due to ${his} emotional bond to you.`;
-	} else if (slave.relationship == -3 && slave.devotion > 50) {
-		t += ` ${He} does ${his}very best to be the perfect housewife, making ${him} an outstanding servant.`;
-	}
-
-	if (setup.servantCareers.includes(slave.career)) {
-		t += ` ${He} has experience with house keeping from ${his} life before ${he} was a slave, making ${him} more effective.`;
-	} else if (slave.skillS >= V.masteredXP) {
-		t += ` ${He} has experience with house keeping from working for you, making ${him} more effective.`;
-	} else {
-		slave.skillS += jsRandom(1,Math.ceil((slave.intelligence+slave.intelligenceImplant)/15) + 8);
-	}
-
-	if (slave.fetishStrength > 60) {
-		if (slave.fetish == "submissive" && slave.fetishKnown == 1) {
-			t += ` ${His} natural affinity for submission increases ${his} effectiveness.`;
-		} else if (slave.fetishKnown == 1 && slave.fetish == "dom") {
-			t += ` ${His} sexual appetite for domination reduces ${his} effectiveness.`;
-		}
-	}
-
-	if (slave.energy < 20) {
-		t += ` ${His} frigidity allows ${him} to ignore the intercourse all around ${him}, making ${him} very efficient.`;
-	} else if (slave.energy < 40) {
-		t += ` ${His} low sex drive keeps ${him} from becoming too distracted by the intercourse all around ${him}, making ${him} more efficient.`;
-	}
-
-	if ((slave.eyes <= -1 && slave.eyewear != "corrective glasses" && slave.eyewear != "corrective contacts") || (slave.eyewear == "blurring glasses") || (slave.eyewear == "blurring contacts")) {
-		t += ` ${His} bad vision makes ${him} a worse servant.`;
-	}
-
-	if (slave.lactation > 0) {
-		t += ` Since ${he} is lactating, `;
-		if (slave.devotion > 20 || slave.trust < -20) {
-			t += ` ${he} serves `;
-		} else {
-			t += `and disobedient, ${he} is restrained to serve `;
-		}
-		t += `as a drink dispenser at mealtimes, and makes a meaningful contribution to ${his} fellow slaves' nutrition in concert with the feeding systems.`;
-	}
-
-	if (V.showVignettes == 1 && (slave.assignment === Job.SERVANT || slave.assignment === Job.SERVER)) {
-		var _vignette = GetVignette(slave);
-		t += ` __This week__ ${_vignette.text} `
-		if (_vignette.type == "cash") {
-			if (_vignette.effect > 0) {
-				t += `<span class='yellowgreen'>making you an extra ${cashFormat(Math.trunc(V.FResult*_vignette.effect))}.</span>`;
-			} else if (_vignette.effect < 0) {
-				t += `<span class='red'>losing you ${cashFormat(Math.abs(Math.trunc(V.FResult*_vignette.effect)))}.</span>`;
-			} else {
-				t += `an incident without lasting effect.`;
-			}
-			V.cash += Math.trunc(V.FResult*_vignette.effect);
-		} else if (_vignette.type == "devotion") {
-			if (_vignette.effect > 0) {
-				if (slave.devotion > 50) {
-					t += `<span class='hotpink'>increasing ${his} devotion to you.</span>`;
-				} else if (slave.devotion >= -20) {
-					t += `<span class='hotpink'>increasing ${his} acceptance of you.</span>`;
-				} else if (slave.devotion > -10) {
-					t += `<span class='hotpink'>reducing ${his} dislike of you.</span>`;
-				} else {
-					t += `<span class='hotpink'>reducing ${his} hatred of you.</span>`;
-				}
-			} else if (_vignette.effect < 0) {
-				if (slave.devotion > 50) {
-					t += `<span class='mediumorchid'>reducing ${his} devotion to you.</span>`;
-				} else if (slave.devotion >= -20) {
-					t += `<span class='mediumorchid'>reducing ${his} acceptance of you.</span>`;
-				} else if (slave.devotion > -10) {
-					t += `<span class='mediumorchid'>increasing ${his} dislike of you.</span>`;
-				} else {
-					t += `<span class='mediumorchid'>increasing ${his} hatred of you.</span>`;
-				}
-			} else {
-				t += `an incident without lasting effect.`;
-			}
-			slave.devotion += (1*_vignette.effect);
-		} else if (_vignette.type == "trust") {
-			if (_vignette.effect > 0) {
-				if (slave.trust > 20) {
-					t += `<span class='mediumaquamarine'>increasing ${his} trust in you.</span>`;
-				} else if (slave.trust > -10) {
-					t += `<span class='mediumaquamarine'>reducing ${his} fear of you.</span>`;
-				} else {
-					t += `<span class='mediumaquamarine'>reducing ${his} terror of you.</span>`;
-				}
-			} else if (_vignette.effect < 0) {
-				if (slave.trust > 20) {
-					t += `<span class='gold'>reducing ${his} trust in you.</span>`;
-				} else if (slave.trust >= -20) {
-					t += `<span class='gold'>increasing ${his} fear of you.</span>`;
-				} else {
-					t += `<span class='gold'>increasing ${his} terror of you.</span>`;
-				}
-			} else {
-				t += `an incident without lasting effect.`;
-			}
-			slave.trust += (1*_vignette.effect);
-		} else if (_vignette.type == "health") {
-			if (_vignette.effect > 0) {
-				t += `<span class='green'>improving ${his} health.</span>`;
-			} else if (_vignette.effect < 0) {
-				t += `<span class='red'>affecting ${his} health.</span>`;
-			} else {
-				t += `an incident without lasting effect.`;
-			}
-			slave.health += (2*_vignette.effect);
-		} else {
-			if (_vignette.effect > 0) {
-				t += `<span class='green'>gaining you a bit of reputation.</span>`;
-			} else if (_vignette.effect < 0) {
-				t += `<span class='red'>losing you a bit of reputation.</span>`;
-			} else {
-				t += `an incident without lasting effect.`;
-			}
-			V.rep += Math.trunc(V.FResult*_vignette.effect*0.1);
-		}
-	}
-
-	return t;
-};
-
-/*:: SA stay confined [script]*/
-
-window.saStayConfined = function saStayConfined(slave) {
+window.saStayConfined = function saStayConfined(slave) {
 
 	var pronouns = getPronouns(slave)
 	var he = pronouns.pronoun, him = pronouns.object, his = pronouns.possessive, hers = pronouns.possessivePronoun, himself = pronouns.objectReflexive, boy = pronouns.noun
@@ -37247,7 +36962,7 @@ window.FacilityNameCleanup = function FacilityNameCleanup() {
 	V.farmyardNameCaps = V.farmyardNameCaps || "The Farmyard";
 };
 
-/*:: Beauty [script]*/
+/*:: Slave Cost JS [script]*/
 
 window.Beauty = (function() {
 	"use strict";
@@ -37310,7 +37025,7 @@ window.Beauty = (function() {
 		calcMultipliersBeauty(slave);
 		beauty = Math.max(1, Math.trunc(0.5*beauty));
 
-		V.beauty = beauty;
+		return beauty;
 	};
 
 	function calcInitBeauty(slave) {
@@ -38114,357 +37829,1085 @@ window.Beauty = (function() {
 		} else {
 			beauty += 4;
 		}
-	};
+	};
+
+	function calcFutaLawBigDickBeauty(slave) {
+		beauty += slave.dick;
+		if (slave.balls > 120) {
+			beauty += 14;
+		} else if (slave.balls > 100) {
+			beauty += 12;
+		} else if (slave.balls > 80) {
+			beauty += 10;
+		} else if (slave.balls > 60) {
+			beauty += 8;
+		} else if (slave.balls > 40) {
+			beauty += 6;
+		} else if (slave.balls > 20) {
+			beauty += 4;
+		} else if (slave.balls > 10) {
+			beauty += 2;
+		} else {
+			beauty += slave.balls;
+		}
+	};
+
+	function calcFutaLawBigBootyBeauty(slave) {
+		if (slave.hips >= 1) {
+			beauty += 4*(slave.hips - 1); /*8*/
+			if (arcology.FSSlimnessEnthusiast !== "unset") {
+				beauty += 4*(slave.hips - 1); /*8*/ /* offsets the malus for big butts */
+			}
+		}
+		if (slave.analSkill > 60 && slave.anus >= 2) {
+			beauty += 2*(slave.anus-2); /*6*/
+			if (arcology.FSSlimnessEnthusiast != "unset") {
+				beauty += 2*(slave.anus-2); /*6*/ /* offsets the malus for big butts */
+			}
+		}
+		if (slave.butt >= 5) {
+			beauty += (slave.butt - 5); /*15*/
+		}
+	};
+
+	function calcFutaLawFemboyBeauty(slave) {
+		if (arcology.FSSlimnessEnthusiast === "unset") { /*balance with slimness*/
+			beauty += 20;
+			if (slave.boobs < 300) {
+				beauty += 12;
+			} else if (slave.boobs < 400) {
+				beauty += 6;
+			}
+		}
+		if (slave.dick === 1) {
+			beauty += 12;
+		} else if (slave.dick === 2) {
+			beauty += 6;
+		}
+		if (slave.balls <= 2) {
+			beauty += 8;
+		}
+		if (slave.faceShape === "cute" && slave.face > 0) { /*uggos need not apply, maybe a small boost for other faceShapes*/
+			beauty += ((arcology.FSGenderRadicalist/25)*(slave.face/30)) - 2; /*gives a slightly better boost than androgynous does with gendrad boost, 15.3*/
+		}
+		if (slave.nipples === "tiny") {
+			beauty += 5;
+		} else if (slave.nipples === "cute") {
+			beauty += 2;
+		} else {
+			beauty -= 5;
+		}
+	};
+
+	function calcBodyProportionBeauty(slave) {
+		if (arcology.FSGenderFundamentalist !== "unset") {
+			if (slave.shoulders > slave.hips) {
+				if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) {
+					beauty -= (slave.shoulders - slave.hips)*(1 + (arcology.FSGenderFundamentalist/200));
+				}
+			}
+		} else if (arcology.FSGenderRadicalist === "unset") {
+			if (slave.shoulders > slave.hips) {
+				if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) {
+					beauty -= slave.shoulders - slave.hips;
+				}
+			}
+		}
+	};
+
+	function calcVoiceBeauty(slave) {
+		if (canTalk(slave)) {
+			if (slave.accent >= 3) {
+				beauty -= 1;
+			} else if (slave.accent === 1) {
+				beauty += 1;
+			}
+		} else {
+			beauty -= 2;
+		}
+	};
+
+	function calcLimbsBeauty(slave) {
+		switch (slave.amp) {
+			case 1:
+				beauty -= 10;
+				break;
+			case -1:
+			case -2:
+			case -4:
+				beauty -= 2;
+				break;
+		}
+	};
+
+	function calcPubertyBeauty(slave) {
+		if (slave.pubertyXX === 1) {
+			beauty += 5;
+		}
+		if (slave.pubertyXY === 0 && slave.physicalAge > V.potencyAge && slave.balls > 0) {
+			beauty += 10;
+			if (arcology.FSGenderFundamentalist !== "unset") {
+				beauty += 5;
+			}
+		}
+	};
+
+	function calcFSMiscBeauty(slave) {
+		if (arcology.FSTransformationFetishist > 20) {
+			if (slave.lips > 70) {
+				if (slave.lipsImplant/slave.lips < 0.5) {
+					beauty -= ((slave.lips/10) + (arcology.FSTransformationFetishist/20));
+				}
+			}
+			if (slave.hips === 3) {
+				beauty += 10;
+			}
+		}
+		if ((arcology.FSGenderRadicalist > 20 && arcology.FSGenderRadicalistLawFuta !== 3) || arcology.FSSlimnessEnthusiast > 20) {
+			if (slave.hips < 0) {
+				beauty += Math.abs(slave.hips);
+			}
+		}
+		if (arcology.FSPhysicalIdealist !== "unset") {
+			if (slave.height > Height.mean(slave)) {
+				beauty += 10;
+			}
+		}
+		if (arcology.FSHedonisticDecadenceLaw2 === 1) {
+			if (slave.boobs >= 2000 && slave.butt >= 5 && slave.weight > 95) {
+				beauty += 5 + (arcology.FSHedonisticDecadence/20); /*10*/
+			} else {
+				beauty -= 15 + (arcology.FSHedonisticDecadence/20); /*-20*/
+			}
+		}
+		if (arcology.FSChattelReligionistCreed === 1) {
+			if (V.nicaeaAssignment === slave.assignment) {
+				beauty += 2*V.nicaeaPower;
+			}
+		}
+	};
+
+	function calcPurityBeauty(slave) {
+		if (isPure(slave)) {
+			V.pure = V.pure++ || 1;
+			if (arcology.FSBodyPurist !== "unset") {
+				beauty += arcology.FSBodyPurist/5;
+			}
+			if (arcology.FSTransformationFetishist === "unset") {
+				beauty += 2;
+			}
+		} else if (arcology.FSTransformationFetishist !== "unset") {
+			beauty += arcology.FSTransformationFetishist/40;
+		}
+	};
+
+	function calcPhysiqueBeauty(slave) {
+		let physiquePass = 0;
+
+		if (slave.boobs < 500 && slave.butt < 3) {
+			if (slave.muscles <= 30 && arcology.FSPhysicalIdealist === "unset" && slave.weight <= 10 && arcology.FSHedonisticDecadence === "unset") {
+				physiquePass = 1;
+			} else if (arcology.FSPhysicalIdealist !== "unset") { /* no muscle malus for muscle loving societies */
+				if (arcology.FSPhysicalIdealistStrongFat === 1 && slave.weight <= 30) { /* reduced weight malus for fat loving societies */
+					physiquePass = 1;
+				} else if (slave.weight <= 10) {
+					physiquePass = 1;
+				}
+			} else if (arcology.FSHedonisticDecadence !== "unset" && slave.weight <= 30) { /* reduced weight malus for fat loving societies */
+				if (arcology.FSHedonisticDecadenceStrongFat === 1) { /* no muscle malus for muscle loving societies */
+					physiquePass = 1;
+				} else if (slave.muscles <= 30) {
+					physiquePass = 1;
+				}
+			}
+		}
+		if (physiquePass === 1) {
+			beauty += 40;
+			if (arcology.FSSlimnessEnthusiast > 20) {
+				beauty += arcology.FSSlimnessEnthusiast/20;
+				if (canTalk(slave) && slave.voice === 3) {
+					beauty += arcology.FSSlimnessEnthusiast/40;
+				}
+			}
+		} else if (slave.butt > 4 && slave.boobs > 800) {
+			if (arcology.FSSlimnessEnthusiast === "unset") {
+				beauty += 1;
+			}
+			if (arcology.FSAssetExpansionist > 20) {
+				beauty += arcology.FSAssetExpansionist/20;
+				if (canTalk(slave) && slave.voice === 3) {
+					beauty += arcology.FSAssetExpansionist/40;
+				}
+			}
+		}
+	};
+
+	function calcSlimBeauty(slave) {
+		if (slimPass(slave) === 1) {
+			beauty += 40 + (arcology.FSSlimnessEnthusiast/20); /*45*/
+		} else {
+			beauty -= arcology.FSSlimnessEnthusiast/20;
+		}
+	};
+
+	function calcGenderLawBeauty(slave) {
+		V.genderLawPass = 1;
+
+		if (arcology.FSPhysicalIdealist === "unset" && arcology.FSHedonisticDecadenceStrongFat === 0 && slave.muscles > 30) { /*muscle check*/
+			V.genderLawPass = 0;
+		} else if (arcology.FSHedonisticDecadence !== "unset" || arcology.FSPhysicalIdealistStrongFat === 1) { /*weight check*/
+			if (slave.weight > 130 || slave.weight <= -30) {
+				V.genderLawPass = 0;
+			}
+		} else if (Math.abs(slave.weight) > 30) {
+			V.genderLawPass = 0;
+		} else if (arcology.FSAssetExpansionist !== "unset") {
+			if (slave.boobs < 500 || slave.boobs > 1600 || slave.butt < 3 || slave.butt > 6) {
+				V.genderLawPass = 0;
+			}
+		} else if (slave.boobs < 500 || slave.boobs > 800 || slave.butt < 3 || slave.butt > 4) {
+			V.genderLawPass = 0;
+		}
+		if (V.genderLawPass === 1) {
+			beauty += 60;
+		} else {
+			beauty -= 10;
+		}
+	};
+
+	function calcMultipliersBeauty(slave) {
+		calcBellyBeauty(slave);
+		if (arcology.FSGenderRadicalist !== "unset") {
+			if (slave.bellyPreg >= 500 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") {
+				if (slave.mpreg === 1) {
+					beauty = 0.9*beauty;
+				} else {
+					beauty = 0.7*beauty;
+				}
+			}
+		} else if (arcology.FSGenderFundamentalist === "unset") {
+			if (slave.preg > 10 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") {
+				beauty = 0.8*beauty;
+			}
+		}
+		if (slave.breedingMark === 1) {
+			if (V.propOutcome === 1) {
+				beauty = 2*beauty;
+			} else {
+				beauty += 2;
+			}
+		}
+		if (slave.fuckdoll === 0 && V.seeAge === 1) {
+			calcAgeBeauty(slave);
+		}
+		if (slave.prestige + slave.pornPrestige > 0) {
+			calcPrestigeBeauty(slave);
+		}
+	};
+
+	function calcBellyBeauty(slave) {
+		if (slave.bellySag > 0) {
+			if (slave.belly < 100) {
+				if (arcology.FSRepopulationFocus === "unset") {
+					beauty -= 20;
+				}
+			}
+		}
+		if (slave.bellyImplant >= 1500) {
+			if (arcology.FSTransformationFetishist > 20) {
+				beauty += Math.min(Math.trunc(slave.bellyImplant/1000), 50); /*50*/
+			} else if (arcology.FSRepopulationFocus > 60) {
+				if ((slave.ovaries === 0 && slave.mpreg === 0) || slave.preg < -1) {
+					beauty += 20;
+				}
+			} else {
+				if (slave.bellyImplant >= 750000) { /* multipliers */
+					beauty = 0.2*beauty;
+				} else if (slave.bellyImplant >= 450000) {
+					beauty = 0.5*beauty;
+				} else if (slave.bellyImplant >= 300000) {
+					beauty = 0.7*beauty;
+				} else if (slave.bellyImplant >= 100000) {
+					beauty = 0.8*beauty;
+				} else if (slave.bellyImplant >= 50000) {
+					beauty = 0.85*beauty;
+				} else {
+					beauty = 0.9*beauty;
+				}
+			}
+		}
+	};
+
+	function calcAgeBeauty(slave) {
+		if (slave.physicalAge === V.minimumSlaveAge) {
+			beauty += 1;
+			if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") {
+				if (slave.birthWeek === 0) {
+					beauty += 1.6*beauty;
+				} else if (slave.birthWeek < 4) {
+					beauty += 0.2*beauty;
+				}
+			} else {
+				if (slave.birthWeek === 0) {
+					beauty += 0.8*beauty;
+				} else if (slave.birthWeek < 4) {
+					beauty += 0.1*beauty;
+				}
+			}
+		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") {
+			beauty += 1;
+			if (slave.birthWeek === 0) {
+				beauty += 0.8*beauty;
+			} else if (slave.birthWeek < 4) {
+				beauty += 0.1*beauty;
+			}
+		}
+	};
+
+	function calcPrestigeBeauty(slave) { /* multipliers */
+		if (slave.prestige >= 3) {
+			beauty += 2*beauty;
+		} else if (slave.prestige === 2) {
+			beauty += 0.5*beauty;
+		} else if (slave.prestige === 1) {
+			beauty += 0.25*beauty;
+		}
+		if (slave.pornPrestige === 3) {
+			beauty += beauty;
+		} else if (slave.pornPrestige === 2) {
+			beauty += 0.5*beauty;
+		} else if (slave.pornPrestige === 1) {
+			beauty += 0.1*beauty;
+		}
+	};
+
+	return Beauty;
+})();
+
+// this is a port of the FResult widget
+// it has been broken up into several functions, because it grew too long
+// it has been wrapped in a closure so as not to pollute the global namespace
+// and so that nested functions are only evaluated once
+
+window.FResult = (function() {
+	"use strict";
+	// we can't initialise our global variables on load, because SugarCube.State isn't initialised
+	// instead, declare them and initialise on run time
+	let V, result, incest_bonus;
+	function FResult(slave) {
+		V = State.variables;
+		incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1;
+
+		calcUseWeights(slave);
+		if (!slave.fuckdoll)
+			calcNotFuckdoll(slave);
+		else
+			result += slave.fuckdoll/10;
+
+		result += Math.max(0, slave.aphrodisiacs) * 2;
+
+		if (slave.inflationType === "aphrodisiac")
+			result += slave.inflation*4;
+
+		if (slave.lactation > 0)
+			result += 1;
+
+		if (slave.nipples === "fuckable")
+			calcFuckableTits(slave);
+
+		if (V.seeAge === 1)
+			calcAge(slave);
+		if (slave.fetish === "mindbroken")
+			result = Math.trunc(result*0.4);
+		else
+			result = Math.trunc(result*0.7);
+
+		if (slave.pregWeek < 0)
+			result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth
+
+		calcAmputation(slave);
+
+		if (V.arcologies[0].FSHedonisticDecadence > 20)
+			calcHedonismWeight(slave);
+		if (result < 2) {
+			if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20)
+				result = 0;
+			else
+				result = 2;
+		}
+		return result;
+	}
+
+	function calcUseWeights(slave) {
+		result = (3 - slave.anus)+(slave.muscles/30);
+		if (slave.muscles < -95)
+			result -= 5;
+		else if (slave.muscles < -30)
+			result -= 2;
+
+		const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight;
+		if (uses <= 0) return;
+
+		result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30);
+		if (slave.sexualFlaw === "cum addict")
+			result += (V.oralUseWeight/uses) * (slave.oralSkill/30);
+		if (canDoVaginal(slave)) {
+			result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30);
+			result += (3 - slave.vagina);
+			result += slave.vaginaLube;
+		}
+		if (canDoAnal(slave)) {
+			result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30);
+			if (slave.sexualFlaw === "anal addict")
+				result += (V.analUseWeight/uses) * (slave.analSkill/30);
+			if (slave.inflationType === "aphrodisiac")
+				result += (V.analUseWeight/uses) * (slave.inflation * 3);
+		}
+	}
+
+	function calcFuckableTits(slave) {
+		result += 2;
+		if (slave.fetish === "boobs")
+			result += Math.trunc(slave.fetishStrength/20);
+	}
+
+	function calcWorksWithRelatives(slave) {
+		V.slaves.forEach(islave => {
+			if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) {
+				result += 1;
+				if (incest_bonus) result += 1;
+			}
+			if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) {
+				result += 1;
+				if (incest_bonus) result += 1;
+			}
+		});
+	}
+
+	function calcWorksWithRelativesVanilla(slave) {
+		const fre = getSlave(slave.relationTarget);
+		if (fre !== undefined && sameAssignmentP(slave, fre)) {
+			result += 2;
+			if (incest_bonus) result += 2;
+		}
+	}
+
+	function calcWorksWithRelationship(slave) {
+		const fre = V.slaves.findIndex(s => {
+			return haveRelationshipP(slave, s) && sameAssignmentP(slave, s);
+		});
+		if (fre !== -1) result += 1;
+	}
+
+	function calcWorksWithRival(slave) {
+		const en = getSlave(slave.rivalryTarget);
+		if (en !== undefined && sameAssignmentP(slave, en)) result -= 1;
+	}
+
+	function calcHInjectionsDiet(slave) {
+		if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections")
+			result -= 10;
+		if (slave.diet === "XXY")
+			result += 2;
+		else if (slave.diet === "XY" || slave.diet === "XX")
+			result += 1;
+		else if (slave.diet === "cum production")
+			result += 1;
+		else if (slave.diet === "fertility")
+			result += 1;
+	}
+	function calcPreg(slave) {
+		if (V.arcologies[0].FSRepopulationFocus > 20) {
+			if (slave.preg > 10) result += 2;
+			else result -= 2;
+		} else if (V.arcologies[0].FSRestart > 20) {
+			if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1)
+				result += 1;
+			else if (slave.preg > 10)
+				result -= 10;
+			else
+				result += 0;
+		}
+	}
 
-	function calcFutaLawBigDickBeauty(slave) {
-		beauty += slave.dick;
-		if (slave.balls > 120) {
-			beauty += 14;
-		} else if (slave.balls > 100) {
-			beauty += 12;
-		} else if (slave.balls > 80) {
-			beauty += 10;
-		} else if (slave.balls > 60) {
-			beauty += 8;
-		} else if (slave.balls > 40) {
-			beauty += 6;
-		} else if (slave.balls > 20) {
-			beauty += 4;
-		} else if (slave.balls > 10) {
-			beauty += 2;
-		} else {
-			beauty += slave.balls;
-		}
-	};
+	function calcRace(slave) {
+		if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave))
+			result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10);
+		if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave))
+			result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME);
+	}
 
-	function calcFutaLawBigBootyBeauty(slave) {
-		if (slave.hips >= 1) {
-			beauty += 4*(slave.hips - 1); /*8*/
-			if (arcology.FSSlimnessEnthusiast !== "unset") {
-				beauty += 4*(slave.hips - 1); /*8*/ /* offsets the malus for big butts */
-			}
-		}
-		if (slave.analSkill > 60 && slave.anus >= 2) {
-			beauty += 2*(slave.anus-2); /*6*/
-			if (arcology.FSSlimnessEnthusiast != "unset") {
-				beauty += 2*(slave.anus-2); /*6*/ /* offsets the malus for big butts */
-			}
+	function calcSexAttributes(slave) {
+		if (slave.clitPiercing > 2) result += 1;
+		if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none")
+			result += slave.fetishStrength/5;
+
+		if (slave.attrKnown === 1) {
+			result += Math.trunc(slave.attrXX/20);
+			result += Math.trunc(slave.attrXY/20);
+			if (slave.energy > 95) result += 3;
+			else if (slave.energy > 80) result += 2;
+			else if (slave.energy > 60) result += 1;
+			else if (slave.energy <= 20) result -= 2;
+			else if (slave.energy <= 40) result -= 1;
 		}
-		if (slave.butt >= 5) {
-			beauty += (slave.butt - 5); /*15*/
+		if (slave.sexualFlaw !== "none") result -= 2;
+		if (slave.sexualQuirk !== "none") result += 2;
+		if (slave.behavioralFlaw !== "none") result -= 2;
+		if (slave.behavioralQuirk !== "none") result += 2;
+	}
+
+	function calcCareer(slave) {
+		if (setup.whoreCareers.includes(slave.career))
+			result += 1;
+		else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000)
+			result += 1;
+	}
+
+	function calcSight(slave) {
+		if (!canSee(slave)) result -= 3;
+		else if (slave.eyes <= -1) {
+			if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts")
+				result -= 1;
+		} else if (slave.eyewear === "blurring glasses")
+			result -= 1;
+		else if (slave.eyewear === "blurring contacts")
+			result -= 1;
+	}
+
+	function calcHearing(slave) {
+		if (!canHear(slave)) result -= 2;
+		else if (slave.hears <= -1) {
+			if (slave.earwear !== "hearing aids")
+				result -= 1;
+		} else if (slave.earwear === "muffling ear plugs")
+			result -= 1;
+	}
+
+	function calcEgyptianBonus(slave) {
+		if (V.racialVarieties === undefined) V.racialVarieties = [];
+		if (!V.racialVarieties.includes(slave.race))
+			V.racialVarieties.push(slave.race);
+	}
+
+	function calcYouthBonus(slave) {
+		if (slave.visualAge < 30) {
+			if (slave.actualAge > 30)
+				result += 5; // experienced for her apparent age
+			if (slave.physicalAge > 30)
+				result -= slave.physicalAge/2; // too old :(
 		}
-	};
+	}
 
-	function calcFutaLawFemboyBeauty(slave) {
-		if (arcology.FSSlimnessEnthusiast === "unset") { /*balance with slimness*/
-			beauty += 20;
-			if (slave.boobs < 300) {
-				beauty += 12;
-			} else if (slave.boobs < 400) {
-				beauty += 6;
-			}
+	function calcMatureBonus(slave) {
+		if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge)
+			result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit
+	}
+
+	function calcNotFuckdoll(slave) {
+		if (V.familyTesting === 1 && totalRelatives(slave) > 0)
+			calcWorksWithRelatives(slave);
+		else if(!V.familyTesting && slave.relation !==0)
+			calcWorksWithRelativesVanilla(slave);
+		if (slave.relationship > 0) calcWorksWithRelationship(slave);
+		if (slave.rivalry !== 0) calcWorksWithRival(slave);
+		calcHInjectionsDiet(slave);
+		calcPreg(slave);
+		calcRace(slave);
+		calcSexAttributes(slave);
+		calcCareer(slave);
+		calcSight(slave);
+		calcHearing(slave);
+		if (V.arcologies[0].FSEgyptianRevivalist !== "unset")
+			calcEgyptianBonus(slave);
+		if (V.arcologies[0].FSYouthPreferentialist !== "unset")
+			calcYouthBonus(slave);
+		else if (V.arcologies[0].FSMaturityPreferentialist !== "unset")
+			calcMatureBonus(slave);
+	}
+
+	function calcAge(slave) {
+		if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) {
+			result += 1;
+			if (slave.birthWeek === 0) result += result;
+			else if (slave.birthWeek < 4) result += 0.2*result;
+		} else if (slave.physicalAge === V.minimumSlaveAge) {
+			result += 1;
+			if (slave.birthWeek === 0 ) result += 0.5*result;
+			else if (slave.birthWeek < 4) result += 0.1*result;
+		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) {
+			result += 1;
+			if (slave.birthWeek === 0)
+				result += 0.5*result;
+			else if (slave.birthWeek < 4)
+				result += 0.1*result;
 		}
-		if (slave.dick === 1) {
-			beauty += 12;
-		} else if (slave.dick === 2) {
-			beauty += 6;
+	}
+
+	function calcAmputation(slave) {
+		switch(slave.amp) {
+		case 0:
+		case -2:
+		case -5:
+			break;
+		case 1:
+			result -= 2;
+			break;
+		default:
+			result -= 1;
 		}
-		if (slave.balls <= 2) {
-			beauty += 8;
+	}
+
+	function calcHedonismWeight(slave) {
+		if (slave.weight < 10)
+			result -= 2;
+		else if (slave.weight > 190)
+			result -= 5; // too fat
+	}
+	return FResult;
+})();
+
+window.slaveCost = (function() {
+	"use strict";
+	let V, arcology, multiplier, cost;
+
+	function slaveCost(slave, isStartingSlave) {
+		V = State.variables;
+		arcology = V.arcologies[0];
+		multiplier = V.slaveCostFactor;
+		cost = Beauty(slave)*FResult(slave);
+
+		calcGenitalsCost(slave);
+		calcDevotionTrustCost(slave);
+		calcPreferencesCost(slave);
+		calcPregCost(slave);
+		if (slave.prestige + slave.pornPrestige > 0) {
+			calcPrestigeCost(slave);
 		}
-		if (slave.faceShape === "cute" && slave.face > 0) { /*uggos need not apply, maybe a small boost for other faceShapes*/
-			beauty += ((arcology.FSGenderRadicalist/25)*(slave.face/30)) - 2; /*gives a slightly better boost than androgynous does with gendrad boost, 15.3*/
+		calcFSCost(slave);
+		if (V.seeAge === 1) {
+			calcAgeCost(slave);
 		}
-		if (slave.nipples === "tiny") {
-			beauty += 5;
-		} else if (slave.nipples === "cute") {
-			beauty += 2;
-		} else {
-			beauty -= 5;
+		calcCareersCost(slave);
+		calcMiscCost(slave);
+		calcIndentureCost(slave); /* multipliers */
+		
+		calcCost(slave);
+		if (isStartingSlave) {
+			calcStartingSlaveCost(slave);
 		}
+		return cost;
 	};
 
-	function calcBodyProportionBeauty(slave) {
-		if (arcology.FSGenderFundamentalist !== "unset") {
-			if (slave.shoulders > slave.hips) {
-				if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) {
-					beauty -= (slave.shoulders - slave.hips)*(1 + (arcology.FSGenderFundamentalist/200));
+	function calcGenitalsCost(slave) {
+		if (slave.vagina === 0) {
+			multiplier += 0.1;
+		}
+		if (slave.vagina > -1 && arcology.FSRestartSMR === 1) {
+			if (slave.dick > 0) {
+				if (slave.ovaries === 0 && slave.balls === 0) {
+					multiplier += 0.8;
 				}
 			}
-		} else if (arcology.FSGenderRadicalist === "unset") {
-			if (slave.shoulders > slave.hips) {
-				if (slave.boobs <= 2000*(slave.shoulders - slave.hips)) {
-					beauty -= slave.shoulders - slave.hips;
+		} else if (slave.vagina > -1) {
+			if (slave.dick > 0) {
+				if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === 0) {
+					multiplier += 0.2;
+					if (slave.ovaries > 0) {
+						if (slave.balls > 0) {
+							multiplier += 0.8;
+						}
+					}
+				} else {
+					multiplier += 0.1;
+					if (slave.ovaries > 0) {
+						if (slave.balls > 0) {
+							multiplier += 0.2;
+						}
+					}
 				}
 			}
 		}
 	};
 
-	function calcVoiceBeauty(slave) {
-		if (canTalk(slave)) {
-			if (slave.accent >= 3) {
-				beauty -= 1;
-			} else if (slave.accent === 1) {
-				beauty += 1;
+	function calcDevotionTrustCost(slave) {
+		if (V.specialSlavesPriceOverride === 1) {
+			if (slave.devotion > 50) {
+				multiplier += slave.devotion/200;
+			}
+			if (slave.trust > 50) {
+				multiplier += slave.trust/200;
 			}
 		} else {
-			beauty -= 2;
-		}
-	};
-
-	function calcLimbsBeauty(slave) {
-		switch (slave.amp) {
-			case 1:
-				beauty -= 10;
-				break;
-			case -1:
-			case -2:
-			case -4:
-				beauty -= 2;
-				break;
-		}
-	};
-
-	function calcPubertyBeauty(slave) {
-		if (slave.pubertyXX === 1) {
-			beauty += 5;
-		}
-		if (slave.pubertyXY === 0 && slave.physicalAge > V.potencyAge && slave.balls > 0) {
-			beauty += 10;
-			if (arcology.FSGenderFundamentalist !== "unset") {
-				beauty += 5;
+			multiplier += slave.devotion/200;
+			if (slave.devotion < -20) {
+				if (slave.trust > 0) {
+					multiplier -= slave.trust/200;
+				}
+			} else {
+				if (slave.trust > 0) {
+					multiplier += slave.trust/200;
+				}
 			}
 		}
 	};
 
-	function calcFSMiscBeauty(slave) {
-		if (arcology.FSTransformationFetishist > 20) {
-			if (slave.lips > 70) {
-				if (slave.lipsImplant/slave.lips < 0.5) {
-					beauty -= ((slave.lips/10) + (arcology.FSTransformationFetishist/20));
-				}
-			}
-			if (slave.hips === 3) {
-				beauty += 10;
-			}
+	function calcPreferencesCost(slave) {
+		if (slave.behavioralFlaw !== "none") {
+			multiplier -= 0.1;
 		}
-		if ((arcology.FSGenderRadicalist > 20 && arcology.FSGenderRadicalistLawFuta !== 3) || arcology.FSSlimnessEnthusiast > 20) {
-			if (slave.hips < 0) {
-				beauty += Math.abs(slave.hips);
-			}
+		if (slave.behavioralQuirk !== "none") {
+			multiplier += 0.1;
 		}
-		if (arcology.FSPhysicalIdealist !== "unset") {
-			if (slave.height > Height.mean(slave)) {
-				beauty += 10;
-			}
+		if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") {
+			multiplier += 0.3;
+		} else if (slave.sexualFlaw !== "none") {
+			multiplier -= 0.1;
 		}
-		if (arcology.FSHedonisticDecadenceLaw2 === 1) {
-			if (slave.boobs >= 2000 && slave.butt >= 5 && slave.weight > 95) {
-				beauty += 5 + (arcology.FSHedonisticDecadence/20); /*10*/
-			} else {
-				beauty -= 15 + (arcology.FSHedonisticDecadence/20); /*-20*/
+		if (slave.sexualQuirk !== "none") {
+			multiplier += 0.1;
+		}
+		if (slave.fetishKnown === 1) {
+			if (slave.fetish === "mindbroken") {
+				multiplier -= 0.3;
+			} else if (slave.fetish !== "none") {
+				multiplier += slave.fetishStrength/1000;
 			}
+		} else {
+			multiplier -= 0.1;
 		}
-		if (arcology.FSChattelReligionistCreed === 1) {
-			if (V.nicaeaAssignment === slave.assignment) {
-				beauty += 2*V.nicaeaPower;
+		if (slave.attrKnown === 1) {
+			if (slave.energy > 95) {
+				multiplier += 0.2;
 			}
 		}
 	};
 
-	function calcPurityBeauty(slave) {
-		if (isPure(slave)) {
-			V.pure = V.pure++ || 1;
-			if (arcology.FSBodyPurist !== "unset") {
-				beauty += arcology.FSBodyPurist/5;
+	function calcPregCost(slave) {
+		if (slave.mpreg === 1) {
+			multiplier += 0.2;
+		}
+		if (arcology.FSRepopulationFocusSMR === 1) {
+			if (slave.preg < -1) {
+				multiplier -= 0.5;
+			} else if (slave.bellyPreg >= 300000) {
+				multiplier += 1;
+			} else if (slave.bellyPreg >= 120000) {
+				multiplier += 0.5;
+			} else if (slave.preg > 10) {
+				multiplier += 0.1;
 			}
-			if (arcology.FSTransformationFetishist === "unset") {
-				beauty += 2;
+		} else if (arcology.FSRestartSMR === 1) {
+			if (slave.preg < -1) {
+				multiplier += 0.5;
+			} else if (slave.bellyPreg >= 300000) {
+				multiplier -= 2.5;
+			} else if (slave.bellyPreg >= 30000) {
+				multiplier -= 1.5;
+			} else if (slave.preg > 10) {
+				multiplier -= 1.0;
+			}
+		} else {
+			if (slave.preg < -1) {
+				multiplier -= 0.1;
+			} else if (V.activeSlave.bellyPreg >= 300000) {
+				multiplier -= 1.5;
+			} else if (V.activeSlave.bellyPreg >= 120000) {
+				multiplier -= 0.5;
+			} else if (slave.preg > 10) {
+				multiplier -= 0.1;
 			}
-		} else if (arcology.FSTransformationFetishist !== "unset") {
-			beauty += arcology.FSTransformationFetishist/40;
 		}
 	};
 
-	function calcPhysiqueBeauty(slave) {
-		let physiquePass = 0;
+	function calcPrestigeCost(slave) {
+		if (slave.prestige > 0) {
+			multiplier += 0.7*slave.prestige;
+		}
+		if (slave.pornPrestige === 3) {
+			multiplier += 1.5;
+		} else if (slave.pornPrestige === 2) {
+			multiplier += 0.7;
+		} else if (slave.pornPrestige === 1) {
+			multiplier += 0.2;
+		}
+	};
 
-		if (slave.boobs < 500 && slave.butt < 3) {
-			if (slave.muscles <= 30 && arcology.FSPhysicalIdealist === "unset" && slave.weight <= 10 && arcology.FSHedonisticDecadence === "unset") {
-				physiquePass = 1;
-			} else if (arcology.FSPhysicalIdealist !== "unset") { /* no muscle malus for muscle loving societies */
-				if (arcology.FSPhysicalIdealistStrongFat === 1 && slave.weight <= 30) { /* reduced weight malus for fat loving societies */
-					physiquePass = 1;
-				} else if (slave.weight <= 10) {
-					physiquePass = 1;
-				}
-			} else if (arcology.FSHedonisticDecadence !== "unset" && slave.weight <= 30) { /* reduced weight malus for fat loving societies */
-				if (arcology.FSHedonisticDecadenceStrongFat === 1) { /* no muscle malus for muscle loving societies */
-					physiquePass = 1;
-				} else if (slave.muscles <= 30) {
-					physiquePass = 1;
-				}
+	function calcFSCost(slave) {
+		if (arcology.FSSupremacistLawME !== 0) {
+			if (slave.race !== arcology.FSSupremacistRace) {
+				multiplier -= 0.1;
 			}
 		}
-		if (physiquePass === 1) {
-			beauty += 40;
-			if (arcology.FSSlimnessEnthusiast > 20) {
-				beauty += arcology.FSSlimnessEnthusiast/20;
-				if (canTalk(slave) && slave.voice === 3) {
-					beauty += arcology.FSSlimnessEnthusiast/40;
-				}
+		if (arcology.FSSubjugationistLawME !== 0) {
+			if (slave.race === arcology.FSSubjugationistRace) {
+				multiplier -= 0.2;
 			}
-		} else if (slave.butt > 4 && slave.boobs > 800) {
-			if (arcology.FSSlimnessEnthusiast === "unset") {
-				beauty += 1;
+		}
+		if (arcology.FSRepopulationFocusSMR !== 0) {
+			if (slave.preg > 0) {
+				multiplier += 0.1;
 			}
-			if (arcology.FSAssetExpansionist > 20) {
-				beauty += arcology.FSAssetExpansionist/20;
-				if (canTalk(slave) && slave.voice === 3) {
-					beauty += arcology.FSAssetExpansionist/40;
-				}
+		} else if (arcology.FSRestartSMR !== 0) {
+			if (slave.dick > 0) {
+				multiplier -= 0.1;
+			}
+			if (slave.balls > 0) {
+				multiplier -= 0.2;
+			}
+			if (slave.vagina > 0) {
+				multiplier -= 0.1;
+			}
+			if (slave.ovaries > 0) {
+				multiplier -= 0.5;
 			}
 		}
-	};
-
-	function calcSlimBeauty(slave) {
-		if (slimPass(slave) === 1) {
-			beauty += 40 + (arcology.FSSlimnessEnthusiast/20); /*45*/
-		} else {
-			beauty -= arcology.FSSlimnessEnthusiast/20;
+		if (arcology.FSGenderFundamentalistSMR !== 0) {
+			if (slave.dick > 0) {
+				multiplier -= 0.1;
+			}
+			if (slave.balls > 0) {
+				multiplier -= 0.1;
+			}
+		} else if (arcology.FSGenderRadicalist !== "unset") {
+			if (slave.dick > 0) {
+				multiplier += 0.1;
+			}
+			if (slave.balls > 0) {
+				multiplier -= 0.1;
+			}
+		}
+		if (arcology.FSHedonisticDecadenceSMR !== 0) {
+			if (slave.weight > 60 && slave.muscles < 5) {
+				multiplier += 0.1;
+			}
+		}
+		if (arcology.FSArabianRevivalist > 50) {
+			multiplier += 0.1;
 		}
 	};
 
-	function calcGenderLawBeauty(slave) {
-		V.genderLawPass = 1;
-
-		if (arcology.FSPhysicalIdealist === "unset" && arcology.FSHedonisticDecadenceStrongFat === 0 && slave.muscles > 30) { /*muscle check*/
-			V.genderLawPass = 0;
-		} else if (arcology.FSHedonisticDecadence !== "unset" || arcology.FSPhysicalIdealistStrongFat === 1) { /*weight check*/
-			if (slave.weight > 130 || slave.weight <= -30) {
-				V.genderLawPass = 0;
+	function calcAgeCost(slave) {
+		if (slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
+			if (slave.birthWeek === 0) {
+				multiplier -= 0.4;
+			} else if (slave.birthWeek < 4) {
+				multiplier -= 0.1;
 			}
-		} else if (Math.abs(slave.weight) > 30) {
-			V.genderLawPass = 0;
-		} else if (arcology.FSAssetExpansionist !== "unset") {
-			if (slave.boobs < 500 || slave.boobs > 1600 || slave.butt < 3 || slave.butt > 6) {
-				V.genderLawPass = 0;
+		} else if (slave.physicalAge === V.minimumSlaveAge) {
+			if (slave.birthWeek === 0) {
+				multiplier -= 0.2;
+			} else if (slave.birthWeek < 4) {
+				multiplier -= 0.05;
+			}
+		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
+			if (slave.birthWeek === 0) {
+				multiplier -= 0.2;
+			} else if (slave.birthWeek < 4) {
+				multiplier -= 0.05;
 			}
-		} else if (slave.boobs < 500 || slave.boobs > 800 || slave.butt < 3 || slave.butt > 4) {
-			V.genderLawPass = 0;
 		}
-		if (V.genderLawPass === 1) {
-			beauty += 60;
-		} else {
-			beauty -= 10;
+	};
+
+	function calcCareersCost() {
+		if (slave.career !== 0) {
+			if (slave.career === "a slave") {
+				multiplier += 0.1;
+			} else if (setup.bodyguardCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.wardenessCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.attendantCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.matronCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.schoolteacherCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.stewardessCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.milkmaidCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.farmerCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.madamCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.DJCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.HGCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.recruiterCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.entertainmentCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.whoreCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.gratefulCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.menialCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.servantCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			}
+		}
+		if (V.week-slave.weekAcquired >= 20 && slave.entertainSkill >= 100) {
+			if (!setup.entertainmentCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			}
+		}
+		if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) {
+			if (!setup.whoreCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			}
+		}
+		if (!setup.bodyguardCareers.includes(slave.career) && slave.skillBG >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.wardenessCareers.includes(slave.career) && slave.skillWA >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.attendantCareers.includes(slave.career) && slave.skillAT >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.matronCareers.includes(slave.career) && slave.skillMT >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.schoolteacherCareers.includes(slave.career) && slave.skillTE >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.stewardessCareers.includes(slave.career) && slave.skillST >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.milkmaidCareers.includes(slave.career) && slave.skillMM >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.farmerCareers.includes(slave.career) && slave.skillFA >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.madamCareers.includes(slave.career) && slave.skillMD >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.DJCareers.includes(slave.career) && slave.skillDJ >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.HGCareers.includes(slave.career) && slave.skillHG >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.recruiterCareers.includes(slave.career) && slave.skillRC >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.servantCareers.includes(slave.career) && slave.skillS >= V.masteredXP) {
+			multiplier += 0.05;
+		}
+		if (!setup.entertainmentCareers.includes(slave.career) && slave.skillE >= V.masteredXP) {
+			multiplier += 0.05;
+		}
+		if (!setup.whoreCareers.includes(slave.career) && slave.skillW >= V.masteredXP) {
+			multiplier += 0.05;
 		}
 	};
 
-	function calcMultipliersBeauty(slave) {
-		calcBellyBeauty(slave);
-		if (arcology.FSGenderRadicalist !== "unset") {
-			if (slave.bellyPreg >= 500 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") {
-				if (slave.mpreg === 1) {
-					beauty = 0.9*beauty;
-				} else {
-					beauty = 0.7*beauty;
-				}
-			}
-		} else if (arcology.FSGenderFundamentalist === "unset") {
-			if (slave.preg > 10 && arcology.FSRepopulationFocus === "unset" && arcology.FSRestart === "unset") {
-				beauty = 0.8*beauty;
-			}
+	function calcMiscCost(slave) {	
+		let totalInt = Math.clamp(slave.intelligence + slave.intelligenceImplant,-130,130); /* make absolutely certain we do not use +-131 in the next line */
+		multiplier += Math.floor((Math.asin(totalInt/131))*50)/50;
+		if (slave.pubertyXY === 0 && slave.physicalAge >= V.potencyAge && slave.genes === "XY" && arcology.FSGenderRadicalist === "unset") {
+			multiplier += 0.5;
 		}
-		if (slave.breedingMark === 1) {
-			if (V.propOutcome === 1) {
-				beauty = 2*beauty;
-			} else {
-				beauty += 2;
+		if (slave.brand !== 0) {
+			if (V.rep > 10000) {
+				multiplier += 0.1;
+			} else if (V.rep < 5000) {
+				multiplier -= 0.1;
 			}
 		}
-		if (slave.fuckdoll === 0 && V.seeAge === 1) {
-			calcAgeBeauty(slave);
+		if (slave.amp === 1) {
+			multiplier -= 0.2;
 		}
-		if (slave.prestige + slave.pornPrestige > 0) {
-			calcPrestigeBeauty(slave);
+		if (slave.eyes === -2) {
+			multiplier -= 0.2;
 		}
 	};
 
-	function calcBellyBeauty(slave) {
-		if (slave.bellySag > 0) {
-			if (slave.belly < 100) {
-				if (arcology.FSRepopulationFocus === "unset") {
-					beauty -= 20;
-				}
+	function calcIndentureCost(slave) {
+		if (slave.indenture > -1) {
+			multiplier -= 0.1*slave.indentureRestrictions;
+			multiplier -= (260-slave.indenture)/260;
+		} else if (V.seeAge === 1) {
+			if (slave.actualAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy !== 1) {
+				multiplier *= (V.retirementAge-slave.actualAge)/5;
 			}
-		}
-		if (slave.bellyImplant >= 1500) {
-			if (arcology.FSTransformationFetishist > 20) {
-				beauty += Math.min(Math.trunc(slave.bellyImplant/1000), 50); /*50*/
-			} else if (arcology.FSRepopulationFocus > 60) {
-				if ((slave.ovaries === 0 && slave.mpreg === 0) || slave.preg < -1) {
-					beauty += 20;
-				}
-			} else {
-				if (slave.bellyImplant >= 750000) { /* multipliers */
-					beauty = 0.2*beauty;
-				} else if (slave.bellyImplant >= 450000) {
-					beauty = 0.5*beauty;
-				} else if (slave.bellyImplant >= 300000) {
-					beauty = 0.7*beauty;
-				} else if (slave.bellyImplant >= 100000) {
-					beauty = 0.8*beauty;
-				} else if (slave.bellyImplant >= 50000) {
-					beauty = 0.85*beauty;
-				} else {
-					beauty = 0.9*beauty;
-				}
+			if (slave.physicalAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy === 1) {
+				multiplier *= (V.retirementAge-slave.actualAge)/5;
 			}
 		}
 	};
 
-	function calcAgeBeauty(slave) {
-		if (slave.physicalAge === V.minimumSlaveAge) {
-			beauty += 1;
-			if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") {
-				if (slave.birthWeek === 0) {
-					beauty += 1.6*beauty;
-				} else if (slave.birthWeek < 4) {
-					beauty += 0.2*beauty;
-				}
-			} else {
-				if (slave.birthWeek === 0) {
-					beauty += 0.8*beauty;
-				} else if (slave.birthWeek < 4) {
-					beauty += 0.1*beauty;
-				}
-			}
-		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset") && arcology.FSRestart === "unset") {
-			beauty += 1;
-			if (slave.birthWeek === 0) {
-				beauty += 0.8*beauty;
-			} else if (slave.birthWeek < 4) {
-				beauty += 0.1*beauty;
-			}
+	function calcCost(slave) {
+		cost *= multiplier*50;
+		cost = Number(cost) || 0;
+		if (cost < V.minimumSlaveCost) {
+			cost = V.minimumSlaveCost;
+		} else if (cost <= 100000) {
+			/* do nothing */
+		} else if (cost <= 200000) {
+			cost -= (cost-100000)*0.1;
+		} else if (cost <= 300000) {
+			cost -= 10000 + ((cost-200000)*0.2);
+		} else if (cost <= 400000) {
+			cost -= 30000 + ((cost-300000)*0.3);
+		} else if (cost <= 500000) {
+			cost -= 60000 + ((cost-400000)*0.4);
+		} else {
+			cost -= 100000 + ((cost-500000)*0.5);
 		}
+		if (cost < 1000) {
+			cost = 1000;
+		}
+		cost = 500*Math.trunc(cost/500);
 	};
 
-	function calcPrestigeBeauty(slave) { /* multipliers */
-		if (slave.prestige >= 3) {
-			beauty += 2*beauty;
-		} else if (slave.prestige === 2) {
-			beauty += 0.5*beauty;
-		} else if (slave.prestige === 1) {
-			beauty += 0.25*beauty;
+	function calcStartingSlaveCost(slave) {
+		let startingSlaveMultiplier = 0;
+
+		if (slave.devotion > 20) {
+			startingSlaveMultiplier += (0.000117*(slave.devotion-20)*(slave.devotion-20))+(0.003167*(slave.devotion-20));
 		}
-		if (slave.pornPrestige === 3) {
-			beauty += beauty;
-		} else if (slave.pornPrestige === 2) {
-			beauty += 0.5*beauty;
-		} else if (slave.pornPrestige === 1) {
-			beauty += 0.1*beauty;
+		if (slave.whoreSkill) {
+			startingSlaveMultiplier += 0.00001*slave.whoreSkill*slave.whoreSkill;
+		}
+		if (slave.entertainSkill) {
+			startingSlaveMultiplier += 0.00001*slave.entertainSkill*slave.entertainSkill;
+		}
+		if (slave.vaginalSkill) {
+			startingSlaveMultiplier += 0.00001*slave.vaginalSkill*slave.vaginalSkill;
+		}
+		if (slave.analSkill) {
+			startingSlaveMultiplier += 0.00001*slave.analSkill*slave.analSkill;
+		}
+		if (slave.oralSkill) {
+			startingSlaveMultiplier += 0.00001*slave.oralSkill*slave.oralSkill;
+		}
+		if (slave.combatSkill) {
+			startingSlaveMultiplier += 0.1;
+		}
+		if (slave.prestige) {
+			startingSlaveMultiplier += slave.prestige;
+		}
+		if (startingSlaveMultiplier) {
+			if (slave.actualAge > 25) {
+				startingSlaveMultiplier -= startingSlaveMultiplier*(slave.actualAge-25)*0.05;
+			}
+		}
+		startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10);
+		cost += cost*startingSlaveMultiplier;
+		cost = 500*Math.trunc(cost/500);
+		if (V.PC.career === "slaver") {
+			cost = cost/2;
 		}
 	};
 
-	return Beauty;
+	return slaveCost;
 })();
+
+window.startingSlaveCost = function startingSlaveCost(slave) {
+	return slaveCost(slave, true);
+};
diff --git a/src/js/fresult.tw b/src/js/fresult.tw
deleted file mode 100644
index bcb29ff23f0c8c506bc79f99369fdf79f38db719..0000000000000000000000000000000000000000
--- a/src/js/fresult.tw
+++ /dev/null
@@ -1,284 +0,0 @@
-:: FResult [script]
-
-// this is a port of the FResult widget
-// it has been broken up into several functions, because it grew too long
-// it has been wrapped in a closure so as not to pollute the global namespace
-// and so that nested functions are only evaluated once
-
-window.FResult = (function() {
-	"use strict";
-	// we can't initialise our global variables on load, because SugarCube.State isn't initialised
-	// instead, declare them and initialise on run time
-	let V, result, incest_bonus;
-	function FResult(slave) {
-		V = State.variables;
-		incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1;
-
-		calcUseWeights(slave);
-		if (!slave.fuckdoll)
-			calcNotFuckdoll(slave);
-		else
-			result += slave.fuckdoll/10;
-
-		result += Math.max(0, slave.aphrodisiacs) * 2;
-
-		if (slave.inflationType === "aphrodisiac")
-			result += slave.inflation*4;
-
-		if (slave.lactation > 0)
-			result += 1;
-
-		if (slave.nipples === "fuckable")
-			calcFuckableTits(slave);
-
-		if (V.seeAge === 1)
-			calcAge(slave);
-		if (slave.fetish === "mindbroken")
-			result = Math.trunc(result*0.4);
-		else
-			result = Math.trunc(result*0.7);
-
-		if (slave.pregWeek < 0)
-			result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth
-
-		calcAmputation(slave);
-
-		if (V.arcologies[0].FSHedonisticDecadence > 20)
-			calcHedonismWeight(slave);
-		if (result < 2) {
-			if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20)
-				result = 0;
-			else
-				result = 2;
-		}
-		return result;
-	}
-
-	function calcUseWeights(slave) {
-		result = (3 - slave.anus)+(slave.muscles/30);
-		if (slave.muscles < -95)
-			result -= 5;
-		else if (slave.muscles < -30)
-			result -= 2;
-
-		const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight;
-		if (uses <= 0) return;
-
-		result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30);
-		if (slave.sexualFlaw === "cum addict")
-			result += (V.oralUseWeight/uses) * (slave.oralSkill/30);
-		if (canDoVaginal(slave)) {
-			result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30);
-			result += (3 - slave.vagina);
-			result += slave.vaginaLube;
-		}
-		if (canDoAnal(slave)) {
-			result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30);
-			if (slave.sexualFlaw === "anal addict")
-				result += (V.analUseWeight/uses) * (slave.analSkill/30);
-			if (slave.inflationType === "aphrodisiac")
-				result += (V.analUseWeight/uses) * (slave.inflation * 3);
-		}
-	}
-
-	function calcFuckableTits(slave) {
-		result += 2;
-		if (slave.fetish === "boobs")
-			result += Math.trunc(slave.fetishStrength/20);
-	}
-
-	function calcWorksWithRelatives(slave) {
-		V.slaves.forEach(islave => {
-			if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) {
-				result += 1;
-				if (incest_bonus) result += 1;
-			}
-			if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) {
-				result += 1;
-				if (incest_bonus) result += 1;
-			}
-		});
-	}
-
-	function calcWorksWithRelativesVanilla(slave) {
-		const fre = getSlave(slave.relationTarget)
-		if (fre !== undefined && sameAssignmentP(slave, fre)) {
-			result += 2;
-			if (incest_bonus) result += 2;
-		}
-	}
-
-	function calcWorksWithRelationship(slave) {
-		const fre = V.slaves.findIndex(s => {
-			return haveRelationshipP(slave, s) && sameAssignmentP(slave, s);
-		});
-		if (fre !== -1) result += 1;
-	}
-
-	function calcWorksWithRival(slave) {
-		const en = getSlave(slave.rivalryTarget);
-		if (en !== undefined && sameAssignmentP(slave, en)) result -= 1;
-	}
-
-	function calcHInjectionsDiet(slave) {
-		if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections")
-			result -= 10;
-		if (slave.diet === "XXY")
-			result += 2;
-		else if (slave.diet === "XY" || slave.diet === "XX")
-			result += 1;
-		else if (slave.diet === "cum production")
-			result += 1;
-		else if (slave.diet === "fertility")
-			result += 1;
-	}
-	function calcPreg(slave) {
-		if (V.arcologies[0].FSRepopulationFocus > 20) {
-			if (slave.preg > 10) result += 2;
-			else result -= 2;
-		} else if (V.arcologies[0].FSRestart > 20) {
-			if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1)
-				result += 1;
-			else if (slave.preg > 10)
-				result -= 10;
-			else
-				result += 0;
-		}
-	}
-
-	function calcRace(slave) {
-		if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave))
-			result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10);
-		if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave))
-			result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME);
-	}
-
-	function calcSexAttributes(slave) {
-		if (slave.clitPiercing > 2) result += 1;
-		if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none")
-			result += slave.fetishStrength/5;
-
-		if (slave.attrKnown === 1) {
-			result += Math.trunc(slave.attrXX/20);
-			result += Math.trunc(slave.attrXY/20);
-			if (slave.energy > 95) result += 3;
-			else if (slave.energy > 80) result += 2;
-			else if (slave.energy > 60) result += 1;
-			else if (slave.energy <= 20) result -= 2;
-			else if (slave.energy <= 40) result -= 1;
-		}
-		if (slave.sexualFlaw !== "none") result -= 2;
-		if (slave.sexualQuirk !== "none") result += 2;
-		if (slave.behavioralFlaw !== "none") result -= 2;
-		if (slave.behavioralQuirk !== "none") result += 2;
-	}
-
-	function calcCareer(slave) {
-		if (setup.whoreCareers.includes(slave.career))
-			result += 1;
-		else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000)
-			result += 1;
-	}
-
-	function calcSight(slave) {
-		if (!canSee(slave)) result -= 3;
-		else if (slave.eyes <= -1) {
-			if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts")
-				result -= 1;
-		} else if (slave.eyewear === "blurring glasses")
-			result -= 1;
-		else if (slave.eyewear === "blurring contacts")
-			result -= 1;
-	}
-
-	function calcHearing(slave) {
-		if (!canHear(slave)) result -= 2;
-		else if (slave.hears <= -1) {
-			if (slave.earwear !== "hearing aids")
-				result -= 1;
-		} else if (slave.earwear === "muffling ear plugs")
-			result -= 1;
-	}
-
-	function calcEgyptianBonus(slave) {
-		if (V.racialVarieties === undefined) V.racialVarieties = [];
-		if (!V.racialVarieties.includes(slave.race))
-			V.racialVarieties.push(slave.race);
-	}
-
-	function calcYouthBonus(slave) {
-		if (slave.visualAge < 30) {
-			if (slave.actualAge > 30)
-				result += 5; // experienced for her apparent age
-			if (slave.physicalAge > 30)
-				result -= slave.physicalAge/2; // too old :(
-		}
-	}
-
-	function calcMatureBonus(slave) {
-		if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge)
-			result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit
-	}
-
-	function calcNotFuckdoll(slave) {
-		if (V.familyTesting === 1 && totalRelatives(slave) > 0)
-			calcWorksWithRelatives(slave);
-		else if(!V.familyTesting && slave.relation !==0)
-			calcWorksWithRelativesVanilla(slave);
-		if (slave.relationship > 0) calcWorksWithRelationship(slave);
-		if (slave.rivalry !== 0) calcWorksWithRival(slave);
-		calcHInjectionsDiet(slave);
-		calcPreg(slave);
-		calcRace(slave);
-		calcSexAttributes(slave);
-		calcCareer(slave);
-		calcSight(slave);
-		calcHearing(slave);
-		if (V.arcologies[0].FSEgyptianRevivalist !== "unset")
-			calcEgyptianBonus(slave);
-		if (V.arcologies[0].FSYouthPreferentialist !== "unset")
-			calcYouthBonus(slave);
-		else if (V.arcologies[0].FSMaturityPreferentialist !== "unset")
-			calcMatureBonus(slave);
-	}
-
-	function calcAge(slave) {
-		if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) {
-			result += 1;
-			if (slave.birthWeek === 0) result += result;
-			else if (slave.birthWeek < 4) result += 0.2*result;
-		} else if (slave.physicalAge === V.minimumSlaveAge) {
-			result += 1;
-			if (slave.birthWeek === 0 ) result += 0.5*result;
-			else if (slave.birthWeek < 4) result += 0.1*result;
-		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) {
-			result += 1;
-			if (slave.birthWeek === 0)
-				result += 0.5*result;
-			else if (slave.birthWeek < 4)
-				result += 0.1*result;
-		}
-	}
-
-	function calcAmputation(slave) {
-		switch(slave.amp) {
-		case 0:
-		case -2:
-		case -5:
-			break;
-		case 1:
-			result -= 2;
-			break;
-		default:
-			result -= 1;
-		}
-	}
-
-	function calcHedonismWeight(slave) {
-		if (slave.weight < 10)
-			result -= 2;
-		else if (slave.weight > 190)
-			result -= 5; // too fat
-	}
-	return FResult;
-})();
diff --git a/src/js/beautyJS.tw b/src/js/slaveCostJS.tw
similarity index 62%
rename from src/js/beautyJS.tw
rename to src/js/slaveCostJS.tw
index a08e7e1515e74d2839f612060aea1666f4c158a1..bd9b50f90b9ce50d4224d4cff6a6ed08524fbba8 100644
--- a/src/js/beautyJS.tw
+++ b/src/js/slaveCostJS.tw
@@ -1,4 +1,4 @@
-:: Beauty [script]
+:: Slave Cost JS [script]
 
 window.Beauty = (function() {
 	"use strict";
@@ -1219,3 +1219,731 @@ window.Beauty = (function() {
 
 	return Beauty;
 })();
+
+// this is a port of the FResult widget
+// it has been broken up into several functions, because it grew too long
+// it has been wrapped in a closure so as not to pollute the global namespace
+// and so that nested functions are only evaluated once
+
+window.FResult = (function() {
+	"use strict";
+	// we can't initialise our global variables on load, because SugarCube.State isn't initialised
+	// instead, declare them and initialise on run time
+	let V, result, incest_bonus;
+	function FResult(slave) {
+		V = State.variables;
+		incest_bonus = V.arcologies[0].FSEgyptianRevivalist > 20 || V.arcologies[0].FSEgyptianRevivalistIncestPolicy === 1;
+
+		calcUseWeights(slave);
+		if (!slave.fuckdoll)
+			calcNotFuckdoll(slave);
+		else
+			result += slave.fuckdoll/10;
+
+		result += Math.max(0, slave.aphrodisiacs) * 2;
+
+		if (slave.inflationType === "aphrodisiac")
+			result += slave.inflation*4;
+
+		if (slave.lactation > 0)
+			result += 1;
+
+		if (slave.nipples === "fuckable")
+			calcFuckableTits(slave);
+
+		if (V.seeAge === 1)
+			calcAge(slave);
+		if (slave.fetish === "mindbroken")
+			result = Math.trunc(result*0.4);
+		else
+			result = Math.trunc(result*0.7);
+
+		if (slave.pregWeek < 0)
+			result -= Math.trunc(result*slave.pregWeek/10); // reduced the most just after birth
+
+		calcAmputation(slave);
+
+		if (V.arcologies[0].FSHedonisticDecadence > 20)
+			calcHedonismWeight(slave);
+		if (result < 2) {
+			if (supremeRaceP(slave) && V.arcologies[0].FSSupremacist > 20)
+				result = 0;
+			else
+				result = 2;
+		}
+		return result;
+	}
+
+	function calcUseWeights(slave) {
+		result = (3 - slave.anus)+(slave.muscles/30);
+		if (slave.muscles < -95)
+			result -= 5;
+		else if (slave.muscles < -30)
+			result -= 2;
+
+		const uses = V.oralUseWeight + V.vaginalUseWeight + V.analUseWeight;
+		if (uses <= 0) return;
+
+		result += (6+slave.tonguePiercing) * (V.oralUseWeight/uses) * (slave.oralSkill/30);
+		if (slave.sexualFlaw === "cum addict")
+			result += (V.oralUseWeight/uses) * (slave.oralSkill/30);
+		if (canDoVaginal(slave)) {
+			result += 6 * (V.vaginalUseWeight/uses) * (slave.vaginalSkill/30);
+			result += (3 - slave.vagina);
+			result += slave.vaginaLube;
+		}
+		if (canDoAnal(slave)) {
+			result += 6 * (V.analUseWeight/uses) * (slave.analSkill/30);
+			if (slave.sexualFlaw === "anal addict")
+				result += (V.analUseWeight/uses) * (slave.analSkill/30);
+			if (slave.inflationType === "aphrodisiac")
+				result += (V.analUseWeight/uses) * (slave.inflation * 3);
+		}
+	}
+
+	function calcFuckableTits(slave) {
+		result += 2;
+		if (slave.fetish === "boobs")
+			result += Math.trunc(slave.fetishStrength/20);
+	}
+
+	function calcWorksWithRelatives(slave) {
+		V.slaves.forEach(islave => {
+			if (isParentP(slave, islave) && sameAssignmentP(slave, islave)) {
+				result += 1;
+				if (incest_bonus) result += 1;
+			}
+			if (areSisters(slave, islave) > 0 && sameAssignmentP(slave, islave)) {
+				result += 1;
+				if (incest_bonus) result += 1;
+			}
+		});
+	}
+
+	function calcWorksWithRelativesVanilla(slave) {
+		const fre = getSlave(slave.relationTarget);
+		if (fre !== undefined && sameAssignmentP(slave, fre)) {
+			result += 2;
+			if (incest_bonus) result += 2;
+		}
+	}
+
+	function calcWorksWithRelationship(slave) {
+		const fre = V.slaves.findIndex(s => {
+			return haveRelationshipP(slave, s) && sameAssignmentP(slave, s);
+		});
+		if (fre !== -1) result += 1;
+	}
+
+	function calcWorksWithRival(slave) {
+		const en = getSlave(slave.rivalryTarget);
+		if (en !== undefined && sameAssignmentP(slave, en)) result -= 1;
+	}
+
+	function calcHInjectionsDiet(slave) {
+		if (slave.drugs === "male hormone injections" || slave.drugs === "female hormone injections")
+			result -= 10;
+		if (slave.diet === "XXY")
+			result += 2;
+		else if (slave.diet === "XY" || slave.diet === "XX")
+			result += 1;
+		else if (slave.diet === "cum production")
+			result += 1;
+		else if (slave.diet === "fertility")
+			result += 1;
+	}
+	function calcPreg(slave) {
+		if (V.arcologies[0].FSRepopulationFocus > 20) {
+			if (slave.preg > 10) result += 2;
+			else result -= 2;
+		} else if (V.arcologies[0].FSRestart > 20) {
+			if (slave.bellyPreg >= 500 && slave.breedingMark === 1 && V.propOutcome === 1)
+				result += 1;
+			else if (slave.preg > 10)
+				result -= 10;
+			else
+				result += 0;
+		}
+	}
+
+	function calcRace(slave) {
+		if (V.arcologies[0].FSSupremacist !== "unset" && supremeRaceP(slave))
+			result -= (V.arcologies[0].FSSupremacist/5) + (V.arcologies[0].FSSupremacistLawME*10);
+		if (V.arcologies[0].FSSubjugationist !== "unset" && inferiorRaceP(slave))
+			result += (V.arcologies[0].FSSubjugationist/10) + (V.arcologies[0].FSSubjugationistLawME);
+	}
+
+	function calcSexAttributes(slave) {
+		if (slave.clitPiercing > 2) result += 1;
+		if (slave.fetishKnown === 1 && slave.fetishStrength > 60 && slave.fetish != "none")
+			result += slave.fetishStrength/5;
+
+		if (slave.attrKnown === 1) {
+			result += Math.trunc(slave.attrXX/20);
+			result += Math.trunc(slave.attrXY/20);
+			if (slave.energy > 95) result += 3;
+			else if (slave.energy > 80) result += 2;
+			else if (slave.energy > 60) result += 1;
+			else if (slave.energy <= 20) result -= 2;
+			else if (slave.energy <= 40) result -= 1;
+		}
+		if (slave.sexualFlaw !== "none") result -= 2;
+		if (slave.sexualQuirk !== "none") result += 2;
+		if (slave.behavioralFlaw !== "none") result -= 2;
+		if (slave.behavioralQuirk !== "none") result += 2;
+	}
+
+	function calcCareer(slave) {
+		if (setup.whoreCareers.includes(slave.career))
+			result += 1;
+		else if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000)
+			result += 1;
+	}
+
+	function calcSight(slave) {
+		if (!canSee(slave)) result -= 3;
+		else if (slave.eyes <= -1) {
+			if (slave.eyewear !== "corrective glasses" && slave.eyewear !== "corrective contacts")
+				result -= 1;
+		} else if (slave.eyewear === "blurring glasses")
+			result -= 1;
+		else if (slave.eyewear === "blurring contacts")
+			result -= 1;
+	}
+
+	function calcHearing(slave) {
+		if (!canHear(slave)) result -= 2;
+		else if (slave.hears <= -1) {
+			if (slave.earwear !== "hearing aids")
+				result -= 1;
+		} else if (slave.earwear === "muffling ear plugs")
+			result -= 1;
+	}
+
+	function calcEgyptianBonus(slave) {
+		if (V.racialVarieties === undefined) V.racialVarieties = [];
+		if (!V.racialVarieties.includes(slave.race))
+			V.racialVarieties.push(slave.race);
+	}
+
+	function calcYouthBonus(slave) {
+		if (slave.visualAge < 30) {
+			if (slave.actualAge > 30)
+				result += 5; // experienced for her apparent age
+			if (slave.physicalAge > 30)
+				result -= slave.physicalAge/2; // too old :(
+		}
+	}
+
+	function calcMatureBonus(slave) {
+		if (slave.visualAge >= 30 && slave.actualAge >= 30 && slave.physicalAge < slave.visualAge)
+			result += Math.min((slave.physicalAge - slave.visualAge) * 2, 20); // looks and acts mature, but has a body that just won't quit
+	}
+
+	function calcNotFuckdoll(slave) {
+		if (V.familyTesting === 1 && totalRelatives(slave) > 0)
+			calcWorksWithRelatives(slave);
+		else if(!V.familyTesting && slave.relation !==0)
+			calcWorksWithRelativesVanilla(slave);
+		if (slave.relationship > 0) calcWorksWithRelationship(slave);
+		if (slave.rivalry !== 0) calcWorksWithRival(slave);
+		calcHInjectionsDiet(slave);
+		calcPreg(slave);
+		calcRace(slave);
+		calcSexAttributes(slave);
+		calcCareer(slave);
+		calcSight(slave);
+		calcHearing(slave);
+		if (V.arcologies[0].FSEgyptianRevivalist !== "unset")
+			calcEgyptianBonus(slave);
+		if (V.arcologies[0].FSYouthPreferentialist !== "unset")
+			calcYouthBonus(slave);
+		else if (V.arcologies[0].FSMaturityPreferentialist !== "unset")
+			calcMatureBonus(slave);
+	}
+
+	function calcAge(slave) {
+		if ((V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset") && slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave)) {
+			result += 1;
+			if (slave.birthWeek === 0) result += result;
+			else if (slave.birthWeek < 4) result += 0.2*result;
+		} else if (slave.physicalAge === V.minimumSlaveAge) {
+			result += 1;
+			if (slave.birthWeek === 0 ) result += 0.5*result;
+			else if (slave.birthWeek < 4) result += 0.1*result;
+		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (V.arcologies[0].FSRepopulationFocus !== "unset" || V.arcologies[0].FSGenderFundamentalist !== "unset")) {
+			result += 1;
+			if (slave.birthWeek === 0)
+				result += 0.5*result;
+			else if (slave.birthWeek < 4)
+				result += 0.1*result;
+		}
+	}
+
+	function calcAmputation(slave) {
+		switch(slave.amp) {
+		case 0:
+		case -2:
+		case -5:
+			break;
+		case 1:
+			result -= 2;
+			break;
+		default:
+			result -= 1;
+		}
+	}
+
+	function calcHedonismWeight(slave) {
+		if (slave.weight < 10)
+			result -= 2;
+		else if (slave.weight > 190)
+			result -= 5; // too fat
+	}
+	return FResult;
+})();
+
+window.slaveCost = (function() {
+	"use strict";
+	let V, arcology, multiplier, cost;
+
+	function slaveCost(slave, isStartingSlave) {
+		V = State.variables;
+		arcology = V.arcologies[0];
+		multiplier = V.slaveCostFactor;
+		cost = Beauty(slave)*FResult(slave);
+
+		calcGenitalsCost(slave);
+		calcDevotionTrustCost(slave);
+		calcPreferencesCost(slave);
+		calcPregCost(slave);
+		if (slave.prestige + slave.pornPrestige > 0) {
+			calcPrestigeCost(slave);
+		}
+		calcFSCost(slave);
+		if (V.seeAge === 1) {
+			calcAgeCost(slave);
+		}
+		calcCareersCost(slave);
+		calcMiscCost(slave);
+		calcIndentureCost(slave); /* multipliers */
+		
+		calcCost(slave);
+		if (isStartingSlave) {
+			calcStartingSlaveCost(slave);
+		}
+		return cost;
+	};
+
+	function calcGenitalsCost(slave) {
+		if (slave.vagina === 0) {
+			multiplier += 0.1;
+		}
+		if (slave.vagina > -1 && arcology.FSRestartSMR === 1) {
+			if (slave.dick > 0) {
+				if (slave.ovaries === 0 && slave.balls === 0) {
+					multiplier += 0.8;
+				}
+			}
+		} else if (slave.vagina > -1) {
+			if (slave.dick > 0) {
+				if (V.ui !== "start" || V.PC.dick === 0 || V.PC.vagina === 0) {
+					multiplier += 0.2;
+					if (slave.ovaries > 0) {
+						if (slave.balls > 0) {
+							multiplier += 0.8;
+						}
+					}
+				} else {
+					multiplier += 0.1;
+					if (slave.ovaries > 0) {
+						if (slave.balls > 0) {
+							multiplier += 0.2;
+						}
+					}
+				}
+			}
+		}
+	};
+
+	function calcDevotionTrustCost(slave) {
+		if (V.specialSlavesPriceOverride === 1) {
+			if (slave.devotion > 50) {
+				multiplier += slave.devotion/200;
+			}
+			if (slave.trust > 50) {
+				multiplier += slave.trust/200;
+			}
+		} else {
+			multiplier += slave.devotion/200;
+			if (slave.devotion < -20) {
+				if (slave.trust > 0) {
+					multiplier -= slave.trust/200;
+				}
+			} else {
+				if (slave.trust > 0) {
+					multiplier += slave.trust/200;
+				}
+			}
+		}
+	};
+
+	function calcPreferencesCost(slave) {
+		if (slave.behavioralFlaw !== "none") {
+			multiplier -= 0.1;
+		}
+		if (slave.behavioralQuirk !== "none") {
+			multiplier += 0.1;
+		}
+		if (slave.sexualFlaw === "breeder" && arcology.FSRepopulationFocus !== "unset") {
+			multiplier += 0.3;
+		} else if (slave.sexualFlaw !== "none") {
+			multiplier -= 0.1;
+		}
+		if (slave.sexualQuirk !== "none") {
+			multiplier += 0.1;
+		}
+		if (slave.fetishKnown === 1) {
+			if (slave.fetish === "mindbroken") {
+				multiplier -= 0.3;
+			} else if (slave.fetish !== "none") {
+				multiplier += slave.fetishStrength/1000;
+			}
+		} else {
+			multiplier -= 0.1;
+		}
+		if (slave.attrKnown === 1) {
+			if (slave.energy > 95) {
+				multiplier += 0.2;
+			}
+		}
+	};
+
+	function calcPregCost(slave) {
+		if (slave.mpreg === 1) {
+			multiplier += 0.2;
+		}
+		if (arcology.FSRepopulationFocusSMR === 1) {
+			if (slave.preg < -1) {
+				multiplier -= 0.5;
+			} else if (slave.bellyPreg >= 300000) {
+				multiplier += 1;
+			} else if (slave.bellyPreg >= 120000) {
+				multiplier += 0.5;
+			} else if (slave.preg > 10) {
+				multiplier += 0.1;
+			}
+		} else if (arcology.FSRestartSMR === 1) {
+			if (slave.preg < -1) {
+				multiplier += 0.5;
+			} else if (slave.bellyPreg >= 300000) {
+				multiplier -= 2.5;
+			} else if (slave.bellyPreg >= 30000) {
+				multiplier -= 1.5;
+			} else if (slave.preg > 10) {
+				multiplier -= 1.0;
+			}
+		} else {
+			if (slave.preg < -1) {
+				multiplier -= 0.1;
+			} else if (V.activeSlave.bellyPreg >= 300000) {
+				multiplier -= 1.5;
+			} else if (V.activeSlave.bellyPreg >= 120000) {
+				multiplier -= 0.5;
+			} else if (slave.preg > 10) {
+				multiplier -= 0.1;
+			}
+		}
+	};
+
+	function calcPrestigeCost(slave) {
+		if (slave.prestige > 0) {
+			multiplier += 0.7*slave.prestige;
+		}
+		if (slave.pornPrestige === 3) {
+			multiplier += 1.5;
+		} else if (slave.pornPrestige === 2) {
+			multiplier += 0.7;
+		} else if (slave.pornPrestige === 1) {
+			multiplier += 0.2;
+		}
+	};
+
+	function calcFSCost(slave) {
+		if (arcology.FSSupremacistLawME !== 0) {
+			if (slave.race !== arcology.FSSupremacistRace) {
+				multiplier -= 0.1;
+			}
+		}
+		if (arcology.FSSubjugationistLawME !== 0) {
+			if (slave.race === arcology.FSSubjugationistRace) {
+				multiplier -= 0.2;
+			}
+		}
+		if (arcology.FSRepopulationFocusSMR !== 0) {
+			if (slave.preg > 0) {
+				multiplier += 0.1;
+			}
+		} else if (arcology.FSRestartSMR !== 0) {
+			if (slave.dick > 0) {
+				multiplier -= 0.1;
+			}
+			if (slave.balls > 0) {
+				multiplier -= 0.2;
+			}
+			if (slave.vagina > 0) {
+				multiplier -= 0.1;
+			}
+			if (slave.ovaries > 0) {
+				multiplier -= 0.5;
+			}
+		}
+		if (arcology.FSGenderFundamentalistSMR !== 0) {
+			if (slave.dick > 0) {
+				multiplier -= 0.1;
+			}
+			if (slave.balls > 0) {
+				multiplier -= 0.1;
+			}
+		} else if (arcology.FSGenderRadicalist !== "unset") {
+			if (slave.dick > 0) {
+				multiplier += 0.1;
+			}
+			if (slave.balls > 0) {
+				multiplier -= 0.1;
+			}
+		}
+		if (arcology.FSHedonisticDecadenceSMR !== 0) {
+			if (slave.weight > 60 && slave.muscles < 5) {
+				multiplier += 0.1;
+			}
+		}
+		if (arcology.FSArabianRevivalist > 50) {
+			multiplier += 0.1;
+		}
+	};
+
+	function calcAgeCost(slave) {
+		if (slave.physicalAge === V.minimumSlaveAge && slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
+			if (slave.birthWeek === 0) {
+				multiplier -= 0.4;
+			} else if (slave.birthWeek < 4) {
+				multiplier -= 0.1;
+			}
+		} else if (slave.physicalAge === V.minimumSlaveAge) {
+			if (slave.birthWeek === 0) {
+				multiplier -= 0.2;
+			} else if (slave.birthWeek < 4) {
+				multiplier -= 0.05;
+			}
+		} else if (slave.physicalAge === V.fertilityAge && canGetPregnant(slave) && (arcology.FSRepopulationFocus !== "unset" || arcology.FSGenderFundamentalist !== "unset")) {
+			if (slave.birthWeek === 0) {
+				multiplier -= 0.2;
+			} else if (slave.birthWeek < 4) {
+				multiplier -= 0.05;
+			}
+		}
+	};
+
+	function calcCareersCost() {
+		if (slave.career !== 0) {
+			if (slave.career === "a slave") {
+				multiplier += 0.1;
+			} else if (setup.bodyguardCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.wardenessCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.attendantCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.matronCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.schoolteacherCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.stewardessCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.milkmaidCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.farmerCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.madamCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.DJCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.HGCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.recruiterCareers.includes(slave.career)) {
+				multiplier += 0.1;
+			} else if (setup.entertainmentCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.whoreCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.gratefulCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.menialCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			} else if (setup.servantCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			}
+		}
+		if (V.week-slave.weekAcquired >= 20 && slave.entertainSkill >= 100) {
+			if (!setup.entertainmentCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			}
+		}
+		if (slave.oralCount + slave.analCount + slave.vaginalCount + slave.mammaryCount + slave.penetrativeCount > 1000) {
+			if (!setup.whoreCareers.includes(slave.career)) {
+				multiplier += 0.05;
+			}
+		}
+		if (!setup.bodyguardCareers.includes(slave.career) && slave.skillBG >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.wardenessCareers.includes(slave.career) && slave.skillWA >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.attendantCareers.includes(slave.career) && slave.skillAT >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.matronCareers.includes(slave.career) && slave.skillMT >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.schoolteacherCareers.includes(slave.career) && slave.skillTE >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.stewardessCareers.includes(slave.career) && slave.skillST >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.milkmaidCareers.includes(slave.career) && slave.skillMM >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.farmerCareers.includes(slave.career) && slave.skillFA >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.madamCareers.includes(slave.career) && slave.skillMD >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.DJCareers.includes(slave.career) && slave.skillDJ >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.HGCareers.includes(slave.career) && slave.skillHG >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.recruiterCareers.includes(slave.career) && slave.skillRC >= V.masteredXP) {
+			multiplier += 0.1;
+		}
+		if (!setup.servantCareers.includes(slave.career) && slave.skillS >= V.masteredXP) {
+			multiplier += 0.05;
+		}
+		if (!setup.entertainmentCareers.includes(slave.career) && slave.skillE >= V.masteredXP) {
+			multiplier += 0.05;
+		}
+		if (!setup.whoreCareers.includes(slave.career) && slave.skillW >= V.masteredXP) {
+			multiplier += 0.05;
+		}
+	};
+
+	function calcMiscCost(slave) {	
+		let totalInt = Math.clamp(slave.intelligence + slave.intelligenceImplant,-130,130); /* make absolutely certain we do not use +-131 in the next line */
+		multiplier += Math.floor((Math.asin(totalInt/131))*50)/50;
+		if (slave.pubertyXY === 0 && slave.physicalAge >= V.potencyAge && slave.genes === "XY" && arcology.FSGenderRadicalist === "unset") {
+			multiplier += 0.5;
+		}
+		if (slave.brand !== 0) {
+			if (V.rep > 10000) {
+				multiplier += 0.1;
+			} else if (V.rep < 5000) {
+				multiplier -= 0.1;
+			}
+		}
+		if (slave.amp === 1) {
+			multiplier -= 0.2;
+		}
+		if (slave.eyes === -2) {
+			multiplier -= 0.2;
+		}
+	};
+
+	function calcIndentureCost(slave) {
+		if (slave.indenture > -1) {
+			multiplier -= 0.1*slave.indentureRestrictions;
+			multiplier -= (260-slave.indenture)/260;
+		} else if (V.seeAge === 1) {
+			if (slave.actualAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy !== 1) {
+				multiplier *= (V.retirementAge-slave.actualAge)/5;
+			}
+			if (slave.physicalAge >= (V.retirementAge-5) && V.PhysicalRetirementAgePolicy === 1) {
+				multiplier *= (V.retirementAge-slave.actualAge)/5;
+			}
+		}
+	};
+
+	function calcCost(slave) {
+		cost *= multiplier*50;
+		cost = Number(cost) || 0;
+		if (cost < V.minimumSlaveCost) {
+			cost = V.minimumSlaveCost;
+		} else if (cost <= 100000) {
+			/* do nothing */
+		} else if (cost <= 200000) {
+			cost -= (cost-100000)*0.1;
+		} else if (cost <= 300000) {
+			cost -= 10000 + ((cost-200000)*0.2);
+		} else if (cost <= 400000) {
+			cost -= 30000 + ((cost-300000)*0.3);
+		} else if (cost <= 500000) {
+			cost -= 60000 + ((cost-400000)*0.4);
+		} else {
+			cost -= 100000 + ((cost-500000)*0.5);
+		}
+		if (cost < 1000) {
+			cost = 1000;
+		}
+		cost = 500*Math.trunc(cost/500);
+	};
+
+	function calcStartingSlaveCost(slave) {
+		let startingSlaveMultiplier = 0;
+
+		if (slave.devotion > 20) {
+			startingSlaveMultiplier += (0.000117*(slave.devotion-20)*(slave.devotion-20))+(0.003167*(slave.devotion-20));
+		}
+		if (slave.whoreSkill) {
+			startingSlaveMultiplier += 0.00001*slave.whoreSkill*slave.whoreSkill;
+		}
+		if (slave.entertainSkill) {
+			startingSlaveMultiplier += 0.00001*slave.entertainSkill*slave.entertainSkill;
+		}
+		if (slave.vaginalSkill) {
+			startingSlaveMultiplier += 0.00001*slave.vaginalSkill*slave.vaginalSkill;
+		}
+		if (slave.analSkill) {
+			startingSlaveMultiplier += 0.00001*slave.analSkill*slave.analSkill;
+		}
+		if (slave.oralSkill) {
+			startingSlaveMultiplier += 0.00001*slave.oralSkill*slave.oralSkill;
+		}
+		if (slave.combatSkill) {
+			startingSlaveMultiplier += 0.1;
+		}
+		if (slave.prestige) {
+			startingSlaveMultiplier += slave.prestige;
+		}
+		if (startingSlaveMultiplier) {
+			if (slave.actualAge > 25) {
+				startingSlaveMultiplier -= startingSlaveMultiplier*(slave.actualAge-25)*0.05;
+			}
+		}
+		startingSlaveMultiplier = Math.clamp(startingSlaveMultiplier, 0, 10);
+		cost += cost*startingSlaveMultiplier;
+		cost = 500*Math.trunc(cost/500);
+		if (V.PC.career === "slaver") {
+			cost = cost/2;
+		}
+	};
+
+	return slaveCost;
+})();
+
+window.startingSlaveCost = function startingSlaveCost(slave) {
+	return slaveCost(slave, true);
+};
diff --git a/src/utility/assayWidgets.tw b/src/utility/assayWidgets.tw
index 39052a47692e4708d8d2b335022e934a1d45d744..05944e0a2ad9f6d5955b639ad28e3e0db894a5e7 100644
--- a/src/utility/assayWidgets.tw
+++ b/src/utility/assayWidgets.tw
@@ -1,374 +1,7 @@
 :: assay widgets [widget nobr]
 
 <<widget "slaveCost">>
-
-<<set $beauty = Beauty($args[0])>>
-<<set $FResult = FResult($args[0])>>
-
-<<set $slaveCost = ($beauty*$FResult)>>
-
-<<set _slaveMultiplier = $slaveCostFactor>>
-
-<<if $args[0].behavioralFlaw != "none">>
-	<<set _slaveMultiplier -= 0.1>>
-<</if>>
-<<if $args[0].behavioralQuirk != "none">>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if $args[0].sexualFlaw == "breeder" && $arcologies[0].FSRepopulationFocus != "unset">>
-	<<set _slaveMultiplier += 0.3>>
-<<elseif $args[0].sexualFlaw != "none">>
-	<<set _slaveMultiplier -= 0.1>>
-<</if>>
-<<if $args[0].sexualQuirk != "none">>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-
-<<if $args[0].fetishKnown == 1>>
-	<<if $args[0].fetish == "mindbroken">>
-		<<set _slaveMultiplier -= 0.3>>
-	<<elseif $args[0].fetish != "none">>
-		<<set _slaveMultiplier += $args[0].fetishStrength/1000>>
-	<</if>>
-<<else>>
-	<<set _slaveMultiplier -= 0.1>>
-<</if>>
-
-<<if $args[0].attrKnown == 1>>
-	<<if $args[0].energy > 95>>
-	<<set _slaveMultiplier += 0.2>>
-	<</if>>
-<</if>>
-
-<<if $args[0].vagina == 0>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if $args[0].mpreg == 1>>
-	<<set _slaveMultiplier += 0.2>>
-<</if>>
-<<if $arcologies[0].FSRepopulationFocusSMR == 1>>
-	<<if $args[0].preg < -1>>
-		<<set _slaveMultiplier -= 0.5>>
-	<<elseif ($args[0].bellyPreg >= 300000)>>
-		<<set _slaveMultiplier += 1>>
-	<<elseif ($args[0].bellyPreg >= 120000)>>
-		<<set _slaveMultiplier += 0.5>>
-	<<elseif $args[0].preg > 10>>
-		<<set _slaveMultiplier += 0.1>>
-	<</if>>
-<<elseif $arcologies[0].FSRestartSMR == 1>>
-	<<if $args[0].preg < -1>>
-		<<set _slaveMultiplier += 0.5>>
-	<<elseif ($args[0].bellyPreg >= 300000)>>
-		<<set _slaveMultiplier -= 2.5>>
-	<<elseif ($args[0].bellyPreg >= 30000)>>
-		<<set _slaveMultiplier -= 1.5>>
-	<<elseif $args[0].preg > 10>>
-		<<set _slaveMultiplier -= 1.0>>
-	<</if>>
-<<else>>
-	<<if $args[0].preg < -1>>
-		<<set _slaveMultiplier -= 0.1>>
-	<<elseif ($activeSlave.bellyPreg >= 300000)>>
-		<<set _slaveMultiplier -= 1.5>>
-	<<elseif ($activeSlave.bellyPreg >= 120000)>>
-		<<set _slaveMultiplier -= 0.5>>
-	<<elseif $args[0].preg > 10>>
-		<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-<</if>>
-
-<<set _int = Math.clamp($args[0].intelligence+$args[0].intelligenceImplant,-130,130)>> /* make absolutely certain we do not use +-131 in the next line */
-<<set _slaveMultiplier += Math.floor((Math.asin(_int/131))*50)/50>>
-
-<<if $args[0].vagina > -1 && $arcologies[0].FSRestartSMR == 1>>
-	<<if $args[0].dick > 0>>
-	<<if $args[0].ovaries == 0 && $args[0].balls == 0>>
-		<<set _slaveMultiplier += 0.8>>
-	<</if>>
-	<</if>>
-<<elseif $args[0].vagina > -1>>
-	<<if $args[0].dick > 0>>
-		<<if ($ui != "start") || ($PC.dick == 0) || ($PC.vagina == 0)>>
-			<<set _slaveMultiplier += 0.2>>
-			<<if $args[0].ovaries > 0>>
-			<<if $args[0].balls > 0>>
-				<<set _slaveMultiplier += 0.8>>
-			<</if>>
-			<</if>>
-		<<else>>
-			<<set _slaveMultiplier += 0.1>>
-			<<if $args[0].ovaries > 0>>
-			<<if $args[0].balls > 0>>
-				<<set _slaveMultiplier += 0.2>>
-			<</if>>
-			<</if>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if $args[0].pubertyXY == 0 && $args[0].physicalAge >= $potencyAge && $args[0].genes == "XY" && $arcologies[0].FSGenderRadicalist == "unset">>
-	<<set _slaveMultiplier += 0.5>>
-<</if>>
-
-<<if $args[0].prestige > 0>>
-	<<set _slaveMultiplier += 0.7*$args[0].prestige>>
-<</if>>
-<<if $args[0].pornPrestige == 3>>
-	<<set _slaveMultiplier += 1.5>>
-<<elseif $args[0].pornPrestige == 2>>
-	<<set _slaveMultiplier += 0.7>>
-<<elseif $args[0].pornPrestige == 1>>
-	<<set _slaveMultiplier += 0.2>>
-<</if>>
-
-<<if $specialSlavesPriceOverride == 1>>
-	<<if $args[0].devotion > 50>>
-		<<set _slaveMultiplier += $args[0].devotion/200>>
-	<</if>>
-	<<if $args[0].trust > 50>>
-		<<set _slaveMultiplier += $args[0].trust/200>>
-	<</if>>
-<<else>>
-	<<set _slaveMultiplier += $args[0].devotion/200>>
-	<<if $args[0].devotion < -20>>
-		<<if $args[0].trust > 0>>
-			<<set _slaveMultiplier -= $args[0].trust/200>>
-		<</if>>
-	<<else>>
-		<<if $args[0].trust > 0>>
-			<<set _slaveMultiplier += $args[0].trust/200>>
-		<</if>>
-	<</if>>
-<</if>>
-
-<<if $args[0].brand != 0>>
-	<<if $rep > 10000>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif $rep < 5000>>
-	<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-<</if>>
-
-<<if $arcologies[0].FSSupremacistLawME != 0>>
-	<<if $args[0].race != $arcologies[0].FSSupremacistRace>>
-	<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSSubjugationistLawME != 0>>
-	<<if $args[0].race == $arcologies[0].FSSubjugationistRace>>
-	<<set _slaveMultiplier -= 0.2>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSRepopulationFocusSMR != 0>>
-	<<if $args[0].preg > 0>>
-		<<set _slaveMultiplier += 0.1>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSHedonisticDecadenceSMR != 0>>
-	<<if $args[0].weight > 60 && $args[0].muscles < 5>>
-		<<set _slaveMultiplier += 0.1>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSRestartSMR != 0>>
-	<<if $args[0].dick > 0>>
-		<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-	<<if $args[0].balls > 0>>
-		<<set _slaveMultiplier -= 0.2>>
-	<</if>>
-	<<if $args[0].vagina > 0>>
-		<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-	<<if $args[0].ovaries > 0>>
-		<<set _slaveMultiplier -= 0.5>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSGenderFundamentalistSMR != 0>>
-	<<if $args[0].dick > 0>>
-	<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-	<<if $args[0].balls > 0>>
-	<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSGenderRadicalist != "unset">>
-	<<if $args[0].dick > 0>>
-	<<set _slaveMultiplier += 0.1>>
-	<</if>>
-	<<if $args[0].balls > 0>>
-	<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-<</if>>
-<<if $arcologies[0].FSArabianRevivalist > 50>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-
-<<if $args[0].career != 0>>
-	<<if $args[0].career == "a slave">>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.bodyguardCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.wardenessCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.attendantCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.matronCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.schoolteacherCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.stewardessCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.milkmaidCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.farmerCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.madamCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.DJCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.HGCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.recruiterCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.1>>
-	<<elseif setup.entertainmentCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.05>>
-	<<elseif setup.whoreCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.05>>
-	<<elseif setup.gratefulCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.05>>
-	<<elseif setup.menialCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.05>>
-	<<elseif setup.servantCareers.includes($args[0].career)>>
-	<<set _slaveMultiplier += 0.05>>
-	<</if>>
-<</if>>
-<<if ($week-$args[0].weekAcquired >= 20) && ($args[0].entertainSkill >= 100)>>
-<<if setup.entertainmentCareers.includes($args[0].career)>>
-<<else>>
-	<<set _slaveMultiplier += 0.05>>
-<</if>>
-<</if>>
-<<if ($args[0].oralCount + $args[0].analCount + $args[0].vaginalCount + $args[0].mammaryCount + $args[0].penetrativeCount > 1000)>>
-<<if setup.whoreCareers.includes($args[0].career)>>
-<<else>>
-	<<set _slaveMultiplier += 0.05>>
-<</if>>
-<</if>>
-
-<<if !setup.bodyguardCareers.includes($activeSlave.career) && $activeSlave.skillBG >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.wardenessCareers.includes($activeSlave.career) && $activeSlave.skillWA >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.attendantCareers.includes($activeSlave.career) && $activeSlave.skillAT >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.matronCareers.includes($activeSlave.career) && $activeSlave.skillMT >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.schoolteacherCareers.includes($activeSlave.career) && $activeSlave.skillTE >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.stewardessCareers.includes($activeSlave.career) && $activeSlave.skillST >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.milkmaidCareers.includes($activeSlave.career) && $activeSlave.skillMM >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.farmerCareers.includes($activeSlave.career) && $activeSlave.skillFA >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.madamCareers.includes($activeSlave.career) && $activeSlave.skillMD >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.DJCareers.includes($activeSlave.career) && $activeSlave.skillDJ >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.HGCareers.includes($activeSlave.career) && $activeSlave.skillHG >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.recruiterCareers.includes($activeSlave.career) && $activeSlave.skillRC >= $masteredXP>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-<<if !setup.servantCareers.includes($activeSlave.career) && $activeSlave.skillS >= $masteredXP>>
-	<<set _slaveMultiplier += 0.05>>
-<</if>>
-<<if !setup.entertainmentCareers.includes($activeSlave.career) && $activeSlave.skillE >= $masteredXP>>
-	<<set _slaveMultiplier += 0.05>>
-<</if>>
-<<if !setup.whoreCareers.includes($activeSlave.career) && $activeSlave.skillW >= $masteredXP>>
-	<<set _slaveMultiplier += 0.05>>
-<</if>>
-
-<<if $seeAge == 1>>
-<<if $args[0].physicalAge == $minimumSlaveAge && $args[0].physicalAge == $fertilityAge && canGetPregnant($args[0]) && ($arcologies[0].FSRepopulationFocus != "unset" || $arcologies[0].FSGenderFundamentalist != "unset")>>
-	<<if $args[0].birthWeek == 0>>
-	<<set _slaveMultiplier -= 0.4>>
-	<<elseif $args[0].birthWeek < 4>>
-	<<set _slaveMultiplier -= 0.1>>
-	<</if>>
-<<elseif $args[0].physicalAge == $minimumSlaveAge>>
-	<<if $args[0].birthWeek == 0>>
-		<<set _slaveMultiplier -= 0.2>>
-	<<elseif $args[0].birthWeek < 4>>
-		<<set _slaveMultiplier -= 0.05>>
-	<</if>>
-<<elseif $args[0].physicalAge == $fertilityAge && canGetPregnant($args[0]) && ($arcologies[0].FSRepopulationFocus != "unset" || $arcologies[0].FSGenderFundamentalist != "unset")>>
-	<<if $args[0].birthWeek == 0>>
-	<<set _slaveMultiplier -= 0.2>>
-	<<elseif $args[0].birthWeek < 4>>
-	<<set _slaveMultiplier -= 0.05>>
-	<</if>>
-<</if>>
-<</if>>
-
-<<if $args[0].amp == 1>>
-	<<set _slaveMultiplier -= 0.2>>
-<</if>>
-
-<<if $args[0].eyes == -2>>
-	<<set _slaveMultiplier -= 0.2>>
-<</if>>
-
-<<if $args[0].indenture > -1>>
-	<<set _slaveMultiplier -= 0.1*$args[0].indentureRestrictions>>
-	<<set _slaveMultiplier -= (260-$args[0].indenture)/260>>
-<<elseif $seeAge == 1>>
-<<if $args[0].actualAge >= ($retirementAge-5) && $PhysicalRetirementAgePolicy != 1>>
-	<<set _age = 52*($retirementAge-$args[0].actualAge)>>
-	<<set _slaveMultiplier = _slaveMultiplier*(_age/260)>>
-<</if>>
-<<if $args[0].physicalAge >= ($retirementAge-5) && $PhysicalRetirementAgePolicy == 1>>
-	<<set _age = 52*($retirementAge-$args[0].physicalAge)>>
-	<<set _slaveMultiplier = _slaveMultiplier*(_age/260)>>
-<</if>>
-<</if>>
-
-<<set $slaveCost = ($slaveCost*_slaveMultiplier*50)>>
-<<set $slaveCost = Number($slaveCost) || 0>>
-
-<<if $slaveCost < $minimumSlaveCost>>
-	<<set $slaveCost = $minimumSlaveCost>>
-<<elseif $slaveCost <= 100000>>
-<<elseif $slaveCost <= 200000>>
-	<<set $slaveCost -= (($slaveCost-100000)*0.1)>>
-<<elseif $slaveCost <= 300000>>
-	<<set $slaveCost -= 10000 + (($slaveCost-200000)*0.2)>>
-<<elseif $slaveCost <= 400000>>
-	<<set $slaveCost -= 30000 + (($slaveCost-300000)*0.3)>>
-<<elseif $slaveCost <= 500000>>
-	<<set $slaveCost -= 60000 + (($slaveCost-400000)*0.4)>>
-<<else>>
-	<<set $slaveCost -= 100000 + (($slaveCost-500000)*0.5)>>
-<</if>>
-<<if $slaveCost < 1000>>
-	<<set $slaveCost = 1000>>
-<</if>>
-
-<<set $slaveCost = 500*Math.trunc($slaveCost/500)>>
-
+	<<set $slaveCost = slaveCost($args[0])>>
 <</widget>>
 
 /%
@@ -377,52 +10,5 @@
  Fires <<slaveCost>> and adds punishment multipliers for starting with trained and/or devoted slaves.
 %/
 <<widget "StartingSlaveCost">>
-
-<<slaveCost $args[0]>>
-
-<<set _slaveMultiplier = 0>>
-
-<<if $args[0].devotion > 20>>
-	<<set _slaveMultiplier += (0.000117*($args[0].devotion-20)*($args[0].devotion-20))+(0.003167*($args[0].devotion-20))>>
-<</if>>
-
-<<if $args[0].whoreSkill>>
-	<<set _slaveMultiplier += 0.00001*$args[0].whoreSkill*$args[0].whoreSkill>>
-<</if>>
-<<if $args[0].entertainSkill>>
-	<<set _slaveMultiplier += 0.00001*$args[0].entertainSkill*$args[0].entertainSkill>>
-<</if>>
-<<if $args[0].vaginalSkill>>
-	<<set _slaveMultiplier += 0.00001*$args[0].vaginalSkill*$args[0].vaginalSkill>>
-<</if>>
-<<if $args[0].analSkill>>
-	<<set _slaveMultiplier += 0.00001*$args[0].analSkill*$args[0].analSkill>>
-<</if>>
-<<if $args[0].oralSkill>>
-	<<set _slaveMultiplier += 0.00001*$args[0].oralSkill*$args[0].oralSkill>>
-<</if>>
-<<if $args[0].combatSkill>>
-	<<set _slaveMultiplier += 0.1>>
-<</if>>
-
-<<if _slaveMultiplier>>
-	<<if $args[0].actualAge > 25>>
-		<<set _slaveMultiplier -= _slaveMultiplier*($args[0].actualAge-25)*0.05>>
-	<</if>>
-<</if>>
-
-<<if $args[0].prestige>>
-	<<set _slaveMultiplier += $args[0].prestige>>
-<</if>>
-
-<<if _slaveMultiplier>>
-	<<set _slaveMultiplier = Math.clamp(_slaveMultiplier,0,10)>>
-	<<set $slaveCost += $slaveCost*_slaveMultiplier>>
-	<<set $slaveCost = 500*Math.trunc($slaveCost/500)>>
-<</if>>
-
-<<if $PC.career == "slaver">>
-	<<set $slaveCost = $slaveCost*.5>>
-<</if>>
-
+	<<set $slaveCost = startingSlaveCost($args[0])>>
 <</widget>>