diff --git a/src/js/assayJS.js b/src/js/assayJS.js
index 3f11597c4fdb1d519200be7d317fb23bbf054f6d..15d5e0cde48d8a0877d0184b8bdd1be60c152e93 100644
--- a/src/js/assayJS.js
+++ b/src/js/assayJS.js
@@ -187,6 +187,36 @@ window.newSlave = function newSlave(slave) {
 		V.REReductionCheckinIDs.push(slave.ID);
 	}
 
+	if (slave.genes === "XX") {
+		if (slave.pubertyXX === 1) {
+			if (slave.pubertyXY === 1) {
+				slave.hormoneBalance = 20;
+			} else {
+				slave.hormoneBalance = 60;
+			}
+		} else {
+			if (slave.pubertyXY === 1) {
+				slave.hormoneBalance = -20;
+			} else {
+				slave.hormoneBalance = 20;
+			}
+		}
+	} else if (slave.genes === "XY") {
+		if (slave.pubertyXX === 1) {
+			if (slave.pubertyXY === 1) {
+				slave.hormoneBalance = 20;
+			} else {
+				slave.hormoneBalance = 40;
+			}
+		} else {
+			if (slave.pubertyXY === 1) {
+				slave.hormoneBalance = -40;
+			} else {
+				slave.hormoneBalance = 20;
+			}
+		}
+	}
+	
 	generatePronouns(slave);
 	SetBellySize(slave);
 	addSlave(slave);
diff --git a/src/uncategorized/saDiet.tw b/src/uncategorized/saDiet.tw
index 485c31af616580420f3a5aed3ea13634dceee514..3615f2653252c77991f6a6df5f030d01955883fa 100644
--- a/src/uncategorized/saDiet.tw
+++ b/src/uncategorized/saDiet.tw
@@ -1,7 +1,7 @@
 :: SA diet [nobr]
 
 /* quirk modifiers */
-<<set _rearQuirk = $slaves[$i].geneticQuirks.rearLipedema == 2 ? 2 : 0>>
+<<set _rearQuirk = $slaves[$i].geneticQuirks.rearLipedema == 2 ? 2 : 1>>
 <<set _gigantomastiaMod = $slaves[$i].geneticQuirks.gigantomastia == 2 ? ($slaves[$i].geneticQuirks.macromastia == 2 ? 3 : 2) : 1>>
 
 <<if $slaves[$i].fuckdoll == 0>>
@@ -15,7 +15,6 @@
 <<switch $slaves[$i].diet>>
 <<case "restricted">> /* Weight Loss */
 	<<set _weightLoss = 5>>
-	<<set _assetLoss = 5>>
 	<<if $slaves[$i].fetish != "mindbroken">>
 		<<if ($slaves[$i].behavioralFlaw == "anorexic")>>
 			<<if ($slaves[$i].devotion >= -20)>>
@@ -43,18 +42,15 @@
 								<<if random(1,100) > 50>>
 									$His @@.mediumorchid;disgusting diet@@ is little more than human ejaculate infused with nutritional supplements, and $he's unable to hold most of it down.
 									<<set _weightLoss = 8>>
-									<<set _assetLoss = 4>>
 									<<set $slaves[$i].devotion -= 4>>
 								<<else>>
 									Despite $his food being filled with large amounts of thick, human ejaculate, $he manages to choke down enough that $he doesn't get sick from malnourishment.
 									<<set _weightLoss = 6>>
-									<<set _assetLoss = 4>>
 									<<set $slaves[$i].devotion -= 2>>
 								<</if>>
 							<<else>>
 								The phallic feeders inject $his food directly into $his stomach, helping $him get $his prescribed servings so that $his weight loss is safe and consistent. However, the unmistakable taste of cum $he burps up afterward @@.mediumorchid;nauseates@@ and @@.gold;unnerves@@ $him.
 								<<set _weightLoss = 5>>
-								<<set _assetLoss = 5>>
 								<<set $slaves[$i].devotion -= 3>>
 								<<set $slaves[$i].trust -= 1>>
 							<</if>>
