code:
/**
 * Creates the starting slaves for cheat mode.
 * These slaves should stay as close to how they were original defined as possible
 * @returns {string}
 */
App.Intro.cheatModeSlaves = function() {
	const slaveNames = [];

	if (V.temp.newCheatGirls) {
		// pick 3-6 random hero slaves instead of using the tradition cheat mode slaves
		const templates = App.Utils.buildHeroArray().pluckMany(jsRandom(3, 6));
		for (const template of templates) {
			const HS = App.Utils.getHeroSlave(template);
			V.heroSlavesPurchased.push(template.ID);
			newSlave(HS);
			slaveNames.push(HS.slaveName);
		}
		return `There are quite a few left; their names are ${toSentence(slaveNames)}.`;
	}

	let templateSlave = baseSlave();

	let cheatSlave = clone(templateSlave);
	cheatSlave.slaveName = "Miss Anne";
	cheatSlave.birthName = "Lindy Anne";
	cheatSlave.ID = 990000;
	cheatSlave.relationship = 4;
	cheatSlave.relationshipTarget = 990001;
	cheatSlave.rivalry = 1;
	cheatSlave.rivalryTarget = 990002;
	cheatSlave.assignment = "be your Head Girl";
	cheatSlave.birthWeek = random(0, 51);
	cheatSlave.actualAge = 42;
	cheatSlave.physicalAge = 42;
	cheatSlave.visualAge = 42;
	cheatSlave.ovaryAge = 42;
	cheatSlave.ageImplant = 1;
	setHealth(cheatSlave, 50);
	cheatSlave.devotion = 100;
	cheatSlave.nationality = "Stateless";
	cheatSlave.natural.height = 175;
	cheatSlave.height = 175;
	cheatSlave.race = "white";
	cheatSlave.eye.origColor = "green";
	cheatSlave.origHColor = "honey blonde";
	cheatSlave.origSkin = "pale";
	cheatSlave.hStyle = "neat";
	cheatSlave.hLength = 40;
	cheatSlave.waist = -55;
	cheatSlave.boobs = 1000;
	cheatSlave.natural.boobs = 400;
	cheatSlave.boobsImplant = 600;
	cheatSlave.boobsImplantType = "normal";
	cheatSlave.areolae = 1;
	cheatSlave.butt = 4;
	cheatSlave.buttImplant = 2;
	cheatSlave.buttImplantType = "normal";
	cheatSlave.face = 55;
	cheatSlave.lips = 35;
	cheatSlave.anus = 1;
	cheatSlave.makeup = 1;
	cheatSlave.nails = 1;
	cheatSlave.piercing.ear.weight = 1;
	cheatSlave.skill.oral = 100;
	cheatSlave.skill.penetrative = 100;
	cheatSlave.skill.anal = 100;
	cheatSlave.skill.whoring = 100;
	cheatSlave.skill.entertainment = 100;
	cheatSlave.clothes = "a slave gown";
	cheatSlave.intelligence = 100;
	cheatSlave.energy = 65;
	cheatSlave.attrXY = 40;
	cheatSlave.fetishKnown = 1;
	cheatSlave.custom.tattoo = "'Miss Anne' is tattooed in lovely flowing script over $his collarbone.";
	cheatSlave.custom.desc = "$He speaks with the rich accent of the Old South.";
	if (V.seeDicks !== 100) {
		cheatSlave.genes = "XX";
		cheatSlave.vagina = 2;
		cheatSlave.ovaries = 1;
		cheatSlave.skill.vaginal = 100;
		cheatSlave.pubertyXX = 1;
	} else {
		cheatSlave.genes = "XY";
		cheatSlave.vagina = -1;
		cheatSlave.dick = 4;
		cheatSlave.balls = 4;
		cheatSlave.scrotum = 4;
		cheatSlave.foreskin = 4;
		cheatSlave.prostate = 1;
		cheatSlave.pubertyXY = 1;
	}
	newSlave(cheatSlave);
	V.HeadGirlID = cheatSlave.ID;
	slaveNames.push(cheatSlave.slaveName);

	cheatSlave = clone(templateSlave);
	cheatSlave.slaveName = "Cornelia";
	cheatSlave.birthName = "Cora";
	cheatSlave.ID = 990001;
	cheatSlave.relationship = 4;
	cheatSlave.relationshipTarget = 990000;
	cheatSlave.assignment = "whore";
	cheatSlave.birthWeek = random(0, 51);
	cheatSlave.actualAge = 36;
	cheatSlave.physicalAge = 36;
	cheatSlave.visualAge = 36;
	cheatSlave.ovaryAge = 36;
	cheatSlave.ageImplant = 1;
	setHealth(cheatSlave, 10);
	cheatSlave.devotion = 100;
	cheatSlave.nationality = "Stateless";
	cheatSlave.muscles = 20;
	cheatSlave.natural.height = 190;
	cheatSlave.height = 190;
	cheatSlave.race = "black";
	cheatSlave.origHColor = "black";
	cheatSlave.pubicHColor = "black";
	cheatSlave.origSkin = "dark";
	cheatSlave.hLength = 40;
	cheatSlave.hStyle = "neat";
	cheatSlave.pubicHStyle = "waxed";
	cheatSlave.waist = -55;
	cheatSlave.boobs = 1200;
	cheatSlave.boobsImplant = 1000;
	cheatSlave.boobsImplantType = "fillable";
	cheatSlave.areolae = 2;
	cheatSlave.butt = 5;
	cheatSlave.buttImplant = 3;
	cheatSlave.buttImplantType = "fillable";
	cheatSlave.preg = -2;
	cheatSlave.face = 15;
	cheatSlave.faceImplant = 65;
	cheatSlave.lips = 35;
	cheatSlave.lipsImplant = 10;
	cheatSlave.anus = 2;
	cheatSlave.makeup = 1;
	cheatSlave.nails = 1;
	cheatSlave.piercing.ear.weight = 1;
	cheatSlave.skill.oral = 100;
	cheatSlave.skill.anal = 100;
	cheatSlave.skill.penetrative = 100;
	cheatSlave.skill.whoring = 100;
	cheatSlave.skill.entertainment = 100;
	cheatSlave.clothes = "a slave gown";
	cheatSlave.energy = 65;
	cheatSlave.attrXX = 80;
	cheatSlave.attrXY = 40;
	cheatSlave.fetishKnown = 1;
	App.Medicine.Modification.addBrand(cheatSlave, "left hand", "a large letter 'S'");
	cheatSlave.custom.desc = "$He speaks with the demeaning accent of slaves from the Old South.";
	if (V.seeDicks !== 0) {
		cheatSlave.genes = "XY";
		cheatSlave.vagina = -1;
		cheatSlave.dick = 3;
		cheatSlave.balls = 3;
		cheatSlave.scrotum = 3;
		cheatSlave.foreskin = 3;
		cheatSlave.prostate = 1;
		cheatSlave.pubertyXY = 1;
	} else {
		cheatSlave.genes = "XX";
		cheatSlave.vagina = 3;
		cheatSlave.ovaries = 1;
		cheatSlave.pubertyXX = 1;
	}
	newSlave(cheatSlave);
	slaveNames.push(cheatSlave.slaveName);

	cheatSlave = clone(templateSlave);
	cheatSlave.slaveName = "Sheba";
	cheatSlave.birthName = "Shaneequa";
	cheatSlave.ID = 990002;
	cheatSlave.rivalry = 1;
	cheatSlave.rivalryTarget = 990000;
	cheatSlave.assignment = "whore";
	cheatSlave.birthWeek = random(0, 51);
	cheatSlave.actualAge = 19;
	cheatSlave.physicalAge = 19;
	cheatSlave.visualAge = 19;
	cheatSlave.ovaryAge = 19;
	setHealth(cheatSlave, 10);
	cheatSlave.devotion = 60;
	cheatSlave.nationality = "Stateless";
	cheatSlave.natural.height = 175;
	cheatSlave.height = 175;
	cheatSlave.race = "black";
	cheatSlave.pubicHColor = "black";
	cheatSlave.origSkin = "brown";
	cheatSlave.hLength = 40;
	cheatSlave.hStyle = "neat";
	cheatSlave.pubicHStyle = "waxed";
	cheatSlave.waist = -55;
	cheatSlave.boobs = 1600;
	cheatSlave.boobsImplant = 600;
	cheatSlave.boobsImplantType = "normal";
	cheatSlave.piercing.nipple.weight = 1;
	cheatSlave.areolae = 1;
	cheatSlave.butt = 6;
	cheatSlave.buttImplant = 2;
	cheatSlave.buttImplantType = "normal";
	cheatSlave.face = 55;
	cheatSlave.faceImplant = 15;
	cheatSlave.lips = 55;
	cheatSlave.lipsImplant = 10;
	cheatSlave.anus = 1;
	cheatSlave.makeup = 1;
	cheatSlave.nails = 1;
	cheatSlave.piercing.ear.weight = 1;
	cheatSlave.skill.oral = 35;
	cheatSlave.skill.penetrative = 35;
	cheatSlave.skill.anal = 35;
	cheatSlave.skill.whoring = 35;
	cheatSlave.skill.entertainment = 35;
	cheatSlave.clothes = "a slave gown";
	cheatSlave.energy = 100;
	cheatSlave.attrXY = 40;
	cheatSlave.fetishKnown = 1;
	App.Medicine.Modification.addBrand(cheatSlave, "left hand", "a large letter 'S'");
	cheatSlave.custom.desc = "$He speaks with the demeaning accent of slaves from the Old South.";
	cheatSlave.mother = 990001;
	if (V.seeDicks !== 100) {
		cheatSlave.genes = "XX";
		cheatSlave.vagina = 1;
		cheatSlave.ovaries = 1;
		cheatSlave.skill.vaginal = 35;
		cheatSlave.pubertyXX = 1;
	} else {
		cheatSlave.genes = "XY";
		cheatSlave.vagina = -1;
		cheatSlave.dick = 2;
		cheatSlave.balls = 2;
		cheatSlave.scrotum = 2;
		cheatSlave.foreskin = 2;
		cheatSlave.prostate = 1;
		cheatSlave.pubertyXY = 1;
	}
	newSlave(cheatSlave);
	slaveNames.push(cheatSlave.slaveName);

	cheatSlave = clone(templateSlave);
	cheatSlave.slaveName = "Cornflower";
	cheatSlave.birthName = "Alysa";
	cheatSlave.ID = 990003;
	cheatSlave.relationship = 3;
	cheatSlave.relationshipTarget = 990005;
	cheatSlave.assignment = "get milked";
	cheatSlave.birthWeek = random(0, 51);
	setHealth(cheatSlave, 20);
	cheatSlave.devotion = 60;
	cheatSlave.nationality = "Stateless";
	cheatSlave.muscles = 50;
	cheatSlave.natural.height = 190;
	cheatSlave.height = 190;
	cheatSlave.race = "black";
	cheatSlave.origHColor = "black";
	cheatSlave.pubicHColor = "black";
	cheatSlave.origSkin = "brown";
	cheatSlave.hLength = 0;
	cheatSlave.hStyle = "shaved";
	cheatSlave.pubicHStyle = "waxed";
	cheatSlave.waist = -100;
	cheatSlave.heels = 1;
	cheatSlave.voice = 0;
	cheatSlave.boobs = 6000;
	cheatSlave.nipples = "huge";
	cheatSlave.areolae = 2;
	cheatSlave.boobsTat = "bovine patterns";
	cheatSlave.lactation = 2;
	cheatSlave.lactationDuration = 2;
	cheatSlave.butt = 3;
	cheatSlave.buttTat = "bovine patterns";
	cheatSlave.face = 15;
	cheatSlave.lips = 35;
	cheatSlave.lipsTat = "bovine patterns";
	cheatSlave.anus = 3;
	cheatSlave.anusTat = "bovine patterns";
	cheatSlave.makeup = 1;
	cheatSlave.nails = 1;
	cheatSlave.piercing.ear.weight = 1;
	cheatSlave.piercing.nose.weight = 2;
	cheatSlave.shouldersTat = "bovine patterns";
	cheatSlave.armsTat = "bovine patterns";
	cheatSlave.legsTat = "bovine patterns";
	cheatSlave.stampTat = "bovine patterns";
	cheatSlave.skill.oral = 15;
	cheatSlave.skill.anal = 35;
	cheatSlave.energy = 65;
	cheatSlave.attrXY = 40;
	cheatSlave.fetish = "boobs";
	cheatSlave.fetishKnown = 1;
	cheatSlave.custom.tattoo = "A pretty blue cornflower is tattooed on each of $his cheeks.";
	cheatSlave.custom.desc = "$He once spoke with the demeaning accent of slaves from the Old South.";
	cheatSlave.mother = 990005;
	if (V.seeDicks !== 100) {
		cheatSlave.genes = "XX";
		cheatSlave.vagina = 1;
		cheatSlave.vaginaTat = "bovine patterns";
		cheatSlave.ovaries = 1;
		cheatSlave.skill.vaginal = 15;
		cheatSlave.pubertyXX = 1;
	} else {
		cheatSlave.genes = "XY";
		cheatSlave.vagina = -1;
		cheatSlave.dick = 3;
		cheatSlave.balls = 3;
		cheatSlave.scrotum = 3;
		cheatSlave.foreskin = 3;
		cheatSlave.prostate = 1;
		cheatSlave.dickTat = "bovine patterns";
		cheatSlave.pubertyXY = 1;
	}
	newSlave(cheatSlave);
	slaveNames.push(cheatSlave.slaveName);

	cheatSlave = clone(templateSlave);
	cheatSlave.slaveName = "Miss Lily";
	cheatSlave.birthName = "Lillian";
	cheatSlave.ID = 990004;
	cheatSlave.assignment = "guard you";
	cheatSlave.birthWeek = random(0, 51);
	setHealth(cheatSlave, 20);
	cheatSlave.devotion = 30;
	cheatSlave.nationality = "Stateless";
	cheatSlave.muscles = 50;
	cheatSlave.natural.height = 175;
	cheatSlave.height = 175;
	cheatSlave.race = "white";
	cheatSlave.eye.origColor = "green";
	cheatSlave.origHColor = "straw blonde";
	cheatSlave.origSkin = "pale";
	cheatSlave.hLength = 10;
	cheatSlave.hStyle = "ponytail";
	cheatSlave.waist = -55;
	cheatSlave.boobs = 600;
	cheatSlave.natural.boobs = 600;
	cheatSlave.butt = 3;
	cheatSlave.face = 15;
	cheatSlave.lips = 35;
	cheatSlave.preg = -2;
	cheatSlave.anus = 2;
	cheatSlave.makeup = 1;
	cheatSlave.nails = 1;
	cheatSlave.piercing.ear.weight = 1;
	cheatSlave.skill.anal = 35;
	cheatSlave.skill.combat = 100;
	cheatSlave.energy = 65;
	cheatSlave.attrXY = 40;
	cheatSlave.fetish = "buttslut";
	cheatSlave.fetishKnown = 1;
	cheatSlave.custom.tattoo = "'Miss Lily' is tattooed in lovely flowing script over $his collarbone.";
	cheatSlave.custom.desc = "$He once spoke with the rich accent of the Old South.";
	cheatSlave.mother = 990000;
	if (V.seeDicks !== 100) {
		cheatSlave.genes = "XX";
		cheatSlave.ovaries = 1;
		cheatSlave.pubertyXX = 1;
	} else {
		cheatSlave.genes = "XY";
		cheatSlave.vagina = -1;
		cheatSlave.dick = 4;
		cheatSlave.balls = 4;
		cheatSlave.scrotum = 4;
		cheatSlave.foreskin = 4;
		cheatSlave.prostate = 1;
		cheatSlave.pubertyXY = 1;
		cheatSlave.skill.penetrative = 15;
	}
	newSlave(cheatSlave);
	V.BodyguardID = cheatSlave.ID;
	slaveNames.push(cheatSlave.slaveName);

	cheatSlave = clone(templateSlave);
	cheatSlave.slaveName = "Lilac";
	cheatSlave.birthName = "Lillian";
	cheatSlave.ID = 990005;
	cheatSlave.relationship = 3;
	cheatSlave.relationshipTarget = 990003;
	cheatSlave.assignment = "get milked";
	cheatSlave.birthWeek = random(0, 51);
	cheatSlave.actualAge = 36;
	cheatSlave.physicalAge = 36;
	cheatSlave.visualAge = 36;
	cheatSlave.ovaryAge = 36;
	setHealth(cheatSlave, 20);
	cheatSlave.devotion = 60;
	cheatSlave.nationality = "Stateless";
	cheatSlave.muscles = 50;
	cheatSlave.natural.height = 190;
	cheatSlave.height = 190;
	cheatSlave.race = "black";
	cheatSlave.origHColor = "black";
	cheatSlave.pubicHColor = "black";
	cheatSlave.origSkin = "brown";
	cheatSlave.hLength = 0;
	cheatSlave.hStyle = "shaved";
	cheatSlave.pubicHStyle = "waxed";
	cheatSlave.waist = -55;
	cheatSlave.heels = 1;
	cheatSlave.boobs = 8000;
	cheatSlave.nipples = "huge";
	cheatSlave.areolae = 2;
	cheatSlave.boobsTat = "bovine patterns";
	cheatSlave.lactation = 2;
	cheatSlave.lactationDuration = 2;
	cheatSlave.butt = 4;
	cheatSlave.buttTat = "bovine patterns";
	cheatSlave.face = 15;
	cheatSlave.lips = 35;
	cheatSlave.lipsTat = "bovine patterns";
	cheatSlave.anus = 3;
	cheatSlave.anusTat = "bovine patterns";
	cheatSlave.makeup = 1;
	cheatSlave.nails = 1;
	cheatSlave.piercing.ear.weight = 1;
	cheatSlave.piercing.nose.weight = 2;
	cheatSlave.shouldersTat = "bovine patterns";
	cheatSlave.armsTat = "bovine patterns";
	cheatSlave.legsTat = "bovine patterns";
	cheatSlave.stampTat = "bovine patterns";
	cheatSlave.skill.oral = 15;
	cheatSlave.skill.anal = 35;
	cheatSlave.energy = 65;
	cheatSlave.attrXY = 40;
	cheatSlave.fetish = "boobs";
	cheatSlave.fetishKnown = 1;
	cheatSlave.custom.tattoo = "A pretty purple lilac is tattooed on each of $his cheeks.";
	cheatSlave.custom.desc = "$He once spoke with the demeaning accent of slaves from the Old South.";
	if (V.seeDicks !== 100) {
		cheatSlave.genes = "XX";
		cheatSlave.vagina = 1;
		cheatSlave.vaginaTat = "bovine patterns";
		cheatSlave.ovaries = 1;
		cheatSlave.skill.vaginal = 15;
		cheatSlave.pubertyXX = 1;
	} else {
		cheatSlave.genes = "XY";
		cheatSlave.vagina = -1;
		cheatSlave.dick = 5;
		cheatSlave.balls = 5;
		cheatSlave.scrotum = 5;
		cheatSlave.foreskin = 5;
		cheatSlave.prostate = 1;
		cheatSlave.dickTat = "bovine patterns";
		cheatSlave.pubertyXY = 1;
		cheatSlave.skill.penetrative = 15;
	}
	newSlave(cheatSlave);
	slaveNames.push(cheatSlave.slaveName);

	return `There are quite a few left; their names are ${toSentence(slaveNames)}.`;
};

