From d4250f8034d852867f32070060eceefd20be9cf4 Mon Sep 17 00:00:00 2001
From: Pregmodder <pregmodder@gmail.com>
Date: Thu, 30 May 2019 10:24:04 -0400
Subject: [PATCH] genetic quirk androgyny

---
 src/js/generateGenetics.js             | 47 +++++++++++++++++++++-----
 src/js/generateNewSlaveJS.js           | 18 ++++++++++
 src/js/physicalDevelopment.js          | 29 +++++++++++++++-
 src/uncategorized/remoteSurgery.tw     |  2 --
 src/uncategorized/saDiet.tw            |  1 -
 src/uncategorized/saHormoneEffects.tw  | 36 +++++++++++---------
 src/uncategorized/saLongTermEffects.tw | 28 ++++++++++-----
 src/utility/descriptionWidgets.tw      |  4 +--
 8 files changed, 127 insertions(+), 38 deletions(-)

diff --git a/src/js/generateGenetics.js b/src/js/generateGenetics.js
index 52c52af71f3..eddab7de4fa 100644
--- a/src/js/generateGenetics.js
+++ b/src/js/generateGenetics.js
@@ -92,7 +92,7 @@ window.generateGenetics = (function() {
 		genes.race = setRace(father, mother, actor2);
 		genes.intelligence = setIntelligence(father, mother, activeMother, actor2);
 		genes.face = setFace(father, mother, activeMother, actor2, genes.geneticQuirks);
-		genes.faceShape = setFaceShape(father, mother);
+		genes.faceShape = setFaceShape(father, mother, genes.geneticQuirks);
 		genes.eyeColor = setEyeColor(father, mother, actor2);
 		if (genes.geneticQuirks.heterochromia === 2) {
 			genes.geneticQuirks.heterochromia = setHeterochromaticEyeColor(father, mother, actor2);
@@ -664,9 +664,11 @@ window.generateGenetics = (function() {
 	}
 
 	// face shape
-	function setFaceShape(father, mother) {
+	function setFaceShape(father, mother, genes) {
 		let shape;
-		if (father !== 0) {
+		if (genes.androgyny === 2) {
+			shape = "androgynous";
+		} else if (father !== 0) {
 			if (mother.faceShape === father.faceShape) {
 				shape = mother.faceShape;
 			} else {
@@ -988,7 +990,7 @@ window.generateGenetics = (function() {
 				} else {
 					quirks.rearLipedema = 1;
 				}
-			} else if (mother.geneticQuirks.rearLipedema === 1 + father.geneticQuirks.rearLipedema >= 3) {
+			} else if (mother.geneticQuirks.rearLipedema + father.geneticQuirks.rearLipedema >= 3) {
 				chance = jsRandom(1, 4);
 				if (chance <= 2) {
 					quirks.rearLipedema = 2;
@@ -1083,7 +1085,7 @@ window.generateGenetics = (function() {
 				} else {
 					quirks.mGain = 1;
 				}
-			} else if (mother.geneticQuirks.mGain === 1 + father.geneticQuirks.mGain >= 3) {
+			} else if (mother.geneticQuirks.mGain + father.geneticQuirks.mGain >= 3) {
 				chance = jsRandom(1, 4);
 				if (chance <= 2) {
 					quirks.mGain = 2;
@@ -1116,7 +1118,7 @@ window.generateGenetics = (function() {
 				} else {
 					quirks.mLoss = 1;
 				}
-			} else if (mother.geneticQuirks.mLoss === 1 + father.geneticQuirks.mLoss >= 3) {
+			} else if (mother.geneticQuirks.mLoss + father.geneticQuirks.mLoss >= 3) {
 				chance = jsRandom(1, 4);
 				if (chance <= 2) {
 					quirks.mLoss = 2;
@@ -1149,7 +1151,7 @@ window.generateGenetics = (function() {
 				} else {
 					quirks.wGain = 1;
 				}
-			} else if (mother.geneticQuirks.wGain === 1 + father.geneticQuirks.wGain >= 3) {
+			} else if (mother.geneticQuirks.wGain + father.geneticQuirks.wGain >= 3) {
 				chance = jsRandom(1, 4);
 				if (chance <= 2) {
 					quirks.wGain = 2;
@@ -1182,7 +1184,7 @@ window.generateGenetics = (function() {
 				} else {
 					quirks.wLoss = 1;
 				}
-			} else if (mother.geneticQuirks.wLoss === 1 + father.geneticQuirks.wLoss >= 3) {
+			} else if (mother.geneticQuirks.wLoss + father.geneticQuirks.wLoss >= 3) {
 				chance = jsRandom(1, 4);
 				if (chance <= 2) {
 					quirks.wLoss = 2;
@@ -1207,6 +1209,35 @@ window.generateGenetics = (function() {
 			}
 		}
 
+		// androgyny
+		if (father !== 0) {
+			if (mother.geneticQuirks.androgyny === 2 && father.geneticQuirks.androgyny === 2) {
+				quirks.androgyny = 2;
+			} else if (mother.geneticQuirks.androgyny + father.geneticQuirks.androgyny >= 3) {
+				chance = jsRandom(1, 4);
+				if (chance <= 2) {
+					quirks.androgyny = 2;
+				} else if (chance === 4) {
+					quirks.androgyny = 1;
+				}
+			} else if (mother.geneticQuirks.androgyny + father.geneticQuirks.androgyny >= 1) {
+				if (jsRandom(1, 4) === 1) {
+					quirks.androgyny = 2;
+				} else if (chance === 4) {
+					quirks.androgyny = 1;
+				}
+			}
+		} else if (mother.geneticQuirks.androgyny >= 1) {
+			if (jsRandom(0, 40000) >= 35000) {
+				chance = jsRandom(1, 4);
+				if (chance <= 2) {
+					quirks.androgyny = 1;
+				} else if (chance === 4) {
+					quirks.androgyny = 2;
+				}
+			}
+		}
+
 		return clone(quirks);
 	}
 
diff --git a/src/js/generateNewSlaveJS.js b/src/js/generateNewSlaveJS.js
index 469eb6a6822..df9f911a42d 100644
--- a/src/js/generateNewSlaveJS.js
+++ b/src/js/generateNewSlaveJS.js
@@ -1186,6 +1186,12 @@ window.GenerateNewSlave = (function() {
 		} else if (chance >= 18500) {
 			slave.geneticQuirks.wLoss = 1;
 		}
+		chance = jsRandom(1, 20000);
+		if (chance >= 19500) {
+			slave.geneticQuirks.androgyny = 2;
+		} else if (chance >= 19000) {
+			slave.geneticQuirks.androgyny = 1;
+		}
 	}
 
 	function generateXYGeneticQuirks() {
@@ -1264,6 +1270,12 @@ window.GenerateNewSlave = (function() {
 		} else if (chance >= 18500) {
 			slave.geneticQuirks.wLoss = 1;
 		}
+		chance = jsRandom(1, 20000);
+		if (chance >= 19200) {
+			slave.geneticQuirks.androgyny = 2;
+		} else if (chance >= 18500) {
+			slave.geneticQuirks.androgyny = 1;
+		}
 	}
 
 	function generateAge() {
@@ -1689,6 +1701,12 @@ window.GenerateNewSlave = (function() {
 			slave.weight = Math.clamp(slave.muscles, -100, 200);
 			slave.weightDirection = -1;
 		}
+		if (slave.geneticQuirks.androgyny === 2) {
+			slave.faceShape = "androgynous";
+			if (slave.face < 60) {
+				slave.face += 15;
+			}
+		}
 	}
 
 	return GenerateNewSlave;
diff --git a/src/js/physicalDevelopment.js b/src/js/physicalDevelopment.js
index 3c716196f81..92fcf5e2aed 100644
--- a/src/js/physicalDevelopment.js
+++ b/src/js/physicalDevelopment.js
@@ -15,7 +15,34 @@ window.physicalDevelopment = (function physicalDevelopment() {
 		if (slave.geneMods.NCS !== 1) {
 			/* NCS completely blocks all natural physical growth: no height increases. It also blocks all hormonal secondary sexual * characteristics. So, on the female side: no boobs, no butt, no hips, and no labia. And on the male side: no dick, no clit, no balls, no scrotum, no shoulders. */
 			/* so this is a big old NO-OP to skip the physical development. */
-			if (slave.genes === "XX") { /* loli becoming a woman */
+			if (slave.geneticQuirks.androgyny === 2) { /* takes a mix of both to create a very androgynous slave */
+				if (slave.geneticQuirks.dwarfism === 2 && slave.geneticQuirks.gigantism !== 2) {
+					increaseHeightDwarf(slave);
+				} else if (slave.geneticQuirks.gigantism === 2) {
+					increaseHeightGiant(slave);
+				} else {
+					increaseHeightXX(slave);
+				}
+				if (slave.boobs - slave.boobsImplant <= 300) {
+					increaseBoobsXX(slave);
+				}
+				if (slave.dick > 0 && (slave.dick < 3 || slave.geneticQuirks.wellHung === 2)) {
+					increaseDick(slave);
+				}
+				if (slave.balls > 0 && slave.balls < 3) {
+					increaseBalls(slave);
+				}
+				if (slave.waist < 10) {
+					increaseWaistXY(slave);
+				}
+				if (slave.hips - slave.hipsImplant < 0) {
+					increaseHipsXX(slave);
+				}
+				if (slave.butt - slave.buttImplant < 3) {
+					increaseButtXX(slave);
+				}
+				increasePregAdpatationXX(slave);
+			} else if (slave.genes === "XX") { /* loli becoming a woman */
 				if (slave.geneticQuirks.dwarfism === 2 && slave.geneticQuirks.gigantism !== 2) {
 					increaseHeightDwarf(slave);
 				} else if (slave.geneticQuirks.gigantism === 2) {
diff --git a/src/uncategorized/remoteSurgery.tw b/src/uncategorized/remoteSurgery.tw
index 318e7dac8c4..2a0d5d99598 100644
--- a/src/uncategorized/remoteSurgery.tw
+++ b/src/uncategorized/remoteSurgery.tw
@@ -1419,7 +1419,6 @@ $He has
 			<br>&nbsp;&nbsp;&nbsp;&nbsp;
 			[[Induced albinism treatment|Surgery Degradation][$activeSlave.geneticQuirks.albinism = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;albinism@@ in $his genetic code//
 		<</if>>
-		/*
 		<<if $activeSlave.geneticQuirks.androgyny == 2>>
 			<br>&nbsp;&nbsp;&nbsp;&nbsp;
 			[[Androgyny correction treatment|Surgery Degradation][$activeSlave.geneticQuirks.androgyny = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]]
@@ -1430,7 +1429,6 @@ $He has
 			<br>&nbsp;&nbsp;&nbsp;&nbsp;
 			[[Induced androgyny treatment|Surgery Degradation][$activeSlave.geneticQuirks.androgyny = 2,cashX(forceNeg($surgeryCost*10), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 40,$surgeryType = "gene treatment"]] //This will induce @@.orange;natural androgyny@@ in $his genetic code//
 		<</if>>
-		*/
 		<<if $activeSlave.geneticQuirks.dwarfism == 2>>
 			<br>&nbsp;&nbsp;&nbsp;&nbsp;
 			[[Dwarfism correction treatment|Surgery Degradation][$activeSlave.geneticQuirks.dwarfism = 0,cashX(forceNeg($surgeryCost*4), "slaveSurgery", $activeSlave), $activeSlave.health -= 40, $activeSlave.chem += 100,$surgeryType = "gene treatment"]]
diff --git a/src/uncategorized/saDiet.tw b/src/uncategorized/saDiet.tw
index 06208b5284e..8b2803275b6 100644
--- a/src/uncategorized/saDiet.tw
+++ b/src/uncategorized/saDiet.tw
@@ -888,7 +888,6 @@
 		<</if>>
 	<<else>>
 		$He doesn't really notice that @@.lime;$his body is being prepared to carry multiples,@@ other than the slight tingle in $his lower belly.
-		<<set $slaves[$i].devotion -= 2, $slaves[$i].trust++, $slaves[$i].health += 2>>
 		<<if $slaves[$i].attrXY < 70>>
 			$He certainly notices @@.green;how much more attractive men are,@@ however.
 			<<set $slaves[$i].attrXY += 2>>
diff --git a/src/uncategorized/saHormoneEffects.tw b/src/uncategorized/saHormoneEffects.tw
index 3d5e992144f..95c5a7ec0dd 100644
--- a/src/uncategorized/saHormoneEffects.tw
+++ b/src/uncategorized/saHormoneEffects.tw
@@ -100,7 +100,7 @@
 		<<if ($slaves[$i].faceShape == "masculine")>>
 			Hormonal effects cause @@.orange;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike <</if>>androgyny.@@
 			<<set $slaves[$i].faceShape = "androgynous">>
-		<<elseif ($slaves[$i].faceShape == "androgynous")>>
+		<<elseif ($slaves[$i].faceShape == "androgynous" && $slaves[$i].geneticQuirks.androgyny != 2)>>
 			Hormonal effects cause @@.lime;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike normalcy<<else>>femininity<</if>>.@@
 			<<set $slaves[$i].faceShape = "normal">>
 		<<elseif (($slaves[$i].geneMods.NCS == 1) && (random(1,100) > 50) && ($slaves[$i].faceShape == "normal"))>>
@@ -203,7 +203,7 @@
 		<<if ($slaves[$i].faceShape == "masculine")>>
 			Hormonal effects cause @@.orange;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike <</if>>androgyny.@@
 			<<set $slaves[$i].faceShape = "androgynous">>
-		<<elseif ($slaves[$i].faceShape == "androgynous")>>
+		<<elseif ($slaves[$i].faceShape == "androgynous" && $slaves[$i].geneticQuirks.androgyny != 2)>>
 			Hormonal effects cause @@.lime;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike normalcy<<else>>femininity<</if>>.@@
 			<<set $slaves[$i].faceShape = "normal">>
 		<<elseif (($slaves[$i].geneMods.NCS == 1) && (random(1,100) > 50) && ($slaves[$i].faceShape == "normal"))>>
@@ -305,7 +305,7 @@
 		<<if ($slaves[$i].faceShape == "masculine")>>
 			Hormonal effects cause @@.orange;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike <</if>>androgyny.@@
 			<<set $slaves[$i].faceShape = "androgynous">>
-		<<elseif ($slaves[$i].faceShape == "androgynous")>>
+		<<elseif ($slaves[$i].faceShape == "androgynous" && $slaves[$i].geneticQuirks.androgyny != 2)>>
 			Hormonal effects cause @@.lime;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike normalcy<<else>>femininity<</if>>.@@
 			<<set $slaves[$i].faceShape = "normal">>
 		<<elseif ($slaves[$i].geneMods.NCS == 1) && (random(1,100) > 50) && ($slaves[$i].faceShape == "normal")>>
@@ -407,7 +407,7 @@
 		<<if ($slaves[$i].faceShape == "masculine")>>
 			Hormonal effects cause @@.orange;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike <</if>>androgyny.@@
 			<<set $slaves[$i].faceShape = "androgynous">>
-		<<elseif ($slaves[$i].geneMods.NCS == 1) && (random(1,100) > 50) && ($slaves[$i].faceShape == "androgynous")>>
+		<<elseif ($slaves[$i].geneMods.NCS == 1) && (random(1,100) > 50) && ($slaves[$i].faceShape == "androgynous" && $slaves[$i].geneticQuirks.androgyny != 2)>>
 			Hormonal effects cause @@.lime;$his face to soften into <<if $slaves[$i].geneMods.NCS == 1>>childlike normalcy<<else>>femininity<</if>>.@@
 			<<set $slaves[$i].faceShape = "normal">>
 		<</if>>
@@ -554,12 +554,14 @@
 
 	<<if ($slaves[$i].geneMods.NCS == 0)>>
 		<<if $slaves[$i].faceImplant < 5>>
-			<<if ($slaves[$i].faceShape == "androgynous")>>
-				Hormonal effects cause @@.orange;$his face to harden into masculinity.@@
-				<<set $slaves[$i].faceShape = "masculine">>
-			<<elseif ($slaves[$i].faceShape != "masculine")>>
-				Hormonal effects cause @@.orange;$his face to harden into androgyny.@@
-				<<set $slaves[$i].faceShape = "androgynous">>
+			<<if  $slaves[$i].geneticQuirks.androgyny != 2>>
+				<<if ($slaves[$i].faceShape == "androgynous")>>
+					Hormonal effects cause @@.orange;$his face to harden into masculinity.@@
+					<<set $slaves[$i].faceShape = "masculine">>
+				<<elseif ($slaves[$i].faceShape != "masculine")>>
+					Hormonal effects cause @@.orange;$his face to harden into androgyny.@@
+					<<set $slaves[$i].faceShape = "androgynous">>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<if ($slaves[$i].face-$slaves[$i].faceImplant > 0)>>
@@ -642,12 +644,14 @@
 <<elseif $slaves[$i].hormoneBalance <= -300>>
 	<<if ($slaves[$i].geneMods.NCS == 0)>>
 		<<if $slaves[$i].faceImplant < 5>>
-			<<if ($slaves[$i].faceShape == "androgynous")>>
-				Hormonal effects cause @@.orange;$his face to harden into masculinity.@@
-				<<set $slaves[$i].faceShape = "masculine">>
-			<<elseif ($slaves[$i].faceShape != "masculine")>>
-				Hormonal effects cause @@.orange;$his face to harden into androgyny.@@
-				<<set $slaves[$i].faceShape = "androgynous">>
+			<<if $slaves[$i].geneticQuirks.androgyny != 2>>
+				<<if ($slaves[$i].faceShape == "androgynous")>>
+					Hormonal effects cause @@.orange;$his face to harden into masculinity.@@
+					<<set $slaves[$i].faceShape = "masculine">>
+				<<elseif ($slaves[$i].faceShape != "masculine")>>
+					Hormonal effects cause @@.orange;$his face to harden into androgyny.@@
+					<<set $slaves[$i].faceShape = "androgynous">>
+				<</if>>
 			<</if>>
 		<</if>>
 		<<if ($slaves[$i].face-$slaves[$i].faceImplant > 0)>>
diff --git a/src/uncategorized/saLongTermEffects.tw b/src/uncategorized/saLongTermEffects.tw
index 0b2d34ac880..65ea38589f9 100644
--- a/src/uncategorized/saLongTermEffects.tw
+++ b/src/uncategorized/saLongTermEffects.tw
@@ -3324,7 +3324,7 @@
 		<</if>>
 		<<if ($slaves[$i].faceShape == "masculine")>>
 			<<set _Effects.push("FaceSofterAndrogynous")>>
-		<<elseif ($slaves[$i].faceShape == "androgynous")>>
+		<<elseif ($slaves[$i].faceShape == "androgynous" && $slaves[$i].geneitcQuirk.androgyny != 2)>>
 			<<set _Effects.push("FaceNormal")>>
 		<</if>>
 	<</if>>
@@ -3482,6 +3482,14 @@
 <<else>>
 	<<set $slaves[$i].hormoneBalance = Math.clamp($slaves[$i].hormoneBalance * 1.5, -400, 400)>>
 <</if>>
+/* androgny really wants to sit around 0 and will fight changes to do so */
+<<if $slaves[$i].geneitcQuirk.androgyny == 2>>
+	<<if $slaves[$i].hormoneBalance > 6>>
+		<<set $slaves[$i].hormoneBalance -= 10>>
+	<<elseif $slaves[$i].hormoneBalance < -6>>
+		<<set $slaves[$i].hormoneBalance += 10>>
+	<</if>>
+<</if>>
 <<if $slaves[$i].drugs != "hormone blockers">>
 	<<include "SA hormone effects">>
 <<elseif $slaves[$i].drugs == "hormone blockers">>
@@ -4114,6 +4122,8 @@
 		<<if $slaves[$i].geneMods.NCS == 1>>
 			/* NCS: always working against secondary sexual characteristics even in pregnancies. */
 			<<set _boobTarget = 0>>
+		<<elseif $slaves[$i].geneticQuirks.androgyny == 2>>
+			<<set _boobTarget = 400>>
 		<<elseif $slaves[$i].physicalAge >= 18>>
 			<<if $slaves[$i].pregType >= 50>>
 				<<set _boobTarget = 10000>>
@@ -4177,13 +4187,15 @@
 							<<set $slaves[$i].boobShape = "saggy">>
 						<</if>>
 					<</if>>
-					<<if ($slaves[$i].hips < 2)>>
-						$His hips @@.lime;widen@@ for $his upcoming birth.
-						<<set $slaves[$i].hips += 1>>
-					<</if>>
-					<<if ($slaves[$i].butt < 14)>>
-						$His butt @@.lime;swells with added fat@@ from $his changing body.
-						<<set $slaves[$i].butt += 1>>
+					<<if $slaves[$i].geneticQuirks.androgyny != 2>>
+						<<if ($slaves[$i].hips < 2)>>
+							$His hips @@.lime;widen@@ for $his upcoming birth.
+							<<set $slaves[$i].hips += 1>>
+						<</if>>
+						<<if ($slaves[$i].butt < 14)>>
+							$His butt @@.lime;swells with added fat@@ from $his changing body.
+							<<set $slaves[$i].butt += 1>>
+						<</if>>
 					<</if>>
 				<</if>>
 			<<elseif ($slaves[$i].pregType >= 10)>>
diff --git a/src/utility/descriptionWidgets.tw b/src/utility/descriptionWidgets.tw
index 6130b384b41..ff2b1165d12 100644
--- a/src/utility/descriptionWidgets.tw
+++ b/src/utility/descriptionWidgets.tw
@@ -77,9 +77,9 @@
 		$He is a carrier of the heterochromia gene.
 	<</if>>
 	<<if $activeSlave.geneticQuirks.androgyny == 2>>
-		$His is naturally androgynous.
+		$His has a hormonal condition resulting in androgyny.
 	<<elseif $activeSlave.geneticQuirks.androgyny == 1 && $geneticMappingUpgrade >= 2>>
-		$He is a carrier of a series of genes that result in androgyny.
+		$He is a carrier of a gene that result in androgyny.
 	<</if>>
 	<<if $activeSlave.geneticQuirks.pFace == 2>>
 		$He has an exceedingly rare trait associated with perfect facial beauty.
-- 
GitLab