@@ -63,18 +59,15 @@
 								<<if random(1,100) < 20>>
 									$He is @@.mediumorchid;troubled@@ by the use of human ejaculate as a food additive, and $he has a problem keeping all of $his food down.
 									<<set _weightLoss = 7>>
-									<<set _assetLoss = 4>>
 									<<set $slaves[$i].devotion -= 2>>
 								<<else>>
 									Despite having human ejaculate added to $his food, $he manages to choke it down this week, @@.mediumorchid;but it's a struggle.@@
 									<<set _weightLoss = 5>>
-									<<set _assetLoss = 5>>
 									<<set $slaves[$i].devotion -= 2>>
 								<</if>>
 							<<else>>
 								The phallic feeders inject $his food directly into $his stomach, helping $him get $his prescribed servings so that $his weight loss is safe and consistent. However, the thought of being force-fed food with ejaculate in it @@.mediumorchid;disturbs $him.@@
 								<<set _weightLoss = 5>>
-								<<set _assetLoss = 5>>
 								<<set $slaves[$i].devotion -= 3>>
 							<</if>>
 						<</if>>
@@ -117,29 +110,49 @@
 	<<elseif _weightLoss == 5>>
 		$He @@.lime;loses weight.@@
 	<</if>>
+	<<set _weightLoss += $feeder*2>>
 	<<if $slaves[$i].weightDirection == -1>>
-		<<set $slaves[$i].weight -= (_weightLoss+3)+($feeder*2)>>
+		<<set $slaves[$i].weight -= (_weightLoss+3)>>
 	<<elseif $slaves[$i].weightDirection == 1>>
-		<<set $slaves[$i].weight -= (_weightLoss-3)+($feeder)>>
+		<<set $slaves[$i].weight -= (_weightLoss-3)-($feeder)>>
 	<<else>>