repo_name: Nithhogg/fc

license: mit


code:
:: custom Slaves Database

<<set $heroSlaves = []>>
<<set _i = 1000000>>
/*
<<set _HS = baseSlave()>>
<<set _HS.slaveName = "McChesterton", _HS.birthName = "Testy", _HS.origin = "$He is obsessed with testing new customizations of $his body.", _HS.ID = _i++, _HS.birthWeek = random(0,51), _HS.actualAge = 24, _HS.physicalAge = 24, _HS.visualAge = 24, _HS.ovaryAge = 24, setHealth(_HS, 20), _HS.devotion = 100, _HS.weight = 25, _HS.origHColor = "chestnut", _HS.pubicHColor = "chestnut", _HS.hLength = 30, _HS.hStyle = "shoulder-length and in a bun", _HS.boobs = 700, _HS.butt = 3, _HS.vagina = 1, _HS.vaginaLube = 1, _HS.anus = 1, _HS.ovaries = 1, _HS.skill.vaginal = 15, _HS.skill.oral = 15, _HS.skill.anal = 15, _HS.skill.entertainment = 1, _HS.clothes = "a nice maid outfit", _HS.intelligence = 20, _HS.intelligenceImplant = 30, _HS.attrXY = 40, _HS.fetish = "submissive", _HS.career = "a maid", _HS.eyewear = "corrective glasses">>
<<run eyeSurgery(_HS, "both", "blur")>>
<<set $heroSlaves.push(_HS)>>

/* To add custom slaves, try to use the format of the above example. Add new slaves below this line. If you wish to add more slaves
    later, always add them at the bottom of the file. IDs are assigned automatically and in order, and you want your new slave to
    have a unique ID instead of someone else's.

	While all of these slaves can show up in the market (depending on content settings), only slaves worth less than 100,000 under the game state
    at the beginning of the game will ever be available during arcology acquisition. Slaves acquired from the special market cost twice their
    normal market value, with an addition of 10,000 to 30,000 for slaves who would otherwise cost under 20,000 (that is, normal value under
    10,000}.

    Note that it's not possible to define siblings in the custom slaves database.

	WARNING ABOUT DEFAULTS
	Any attribute omitted from a slave's data will take on the default value of SlaveState, its parent HumanState, or the latter's parent
	GenePoolRecord, rather than taking advantage of the consistent logic in the global "GenerateNewSlave" function. Notably, the default age is
	18, which is simple enough, and the default values of "intelligence" and "face" are 0, which represents average on a scale from -100 to 100.
	However, in cases where the attribute is a list of categories, the usual default of 0 may have a surprising meaning.

	Most importantly for females, a 0 for "vagina" or "anus" means a virgin or anal virgin, while a female slave with a 0 for "ovaries" will never
	have gone through puberty (which won't stop normal breast and hip growth, because the game code isn't completely logical), and will have a
	neutral hormone balance (which really only affects opposite-sex attraction, but just looks weird in the slave summary).

	Most importantly for males, a default of 0 for "dick" means no penis, and a male slave with a 0 for "balls" will be castrated, will never have
	gone through puberty (which won't stop normal development of masculine traits), and will have a neutral hormone balance (which, again, really
	only affects opposite-sex attraction, but just looks weird in the slave summary). A 0 for "anus" means an anal virgin, while a male slave with
	the default value of 0 for "vagina" will have a vagina (and be a virgin), so make sure any natural male has a "vagina" of -1.

	Finally, note that a slave with no explicit career will take on the career "a slave", implying that she's been a slave for a long time.

	The moral of the story is, to be safe, set all values explicitly if possible (except possibly names--see below), but it's not a bad idea to
	familiarize yourself with the defaults by having a look at 001-GenePoolRecord.js, 002-HumanState.js, and 003-SlaveState.js.

	The one attribute that can't be omitted is "slaveName": a slave with no value for this attribute will end up with the name "blank", even if a
	birth name is specified. Thus, if you want a slave to be called by her birth name, you need to set _both_ "slaveName" and "birthName" to that
	value. If no birth name is provided, the game will pick a random name appropriate to the slave's nationality; you have to explicitly set
	"birthName" to "" (an empty string) to avoid any mention of a birth name in her description.

	Surnames follow a similar logic: if the birth surname is missing, one will be picked randomly, but if it's set explicitly to "", the birth
	surname will be omitted from the description. Setting "slaveSurname" isn't required; if it's omitted, the slave's description will mention
	that she lacks a surname as a slave, regardless of whether or not she has a birth surname. To remove all mentions of a surname from the
	description, set _both_ "slaveSurname" and "birthSurname" to "". However, if "slaveSurname" is set to "" and "birthSurname" is set to any
	other value, the game will reset "slaveSurname" to the default, producing the same sort of description as if it had been omitted in the first
	place.

	Note: to make a female slave infertile, give her an "ovaries" value of 1, and a "preg" value of -2 ("sterile"). This value would apply even to
	non-permanent surgical interventions, while making a slave well and truly unable to have children is "sterilized", or -3. To make a male slave
    infertile without castrating him, set "ballType" to "sterile".
*/


