diff --git a/src/js/generateGenetics.tw b/src/js/generateGenetics.tw
new file mode 100644
index 0000000000000000000000000000000000000000..e1bbb66b748f1cdf1f84269f4831541d73de5f61
--- /dev/null
+++ b/src/js/generateGenetics.tw
@@ -0,0 +1,452 @@
+:: generateGenetics [script]
+
+// Generates a child's genetics based off mother and father and returns it as an object to be attached to an ovum
+window.generateGenetics =  = (function() {
+	"use strict";
+	let genes;
+	let mother;
+	let activeMother;
+	let father;
+	let activeFather;
+	let V
+
+	function generateGenetics(actor1, actor2, x) {
+		V = State.variables;
+		genes = {gender: "XX", name: "blank", mother: 0, motherName: "none", father: 0, fatherName: "none", nationality: "Stateless", race: "white", intelligence: 0, face: 0, eyeColor: "brown", hColor: "black", skin: "white", markings: "none", behavioralFlaw: "none", sexualFlaw: "none", pubicHSyle: "bushy", underArmHStyle: "bushy", geneticFlaws: 0};
+		mother = (actor1 > 0) ? V.genePool.findIndex(function(s) { return s.ID == actor1; }) : V.PC;
+		activeMother = (mother.ID > 0) ? V.slaves.findIndex(function(s) { return s.ID == mother.ID; }) : V.PC;
+		father = (actor2 > 0) ? V.genePool.findIndex(function(s) { return s.ID == actor2; })
+			: (actor2 == -1 && actor1 > 0) ? mother
+			: (actor2 == -6 && actor1 == -1) ? V.PC
+			: 0;
+		activeFather = (father !== 0 && father.ID > 0) ? V.slaves.findIndex(function(s) { return s.ID == father.ID; })
+			: (father !== 0 && father.ID == -1) ? V.PC
+			: 0;
+
+		genes.gender = setGender(father);
+		genes.name = setName(x);
+		genes.mother = setMotherID(actor1);
+		genes.motherName = setMotherName(activeMother);
+		genes.father = setFatherID(actor2);
+		genes.fatherName = setFatherName(father, activeFather);
+		genes.nationality = setNationality(father, mother);
+		genes.skin = setSkin(father, mother);
+		genes.race = setRace(father, mother, actor2);
+		genes.intelligence = setIntelligence(father, mother, activeMother, actor2);
+		genes.face = setFace(father, mother, activeMother, actor2);
+		genes.eyeColor = setEyeColor(father, mother, actor2);
+		genes.hColor = setHColor(father, mother, actor2);
+		genes.underArmHStyle = setUnderArmHStyle(father, mother);
+		genes.pubicHStyle = setPubicHStyle(father, mother);
+		genes.markings = setMarkings(father, mother);
+		genes.sexualFlaw = setSexualFlaw(father, mother);
+		genes.behavioralFlaw = setBehavioralFlaw(father, mother);
+		genes.fetish = setFetish(father, mother);
+	}
+
+	// gender
+	function setGender(father) {
+		let gender;
+		if (V.seeDicksAffectsPregnancy == 1) {
+			gender = Math.floor(Math.random()*100) < V.seeDicks ? 2 : 1;
+		} else if (V.adamPrinciple == 1) {
+			if (father) {
+				if (father.genes == "XX") {
+					gender = "XX";
+				} else {
+					gender = jsEither(["XX", "XY"]);
+				}
+			} else {
+				gender = jsEither(["XX", "XY"]);
+			}
+		} else {
+			gender = jsEither(["XX", "XY"]);
+		}
+		return gender;
+	}
+
+	// name
+	function setName(x) {
+		return "ovum" + x;
+	}
+
+	// motherID
+	function setMotherID(actor1) {
+		return actor1;
+	}
+
+	// motherName
+	function setMotherName(activeMother) {
+		let motherName;
+		if (actor1 == -1) {
+			motherName = activeMother.name;
+			if (activeMother.surname !== 0 && activeMother.surname !== "") { motherName + " " + activeMother.surname; }
+		} else {
+			motherName = activeMother.slaveName;
+			if (activeMother.slaveSurname !== 0 && activeMother.slaveSurname !== "") { motherName + " " + activeMother.slaveSurname; }
+		}
+		return motherName;
+	}
+
+	// fatherID
+	function setFatherID(actor2) {
+		return actor2;
+	}
+
+	// fatherName
+	function setFatherName(father, activeFather) {
+		let fatherName;
+		if (father) {
+			if (father.ID == -1) {
+				fatherName = activeFather.name;
+				if (activeFather.surname !== 0 && activeFather.surname !== "") { fatherName + " " + activeFather.surname; }
+			} else {
+				fatherName = activeFather.slaveName;
+				if (activeFather.slaveSurname !== 0 && activeFather.slaveSurname !== "") { fatherName + " " + activeFather.slaveSurname; }
+			}
+		}
+		return fatherName;
+	}
+
+	// nationality
+	function setNationality(father, mother) {
+		return (!father) ? "Stateless"
+			: (father.nationality == mother.nationality) ? mother.nationality
+			: "Stateless";
+	}
+
+	// race
+	function setRace(father, mother, actor2) {
+		let race;
+		if (father) {
+			race = (mother.origRace == father.origRace) ? mother.origRace
+			: (jsRandom(1,4)) == 4 ? jsEither([father.origRace, mother.origRace])
+			: "mixed race";
+		} else if (actor2 == -2) {
+			if (V.arcologies[0].FSSupremacist != "unset") {
+				race = jsEither([mother.origRace, V.arcologies[0].FSSupremacistRace, V.arcologies[0].FSSupremacistRace]);
+				if (mother.origRace != V.arcologies[0].FSSupremacistRace) {
+					if (jsRandom(1,100) > 50) {
+						race = "mixed race";
+					}
+				}
+			} else {
+				race = mother.origRace;
+			}
+		} else {
+			race = mother.origRace;
+		}
+		return race;
+	}
+
+	//skin
+	window.setSkin = function(father, mother) {
+		let skinToMelanin = {
+			'pure black': 21,
+			ebony: 20,
+			black: 19,
+			'dark brown': 18,
+			brown: 17,
+			'light brown': 16,
+			dark: 15,
+			'dark olive': 14,
+			bronzed: 13,
+			tanned: 12,
+			natural: 11,
+			olive: 10,
+			'light olive': 9,
+			lightened: 8,
+			light: 7,
+			white: 6,
+			fair: 5,
+			'very fair': 4,
+			'extremely fair': 3,
+			pale: 2,
+			'extremely pale': 1,
+			'pure white': 0
+		};
+		let momSkinIndex = mother ? (skinToMelanin[mother.origSkin] || 11) : 7;
+		let dadSkinIndex = father ? (skinToMelanin[father.origSkin] || 11) : 7;
+		let skinIndex = Math.round(Math.random() * (dadSkinIndex - momSkinIndex) + momSkinIndex);
+		return [
+			'pure white',
+			'extremely pale',
+			'pale',
+			'extremely fair',
+			'very fair',
+			'fair',
+			'white',
+			'light',
+			'lightened',
+			'light olive',
+			'olive',
+			'natural',
+			'tanned',
+			'bronzed',
+			'dark olive',
+			'dark',
+			'light brown',
+			'brown',
+			'dark brown',
+			'ebony',
+			'black',
+			'pure black'
+		][skinIndex];
+	};
+
+	// eyeColor
+	function setEyeColor(father, mother, actor2) {
+		let eyeColor;
+		if (father) {
+			if (mother.origEye == father.origEye) {
+				eyeColor = mother.origEye;
+			} else if (mother.origEye == "red" || mother.origEye == "pale red" || mother.origEye == "light red" || mother.origEye == "pale gray" || mother.origEye == "milky white") {
+				eyeColor = father.origEye;
+			} else if (father.origEye == "red" || father.origEye == "pale red" || father.origEye == "light red" || father.origEye == "pale gray" || father.origEye == "milky white") {
+				eyeColor = mother.origEye;
+			} else if (mother.origEye == "blue") {
+				if (jsRandom(1,4) == 2) {
+					eyeColor = mother.origEye;
+				} else {
+					eyeColor = father.origEye;
+				}
+			} else if (father.origEye == "blue") {
+				if (jsRandom(1,4) == 2) {
+					eyeColor = father.origEye;
+				} else {
+					eyeColor = mother.origEye;
+				}
+			} else {
+				eyeColor = jsEither([mother.origEye, father.origEye]);
+			}
+		} else if (actor2 === -2 || actor2 === 0) {
+			eyeColor = jsEither([mother.origEye, "brown", "blue", "brown", "green", "hazel", "green"]);
+		} else {
+			eyeColor = mother.origEye;
+		}
+		return eyeColor;
+	}
+
+	// hColor
+	function setHColor(father, mother, actor2) {
+		let hairColor;
+		if (father) {
+			if (mother.origHColor == father.origHColor) {
+				hairColor = mother.origHColor;
+			} else if (mother.origHColor == "white") {
+				hairColor = jsRandom(1,100) == 69 ? mother.origHColor : father.origHColor;
+			} else if (father.origHColor == "white") {
+				hairColor = jsRandom(1,100) == 69 ? father.origHColor : mother.origHColor;
+			} else if (mother.origHColor == "black") {
+				hairColor = jsEither([mother.origHColor, mother.origHColor, mother.origHColor, mother.origHColor, mother.origHColor, mother.origHColor, mother.origHColor, father.origHColor]);
+			} else if (father.origHColor == "black") {
+				hairColor = jsEither([father.origHColor, father.origHColor, father.origHColor, father.origHColor, father.origHColor, father.origHColor, father.origHColor, mother.origHColor]);
+			} else if (mother.origHColor == "brown") {
+				hairColor = jsEither([mother.origHColor, mother.origHColor, mother.origHColor, father.origHColor]);
+			} else if (father.origHColor == "brown") {
+				hairColor = jsEither([father.origHColor, father.origHColor, father.origHColor, mother.origHColor]);
+			} else {
+				hairColor = jsEither([mother.origHColor, father.origHColor]);
+			}
+		} else if (actor2 === -2 || actor2 === 0) {
+			hairColor = jsEither([mother.origHColor, "brown", "blonde", "black", "brown", "black", "brown", "black"]);
+		} else {
+			hairColor = mother.origHColor;
+		}
+		return hairColor;
+	}
+
+	// underArmHairStyle
+	function setUnderArmHStyle(father, mother) {
+		let hair;
+		if (father) {
+			if (mother.underArmHStyle == "hairless" && father.underArmHStyle == "hairless") {
+				hair = "hairless";
+			} else if (mother.underArmHStyle == "hairless" || father.underArmHStyle == "hairless") {
+				hair = (jsRandom(1,5) == 3) ? "hairless" : jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+			} else {
+				hair = jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+			}
+		} else if (mother.underArmHStyle == "hairless") {
+			hair = (jsRandom(1,5) == 3) ? "hairless" : jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+		} else {
+			hair = jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+		}
+		return hair;
+	}
+	
+	// pubicHairStyle
+	function setPubicHStyle(father, mother) {
+		let hair;
+		if (father) {
+			if (mother.pubicHStyle == "hairless" && father.pubicHStyle == "hairless") {
+				hair = "hairless";
+			} else if (mother.pubicHStyle == "hairless" || father.pubicHStyle == "hairless") {
+				hair = (jsRandom(1,5) == 3) ? "hairless" : jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+			} else {
+				hair = jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+			}
+		} else if (mother.pubicHStyle == "hairless") {
+			hair = (jsRandom(1,5) == 3) ? "hairless" : jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+		} else {
+			hair = jsEither(["bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "hairless"]);
+		}
+		return hair;
+	}
+
+	// markings
+	function setMarkings(father, mother) {
+		let markings;
+		if (jsRandom(1,8) == 1) {
+			markings = jsEither(["beauty mark", "birthmark"]);
+		} else {
+			markings = "none";
+		}
+		if (markings == "none") {
+			if (father) {
+				markings = jsEither([mother.markings, father.markings, "none", "none"]);
+			} else {
+				markings = jsEither([mother.markings, mother.markings, "none", "none"]);
+			}
+		}
+		return markings;
+	}
+	
+	// sexualFlaw
+	function setSexualFlaw(father, mother) {
+		let flaw;
+		if (father) {
+			flaw = jsEither([mother.sexualFlaw, father.sexualFlaw, "none", "none"]);
+		} else {
+			flaw = jsEither([mother.sexualFlaw, mother.sexualFlaw, "none", "none"]);
+		}
+		return flaw;
+	}
+
+	// behavioralFlaw
+	function setBehavioralFlaw(father, mother) {
+		let flaw;
+		if (father) {
+			flaw = jsEither([mother.behavioralFlaw, father.behavioralFlaw, "none", "none"]);
+		} else {
+			flaw = jsEither([mother.behavioralFlaw, mother.behavioralFlaw, "none", "none"]);
+		}
+		return flaw;
+	}
+	
+	// fetish
+	function setFetish(father, mother) {
+		let fetish;
+		if (father) {
+			fetish = jsEither(["none", "none", "none", "none", "none", father.fetish, mother.fetish]);
+		} else {
+			fetish = jsEither(["none", "none", "none", "none", "none", mother.fetish, mother.fetish]);
+		}
+		if (fetish == "mindbroken") { fetish = "none"; }
+		return fetish;
+	}
+
+	//intelligence
+	function setIntelligence(father, mother, activeMother, actor2) {
+		let smarts;
+		if (mother.ID == -1) {
+			if (actor2 == -1) {
+				smarts = jsRandom(90,100);
+			} else if (father) {
+				if (father.intelligence < mother.intelligence) {
+					smarts = jsRandom(father.intelligence, mother.intelligence);
+				} else {
+					smarts = jsRandom(mother.intelligence, father.intelligence);
+				}
+				if (smarts <= 50) {
+					smarts += 30;
+				}
+			} else {
+				smarts = jsRandom(50,100);
+			}
+		} else if (father) {
+			if (father.intelligence < mother.intelligence) {
+				smarts = jsRandom(father.intelligence, mother.intelligence);
+			} else {
+				smarts = jsRandom(mother.intelligence, father.intelligence);
+			}
+			if (activeMother.breedingMark == 1 && smarts <= 50) {
+				smarts = jsRandom(60,100);
+			}
+		} else {
+			smarts = mother.inelligence;
+		}
+		if (V.inbreeding == 1) {
+			if (mother.ID != -1) {
+				if (father && father.ID == -1 && activeMother.breedingMark != 1) {
+					if (smarts >= -95 && jsRandom(1,100) < 40) {
+						smarts -= jsRandom(1,10);
+						if (smarts >= -95 && jsRandom(1,100) < 20) {
+							smarts -= jsRandom(1,5);
+						}
+					}
+				} else {
+					if (smarts >= -95 && jsRandom(1,100) < 50) {
+						smarts -= jsRandom(1,15);
+						if (smarts >= -95 && jsRandom(1,100) < 30) {
+							smarts -= jsRandom(1,15);
+						}
+					}
+				}
+			}
+		}
+		return Math.clamp(smarts, -100, 100);
+	}
+
+	//face
+	function setFace(father, mother, activeMother, actor2) {
+		let face;
+		if (mother.ID == -1) {
+			if (actor2 == -1) {
+				face = jsRandom(90,100);
+			} else if (father) {
+				if (father.face < mother.face) {
+					face = jsRandom(father.face, mother.face);
+				} else {
+					face = jsRandom(mother.face, father.face);
+				}
+				if (face <= 40) {
+					face += jsRandom(5,20);
+				}
+			} else {
+				face = jsRandom(20,100);
+			}
+		} else if (father) {
+			if (father.intelligence < mother.intelligence) {
+				face = jsRandom(father.intelligence, mother.intelligence);
+			} else {
+				face = jsRandom(mother.intelligence, father.intelligence);
+			}
+			if (activeMother.breedingMark == 1 && face < 60) {
+				face = jsRandom(60,100);
+			}
+		} else {
+			face = mother.inelligence;
+		}
+		if (V.inbreeding == 1) {
+			if (mother.ID != -1) {
+				if (father && father.ID == -1 && activeMother.breedingMark != 1) {
+					if (face > -100 && jsRandom(1,100) > 60) {
+						face -= jsRandom(2,20);
+					}
+				} else {
+					if (face > -100 && jsRandom(1,100) < 50) {
+						face -= jsRandom(1,15);
+						if (face >= -95 && jsRandom(1,100) < 30) {
+							face -= jsRandom(5,20);
+						}
+					}
+				}
+			}
+		}
+		return Math.clamp(face, -100, 100);
+	}
+
+	return genes;
+
+})();
\ No newline at end of file