-		<<set $slaves[$i].weight -= _weightLoss+($feeder*2)>>
-	<</if>>
-	<<if $slaves[$i].boobs-$slaves[$i].boobsImplant-$slaves[$i].boobsMilk >= 200 && _gigantomastiaMod != 3>>
-		<<if (($slaves[$i].geneMods.NCS == 0) && (random(1,_assetLoss*_gigantomastiaMod) <= 1+$feeder))>>
-			@@.orange;$His breasts get a little smaller.@@
-			<<set $slaves[$i].boobs -= 50>>
-		<<elseif (($slaves[$i].geneMods.NCS == 1) && (random(-_assetLoss, _assetLoss - 2) <= 1+$feeder))>>
-			@@.orange;$His breasts get smaller.@@
-			<<set $slaves[$i].boobs -= 100>>
-		<</if>>
-	<</if>>
-	<<if $slaves[$i].butt > 1>>
-		<<if (($slaves[$i].geneMods.NCS == 0) && (random(1,_assetLoss+_rearQuirk) <= 1+$feeder))>>
-			@@.orange;$His butt gets a little smaller.@@
-			<<set $slaves[$i].butt -= 1>>
-		<<elseif (($slaves[$i].geneMods.NCS == 1) && ($slaves[$i].butt > 2) && (random(-_assetLoss, _assetLoss - 2 + _rearQuirk) <= 1+$feeder))>>
+		<<set $slaves[$i].weight -= _weightLoss>>
+	<</if>>
+	<<set _effSize = ($slaves[$i].boobs-$slaves[$i].boobsImplant-$slaves[$i].boobsMilk)>>
+	<<if $slaves[$i].hormoneBalance > 30 && $slaves[$i].geneMods.NCS != 0>>		/* 'Expected' breast size based on weight for feminine-bodied slaves */
+		<<set _growthgoal = 100 + Math.trunc((($slaves[$i].weight + 100)*5 + 2*$slaves[$i].lactationAdaptation)*(0.85+$slaves[$i].hormoneBalance/400)*_gigantomastiaMod)>>
+		<<set _roll = 300>>
+		<<set _target = Math.trunc(Math.clamp(_weightLoss*20 + (_effSize - _growthgoal)/5,0,270))>>
+	<<else>>		/* For masculine- and childish-bodied slaves */
+		<<set _growthgoal = (($slaves[$i].weight + 100)*2 + $slaves[$i].lactationAdaptation)*_gigantomastiaMod>>
+		<<set _roll = 75>>
+		<<set _target = Math.trunc(Math.clamp(_weightLoss*2 + (_effSize - _growthgoal)/20,0,68))>>
+	<</if>>
+	<<set _rollresult = random(1,_roll)>>
+	<<if _rollresult <= _target/2 && (_gigantomastiaMod != 3 && $slaves[$i].boobs >= 100)>>
+		@@.orange;$His breasts get smaller.@@
+		<<set $slaves[$i].boobs -= 100>>
+	<<elseif _rollresult <= _target && (_gigantomastiaMod != 3 && $slaves[$i].boobs >= 100)>>
+		@@.orange;$His breasts get a little smaller.@@
+		<<set $slaves[$i].boobs -= 50*(1 + $slaves[$i].geneMods.NCS)>>
+	<</if>>
+	<<set _effSize = ($slaves[$i].butt-$slaves[$i].buttImplant)>>
+		<<if $slaves[$i].hormoneBalance > 30>>		/* 'Expected' butt size based on weight for feminine-bodied slaves, scaled up by 1000 */
+		<<set _growthgoal = Math.trunc(($slaves[$i].weight + 100)*25*(0.9+$slaves[$i].hormoneBalance/600)*_rearQuirk)>>
+		<<set _roll = 40000>>
+		<<set _target = Math.trunc(Math.clamp(_weightLoss*1000 + (_effSize*1000 - _growthgoal)*2,0,36000))>>
+	<<else>>		/* For masculine- and childish-bodied slaves, likewise scaled up */
+		<<set _growthgoal = Math.trunc(($slaves[$i].weight + 100)*12.5)*_rearQuirk>>
+		<<set _roll = 80000>>
+		<<set _target = Math.trunc(Math.clamp(_weightLoss*1000 + (_effSize*1000 - _growthgoal)*4,0,72000))>>
+	<</if>>
+	<<if random(1,_roll) <= _target && $slaves[$i].butt > 0>>
+		<<if (($slaves[$i].geneMods.NCS == 1) && ($slaves[$i].butt > 2))>>
 			@@.orange;$His butt gets smaller.@@
 			<<set $slaves[$i].butt -= 2>>
+		<<else>>
+			@@.orange;$His butt gets a little smaller.@@
+			<<set $slaves[$i].butt -= 1>>
 		<</if>>
 	<</if>>
 	<<if ($slaves[$i].weight < -95)>>
@@ -148,7 +161,6 @@
 	<</if>>
 <<case "fattening">> /* Weight Gain */
 	<<set _weightGain = 5>>
-	<<set _assetGain = 5>>
 	<<if $slaves[$i].fetish != "mindbroken">>
 		<<if ($slaves[$i].behavioralFlaw == "anorexic")>>
 			Suffering from anorexia, @@.mediumorchid;$he is intensely resentful of being overfed.@@
@@ -181,14 +193,12 @@
 								<<else>>
 									Despite $his food being filled with large amounts of human ejaculate, $he manages to keep some of it down, but @@.mediumorchid;$he hates you for it.@@
 									<<set _weightGain = 2>>
-									<<set _assetGain = 10>>
 									<<set $slaves[$i].devotion -= 2>>
 								<</if>>
 							<<else>>
 								<<if random(1,100) < 30>>
 									The phallic feeders inject $his food directly into $his stomach, helping $him get the extra calories $he's been prescribed, but the @@.mediumorchid;ejaculate based food is so heavy in $his tummy@@ that $he loses a tiny bit of $his intake to post-meal nausea.
 									<<set _weightGain = 4>>
-									<<set _assetGain = 6>>
 									<<set $slaves[$i].devotion -= 4>>
 								<<else>>
 									The phallic feeders inject $his food directly into $his stomach, ensuring that $he gets all of $his prescribed calories, and @@.mediumorchid;despite some intense nausea afterwards,@@ $he's able to keep $his heavy cum diet down.