code:
# Hero Slaves

Hero Slaves are used for:

* New non-FS arcologies: The player is given a random Hero Slave with a value of less than 100,000 at start.
* Cheat Start with a few random arcology slaves: The player is given 3-6 random Hero Slaves at start with no regards to value.
* The Special Slave Market ("Acquire other slaveowners' stock"): The slaves for purchase are the Hero Slaves. Hero slaves are purchased for twice their normal market value, with an addition of 10,000 to 30,000 for slaves who would otherwise cost under 20,000.

## Credits

Many of these Hero Slaves originally came from the /d/ database and have been carfully kept compatable with changes to FC by several people over the years. Notablely `DerangedLoner` and `BoneyM` have done a lot of work to keep these working.

## Editor Suggestions and Type Info

It is highly recommended to edit these files with an editor that supports ESLint, JavaScript, and TypeScript.
I recommend using VSCode with the following extensions installed:

* [IntelliCode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode)
* [ESLint](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
* [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)

Hero Slaves are of type `SlaveTemplate` which is a derivative of `SlaveState`. Any property that is valid in `SlaveState` is valid in Hero Slaves. A modern editor with the correct extensions will provide helpful documentation, type enforcement, and suggestions.

## Hero Slave Database File Locations

Hero Slaves are stored in one of the database files next to these instructions. All of these files start with `slavesDatabase_`.

The Hero Slave databases are split up into seperate files as follows:

* Gender: XX for Female, XY for Male.
* Extreme: Heros in these files are missing limbs or have other properties that would stop them from generating if the player has extreme content turned off.
  * See `Removing Limbs From Hero Slaves` below for more details.
* HyperPreg: Heros in these files have one or more genetic trait that would only be possible if the player has hyper pregnancy turned on.
* Incest: Heros in these files have an incestuous relationship with another hero slave.
* FruitGirls: Heros in these files are part of the fruit girls and should be kept as close to their original state as possible.
* Files with just the gender: Heros in these files don't fit into any of the other groups and should be safe for normal generation.
  * Pregnancy and underage are filtered out if needed regardless of what database the hero is defined in.

## WARNINGS ABOUT DEFAULTS

Any attribute omitted from a slave's data will take on the default value of SlaveState, its parent HumanState, or the latter's parent
GenePoolRecord, rather than taking advantage of the consistent logic in the global "GenerateNewSlave" function. Notably, the default age is
18, which is simple enough, and the default values of "intelligence" and "face" are 0, which represents average on a scale from -100 to 100.
However, in cases where the attribute is a list of categories, the usual default of 0 may have a surprising meaning.

Most importantly for females, a 0 for "vagina" or "anus" means a virgin or anal virgin, while a female slave with a 0 for "ovaries" will never
have gone through puberty (which won't stop normal breast and hip growth, because the game code isn't completely logical), and will have a
neutral hormone balance (which really only affects opposite-sex attraction, but just looks weird in the slave summary).

Most importantly for males, a default of 0 for "dick" means no penis, and a male slave with a 0 for "balls" will be castrated, will never have
gone through puberty (which won't stop normal development of masculine traits), and will have a neutral hormone balance (which, again, really
only affects opposite-sex attraction, but just looks weird in the slave summary). A 0 for "anus" means an anal virgin, while a male slave with
the default value of 0 for "vagina" will have a vagina (and be a virgin), so make sure any natural male has a "vagina" of -1.

Finally, note that a slave with no explicit career will take on the career "a slave", implying that she's been a slave for a long time.

The moral of the story is, to be safe, set all values explicitly if possible (except possibly names--see below), but it's not a bad idea to
familiarize yourself with the defaults by having a look at 001-GenePoolRecord.js, 002-HumanState.js, and 003-SlaveState.js.

The one attribute that can't be omitted is "slaveName": a slave with no value for this attribute will end up with the name "blank", even if a
birth name is specified. Thus, if you want a slave to be called by her birth name, you need to set _both_ "slaveName" and "birthName" to that
value. If no birth name is provided, the game will pick a random name appropriate to the slave's nationality; you have to explicitly set
"birthName" to "" (an empty string) to avoid any mention of a birth name in her description.

Surnames follow a similar logic: if the birth surname is missing, one will be picked randomly, but if it's set explicitly to "", the birth
surname will be omitted from the description. Setting "slaveSurname" isn't required; if it's omitted, the slave's description will mention
that she lacks a surname as a slave, regardless of whether or not she has a birth surname. To remove all mentions of a surname from the
description, set _both_ "slaveSurname" and "birthSurname" to "". However, if "slaveSurname" is set to "" and "birthSurname" is set to any
other value, the game will reset "slaveSurname" to the default, producing the same sort of description as if it had been omitted in the first
place.

## Making An Infertile Hero Slave

To make a female Hero Slave infertile, give her an "ovaries" value of 1, and a "preg" value of -2 ("sterile"). This value would apply even to non-permanent surgical interventions, while making a slave well and truly unable to have children is "sterilized", or -3.

To make a male Hero Slave infertile without castrating him, set "ballType" to "sterile".

## Removing Hero Slave limbs or making them prostetics

Hero Slaves with missing limbs need to go in one of the extreme databases.
Hero Slaves with prostetics can usually go into any of the databases.

To modify a Hero Slave's limbs you use the `_limbs` property.
This property is an array of 4 numbers. The positions are `[left arm, right arm, left leg, right leg]`. A 0 will remove that limb, while a 1 will keep it natural. Anything above 1 will set that limb to the prostetic corresponding to the given number. For example `[0, 0, 0, 0]` would remove all limbs from the given slave, `[0, 0, 1, 1]` would only remove the arms, and `[6, 6, 0, 1]` would make both arms cybernetic prostetics, remove the left leg, and keep the right leg natural.

See existing extreme slaves for examples.

Here are the different limb types available:

* 0: removed
* 1: normal
* 2: simple prosthetic
* 3: advanced - Sex
* 4: advanced - Beauty
* 5: advanced - Combat
* 6: cybernetic

## Families

Two slaves can be siblings (parent/child relationships can't easily be made to work with the Special Market, because the relationship is stored only on the child). To be siblings, two slaves must share at least one parent (a negative dummy ID, not the ID of a slave in the game--make sure it doesn't conflict with parent ID's already in the databases); it's helpful to match sure they match by setting their birth surname, race, and nationality explicitly, and setting twins' birth weeks explicitly.

Related slaves also require some additional code in the functions "App.Utils.getHeroFamilies" and "App.Utils.getHeroSlaves", both found in HeroCreator.js, and the family members do not have to be listed in the same file, but they do have to be in equivalent arrays ("vanilla", extreme, incest, or hyperpreg), so that either both or neither is eligible to show up in any particular game (which means that combining kinks, sadly, won't work--e.g., no incestuous amputees).

If the family members are listed in incest arrays (and in the incest-mapping object "incestFamilies" found in "getHeroFamilies"), their relationship attributes will automatically be set (to "friends with benefits") when they're acquired; there's no need to specify the relationship explicitly here.

To show up during arcology acquisition, two related slaves must have a _combined_ value of under 100,000; they will always show up together during acquisition, though they can be bought separately in the Special Market.

## Misc Notes

Most male Hero Slaves originally had a "preg" value of -2 ("sterile" for females). These assignments were removed in all but one case, as a "preg" value of -2 will cause the "isFertile" function to return "false" for an XY slave with an anal womb (XY slaves given ovaries aren't a problem, since "preg" is set to 0 when ovaries are implanted). -DerangedLoner