diff --git a/js/utils.js b/js/utils.js
index 88bee3fcfd49b26519c4b38ad4ea1e4f6c9ca318..3a3692d0dc26bc03ea93e79d0d649fc83a4a189b 100644
--- a/js/utils.js
+++ b/js/utils.js
@@ -351,14 +351,16 @@ function sortArrayByArray(sorted, unsorted, key) {
  */
 function deepAssign(target, source) {
 	function isObject(o) {
-		return (o !== undefined && typeof o === 'object' && !Array.isArray(o));
+		return (o !== undefined && o !== null && typeof o === 'object' && !Array.isArray(o));
 	}
 
 	if (isObject(target) && isObject(source)) {
 		for (const key in source) {
 			if (!source.hasOwnProperty(key)) { continue; }
 			if (isObject(source[key])) {
-				if (!target.hasOwnProperty(key)) { target[key] = {}; }
+				if (!target.hasOwnProperty(key) || !isObject(target[key])) {
+					target[key] = {};
+				}
 				deepAssign(target[key], source[key]);
 			} else {
 				Object.assign(target, {
diff --git a/src/js/heroCreator.js b/src/js/heroCreator.js
index 8c3cbf55e69723e402d8c12a79f00faeb810b12d..15102be130344723f7dbacdea935cbc94af17957 100644
--- a/src/js/heroCreator.js
+++ b/src/js/heroCreator.js
@@ -65,11 +65,6 @@ App.Utils.getHeroSlave = function(heroSlave) {
 		}
 	}
 
-	let albinismOverride = null;
-	if (heroSlave.albinismOverride !== null) {
-		albinismOverride = heroSlave.albinismOverride;
-		delete heroSlave.albinismOverride;
-	}
 	if (!heroSlave.hasOwnProperty("birthWeek")) {
 		heroSlave.birthWeek = random(0, 51);
 	}
@@ -111,7 +106,6 @@ App.Utils.getHeroSlave = function(heroSlave) {
 	deepAssign(newSlave, heroSlave);
 	V.heroSlaveID = heroSlave.ID;
 	newSlave.ID = generateSlaveID();
-	newSlave.albinismOverride = albinismOverride;
 	repairLimbs(newSlave);
 	generatePuberty(newSlave);
 	newSlave.weekAcquired = V.week;
diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js
index 8a52282cc21b5c2338bf0b2b2cf919d4ed1231e0..af87a9660865fd2d8edb6517642a13fd67e80450 100644
--- a/src/js/slaveCostJS.js
+++ b/src/js/slaveCostJS.js
@@ -2690,3 +2690,19 @@ window.slaveCostBeauty = (function() {
 window.startingSlaveCost = function startingSlaveCost(slave) {
 	return slaveCost(slave, true);
 };
+
+/**
+ * Calculates the expected cost for a hero slave.
+ * @param {App.Entity.SlaveState} slave
+ * @param {number} costFloor - if a slave is worth less than this amount, add between 1/2 and 3/2 this much to it
+ * @returns {number}
+ */
+window.heroSlaveCost = function(slave, costFloor) {
+	V.specialSlavesPriceOverride = 1; // TODO: this probably shouldn't be a global
+	let cost = (10*Math.trunc((slaveCost(slave)/10)*2));
+	V.specialSlavesPriceOverride = 0;
+	if (cost < costFloor) {
+		cost += jsRandom(Math.trunc(costFloor / 2000), Math.trunc((costFloor * 3) / 2000)) * 1000;
+	}
+	return cost;
+};
diff --git a/src/uncategorized/completeCatalog.tw b/src/uncategorized/completeCatalog.tw
index 2fe58952f8a3c60df8e4070a111d92811655b2a0..6a05425d47d027d38e94b1facb0bd1c531e69d4f 100644
--- a/src/uncategorized/completeCatalog.tw
+++ b/src/uncategorized/completeCatalog.tw
@@ -22,13 +22,7 @@
 <p>
 	<<set $saleDescription = 1>>
 	<<include "Long Slave Description">>
-	<<set $specialSlavesPriceOverride = 1>>
-	<<set _slaveCost = slaveCost($activeSlave)>>
-	<<set $specialSlavesPriceOverride = 0>>
-	<<set _slaveCost = (10*Math.trunc((_slaveCost/10)*2))>>
-	<<if _slaveCost < 40000>>
-		<<set _slaveCost += random(20000,60000)>>
-	<</if>>
+	<<set _slaveCost = heroSlaveCost($activeSlave, 40000)>>
 </p>
 
 <p>
diff --git a/src/uncategorized/specialSlave.tw b/src/uncategorized/specialSlave.tw
index 9cb6971c02221c3ba5aafd8a8b18dd1d0b89f9db..f80618a5f1a1f2f04dac2f018f4580fe4a04668e 100644
--- a/src/uncategorized/specialSlave.tw
+++ b/src/uncategorized/specialSlave.tw
@@ -10,12 +10,7 @@
 
 	<<run slaveSortMinor(_heroSlaves)>>
 	<<set $activeSlave = App.Utils.getHeroSlave(_heroSlaves.random())>>
-	<<set $specialSlavesPriceOverride = 1>>
-	<<set _slaveCost = slaveCost($activeSlave)>>
-	<<set _slaveCost = (10*Math.trunc((_slaveCost/10)*2))>>
-	<<if _slaveCost < 20000>>
-		<<set _slaveCost += random(5000,30000)>>
-	<</if>>
+	<<set _slaveCost = heroSlaveCost($activeSlave, 20000)>>
 	<<setLocalPronouns $activeSlave>>
 
 	You review a piece of merchandise via video call, making a few lewd demands to gauge $his obedience. The background of the video feed is luxurious and plush; somewhere offscreen someone is moaning rapturously.
@@ -37,6 +32,5 @@
 	<br><br>
 
 	<<set $saleDescription = 1>><<include "Long Slave Description">>
-	<<set $specialSlavesPriceOverride = 0>>
 
 <</if>>