@@ -204,7 +214,6 @@
 								<<else>>
 									Despite $his food <<if canTaste($slaves[$i])>>tasting<<elseif canSmell($slaves[$i])>>smelling<<else>>reminding $him<</if>> strongly of cum, $he manages to choke down most of it this week, @@.mediumorchid;but $he resents being a cum-fed whore.@@
 									<<set _weightGain = 3>>
-									<<set _assetGain = 8>>
 									<<set $slaves[$i].devotion -= 2>>
 								<</if>>
 							<<else>>
@@ -242,7 +251,6 @@
 							<<if ($cockFeeder == 0)>>
 								Despite $his food being based on huge quantities of breast milk, $he manages to keep most of it down, but @@.mediumorchid;$he hates you for it.@@
 								<<set _weightGain = 2>>
-								<<set _assetGain = 10>>
 								<<set $slaves[$i].devotion -= 2>>
 							<<else>>
 								The phallic feeders inject $his food directly into $his stomach, ensuring that $he gets all of $his prescribed calories, and @@.mediumorchid;despite some intense nausea afterwards,@@ $he's able to keep $his heavy milk diet down.
@@ -252,7 +260,6 @@
 							<<if ($cockFeeder == 0)>>
 								Despite $his food <<if canTaste($slaves[$i])>>tasting<<elseif canSmell($slaves[$i])>>smelling<<else>>reminding $him<</if>> strongly of human breast milk, $he manages to choke down most of it this week, @@.mediumorchid;but $he resents being a milk-fed whore.@@
 								<<set _weightGain = 3>>
-								<<set _assetGain = 8>>
 								<<set $slaves[$i].devotion -= 2>>
 							<<else>>
 								The phallic feeders inject $his food directly into $his stomach, helping $him get $his prescribed calories, even though @@.mediumorchid;$he hates the idea of being force-fed human milk.@@
@@ -288,7 +295,6 @@
 					$His diet is almost pure human ejaculate with nutritional additives<<if $slaves[$i].behavioralFlaw == "anorexic">>. Despite $his desire to remain thin, $his cum addiction is even more powerful.<<else>> — the perfect food for a cum addict.<</if>> $He gets extra food this week. $He makes a sloppy mess at feeding time, getting cum all over $himself, and $he is unashamed of $his pathological need to be your cum-fed slut. @@.hotpink;$He's a happy little cum-piggy.@@ The only drawback is that some of $his food ends up on $him, rather than in $him.
 					<<set $slaves[$i].devotion += 3>>
 					<<set _weightGain = 4>>
-					<<set _assetGain = 6>>
 				<<elseif $slaves[$i].dietCum == 1>>
 					$His food is infused with ejaculate, <<if $slaves[$i].behavioralFlaw == "anorexic">>and $his cum addiction trumps $his desire to remain thin. S<<else>>and s<</if>>he is @@.hotpink;thrilled to get extra this week.@@ $He gobbles down every last drop like the happy <<if $slaves[$i].weight < 0>>little <<else>>chubby <</if>>cum addict $he is.
 					<<set $slaves[$i].devotion += 2>>
@@ -305,29 +311,51 @@
 			$He gains a little weight, but $his progress was severely limited by what $he was forced to eat, @@.gold;making for an anxious week for $him.@@
 			<<set $slaves[$i].trust -= 1>>
 		<</if>>
-		<<if ($slaves[$i].geneMods.NCS == 1)>>
-			<<set _assetGain = Math.trunc(_assetGain * 2)>>
-		<</if>>
+		<<set _weightGain += $feeder*2>>
 		<<if $slaves[$i].weightDirection == -1>>
-			<<set $slaves[$i].weight += Math.max((_weightGain-3)+($feeder), 1)>>
+			<<set $slaves[$i].weight += Math.max((_weightGain-3)-($feeder), 1)>>
 		<<elseif $slaves[$i].weightDirection == 1>>
-			<<set $slaves[$i].weight += (_weightGain+3)+($feeder*2)>>
+			<<set $slaves[$i].weight += _weightGain+3>>
 		<<else>>
-			<<set $slaves[$i].weight += _weightGain+($feeder*2)>>
+			<<set $slaves[$i].weight += _weightGain>>
+		<</if>>
+		<<set _effSize = ($slaves[$i].boobs-$slaves[$i].boobsImplant-$slaves[$i].boobsMilk)>>
+		<<if $slaves[$i].hormoneBalance > 30 && $slaves[$i].geneMods.NCS != 1>>		/* 'Expected' breast size based on weight for feminine-bodied slaves */
+			<<set _growthgoal = 100 + Math.trunc((($slaves[$i].weight + 100)*5 + 2*$slaves[$i].lactationAdaptation)*(0.85+$slaves[$i].hormoneBalance/400)*_gigantomastiaMod)>>
+			<<set _roll = 300>>
+			<<set _target = Math.trunc(Math.clamp(_weightGain*20 - (_effSize - _growthgoal)/5,0,270))>>
+		<<else>>		/* For masculine- and childish-bodied slaves */
+			<<set _growthgoal = (($slaves[$i].weight + 100)*2 + $slaves[$i].lactationAdaptation)*_gigantomastiaMod>>
+			<<set _roll = 75>>
+			<<set _target = Math.trunc(Math.clamp(_weightGain*2 - (_effSize - _growthgoal)/20,0,68))>>
+		<</if>>
+		<<if ($slaves[$i].geneMods.NCS == 1)>>
+			<<set _roll = Math.trunc(_roll * 2)>>
 		<</if>>
-		<<if random(1,_assetGain) <= 1+$feeder>>
+		<<set _rollresult = random(1,_roll)>>
+		<<if _rollresult <= _target/2>>
+			@@.lime;$His breasts get bigger.@@
+			<<set $slaves[$i].boobs += 100/(1 + $slaves[$i].geneMods.NCS)>>
+		<<elseif _rollresult <= _target>>
 			@@.lime;$His breasts get a little bigger.@@
-			<<if ($slaves[$i].geneMods.NCS == 0)>>
-				<<set $slaves[$i].boobs += 50>>
-			<<else>>
-				<<set $slaves[$i].boobs += 25>>
-			<</if>>
+			<<set $slaves[$i].boobs += 50/(1 + $slaves[$i].geneMods.NCS)>>
+		<</if>>
+		<<set _effSize = ($slaves[$i].butt-$slaves[$i].buttImplant)>>
+		<<if $slaves[$i].hormoneBalance > 30>>		/* 'Expected' butt size based on weight for feminine-bodied slaves, scaled up by 1000 */
+			<<set _growthgoal = Math.trunc(($slaves[$i].weight + 100)*25*(0.9+$slaves[$i].hormoneBalance/600)*_rearQuirk)>>
+			<<set _roll = 40000>>
+			<<set _target = Math.trunc(Math.clamp(_weightGain*1000 - (_effSize*1000 - _growthgoal)*2,0,36000))>>
+		<<else>>		/* For masculine- and childish-bodied slaves, likewise scaled up */
+			<<set _growthgoal = Math.trunc(($slaves[$i].weight + 100)*12.5)*_rearQuirk>>
+			<<set _roll = 80000>>
+			<<set _target = Math.trunc(Math.clamp(_weightGain*1000 - (_effSize*1000 - _growthgoal)*4,0,72000))>>
 		<</if>>
-		<<if $slaves[$i].butt < 10>>
-			<<if random(1,_assetGain-_rearQuirk) <= 1+$feeder>>
-				@@.lime;$His butt gets a little bigger.@@
-				<<set $slaves[$i].butt += 1>>
-			<</if>>
+		<<if ($slaves[$i].geneMods.NCS == 1)>>
+			<<set _roll = Math.trunc(_roll * 2)>>
+		<</if>>
+		<<if random(1,_roll) <= _target>>
+			@@.lime;$His butt gets a little bigger.@@
+			<<set $slaves[$i].butt += 1>>
 		<</if>>
 		<<if $slaves[$i].weight > 200>>
 			$He is now quite fat, so $his diet @@.yellow;has defaulted to maintenance of this weight.@@