code:
/**
 * Encapsulates the full description of a player state. Serializable by the SugarCube state
 * management.
 */

/**
 * Encapsulates your skills. Used inside of the
 * App.Entity.PlayerState class.
 * @see App.Entity.PlayerState
 */
App.Entity.PlayerSkillsState = class {
	constructor() {
		/** exclusive variables */
		/** Your skill in trading. */
		this.trading = 0;
		/** Your skill in warfare. */
		this.warfare = 0;
		/** Your skill in slaving. */
		this.slaving = 0;
		/** Your skill in engineering. */
		this.engineering = 0;
		/** Your skill in medicine. */
		this.medicine = 0;
		/** Your skill in hacking. */
		this.hacking = 0;
		/** Your skill in taking huge loads. */
		this.cumTap = 0;
	}
};

/**
 * Encasulates your sexual preferences. Used inside of the
 * App.Entity.PlayerState class.
 * @see App.Entity.PlayerState
 */
App.Entity.PlayerReleaseRulesState = class {
	constructor() {
		/** Can you masturbate? */
		this.masturbation = 1;
		/** Can you fuck your romantic partner (relationship = FWB or higher)? */
		this.partner = 1;
		/** Can you fuck your close family members (siblings/parents/children)? */
		this.family = 1;
		/** Can you fuck the general slave population? */
		this.slaves = 1;
		/** Just here for compatibility with the slave version of ReleaseRulesState, should always be 1. */
		this.master = 1;
	}
};

/**
 * Encapsulates your preferences. Used inside of the
 * App.Entity.PlayerState class.
 * @see App.Entity.PlayerState
 */
App.Entity.PlayerRulesState = class {
	constructor() {
		/**
		 * Your starting expenses.
		 * * "spare"
		 * * "normal"
		 * * "luxurious"
		 */
		this.living = "luxurious";
		this.rest = "permissive";
		this.speech = "permissive";
		this.release = new App.Entity.PlayerReleaseRulesState();
		this.relationship = "permissive";
		/**
		 * How you are handling your lactation
		 * * "none"
		 * * "induce"
		 * * "maintain"
		 * * "sell"
		 */
		this.lactation = "none";
		this.punishment = "situational";
		this.reward = "relaxation";
	}
};

App.Entity.PlayerActionsCountersState = class {
	constructor() {
		/** exclusive variables */
		/** how many children you've carried for the SE */
		this.birthElite = 0;
		/** how many children you've carried for your former master (servant start only) */
		this.birthMaster = 0;
		/** how many slave babies you've had */
		this.birthDegenerate = 0;
		/** how many whoring babies you've had */
		this.birthClient = 0;
		/** untracked births */
		this.birthArcOwner = 0;
		/** how many children you've had by sex with citizens (not whoring) */
		this.birthCitizen = 0;
		/** how many times you've giving birth to your own selfcest babies */
		this.birthFutaSis = 0;
		/** how many units of your cum are stored away for artificially inseminating slaves */
		this.birthSelf = 0;
		/** how many designer babies you've produced */
		this.birthLab = 0;
		/** how many children you've had with the Sisters */
		this.birthOther = 0;
		/** how many children you've carried for other arc owners */
		this.storedCum = 0;
		/** shared variables */
		/** amount of milk given */
		this.milk = 0;
		/** amount of cum given */
		this.cum = 0;
		/** number of births as your slave */
		this.birthsTotal = 0;
		/** number of abortions as your slave */
		this.abortions = 0;
		/** number of miscarriages as your slave */
		this.miscarriages = 0;
		this.laborCount = 0;
		/** How many slaves you have sired. */
		this.slavesFathered = 0;
		/** How many slaves you have knocked up. */
		this.slavesKnockedUp = 0;
		/** amount of oral sex given */
		this.oral = 0;
		/** amount of vaginal sex received */
		this.vaginal = 0;
		/** amount of anal sex received */
		this.anal = 0;
		/** amount of mammary sex received */
		this.mammary = 0;
		/** amount of dicking done */
		this.penetrative = 0;
	}
};

/**
 * Encapsulates various custom properties, set by users
 */
App.Entity.PlayerCustomAddonsState = class PlayerCustomAddonsState {
	constructor() {
		/** adds a custom tattoo */
		this.tattoo = "";
	}
};

/**
 * To ensure that all new eyes contain expected attributes
 */
App.Entity.PlayerEyeState = class PlayerEyeState {
	constructor() {
		this.left = new App.Entity.PlayerIndividualEyeState();
		this.right = new App.Entity.PlayerIndividualEyeState();
		/**
		 * original eye color
		 */
		this.origColor = "blue";
	}
};

App.Entity.PlayerIndividualEyeState = class PlayerIndividualEyeState {
	constructor() {
		/**
		 * type of eye
		 * * 1: normal
		 * * 2: glass
		 * * 3: cybernetic
		 */
		this.type = 1;
		/**
		 * vision of eye
		 * * 1: normal
		 * * 2: impaired
		 * * 3: blind
		 */
		this.vision = 1;
		/**
		 * current eye color
		 */
		this.iris = "blue";
		/**
		 * pupil shape
		 */
		this.pupil = "circular";
		/**
		 * sclera color
		 */
		this.sclera = "white";
	}
};

App.Entity.PlayerRelationshipsState = class PlayerRelationshipsState {
	// in the future this will be used to determine who will be used to sate player lust
	constructor() {
		/** player's wives */
		this.marriage = [];
		/** player's lovers */
		this.lovers = [];
		/** player's friends with benefits */
		this.FWBs = [];
		/** player's best friends */
		this.BFFs = [];
		/** player's friends */
		this.friends = [];
		/** slaves player likes */
		this.likes = [];
		/** slaves player dislikes */
		this.dislikes = [];
		/** slaves player hates */
		this.hates = [];
		/** slaves player slaves */
		this.loathes = [];
		/**
		 * player's emotional obsession
		 * * -2: emotionally bound to you
		 * * -1: emotional slut
		 * * 0: none
		 * * (ID): target of obsession
		 */
		this.obsession = 0;
	}
};

App.Entity.PlayerPornPerformanceState = class {
	constructor() {
		this.feed = 0;
		this.viewerCount = 0;
		this.spending = 0;
		this.prestige = 0;
		this.prestigeDesc = 0;
		/** what porn you are known for */
		this.fameType = "none";
		/** what aspect of you is being focused on for porn */
		this.focus = "none";
		/** your fame in each porn genre */
		this.fame = { };
		for (const genre of App.Porn.getAllGenres()) {
			this.fame[genre.fameVar] = 0;
		}
	}
};

App.Entity.PlayerState = class PlayerState {
	constructor() {
		/** Player's current name */
		this.slaveName = "Anonymous";
		/** Player's current surname
		 * @type {string|number} */
		this.slaveSurname = 0;
		/** Player's original name */
		this.birthName = "Anonymous";
		/** Player's original surname
		 * @type {string|number} */
		this.birthSurname = "";
		/** Player sex ("XX", "XY") */
		this.genes = "XY";
		// exclusive major player variables here
		/** your title's gender
		 *
		 * 0: female; 1: male */
		this.title = 1;
		/**
		 * How strong/are there rumors about you doing unsavory things with your slaves
		 * * 0 - 10: occasional whispers
		 * * 11	- 25: minor rumors
		 * * 26	- 50: rumors
		 * * 51	- 75: bad rumors
		 * * 70	- 100: severe rumors
		 * * 101+: life ruining rumors
		 */
		this.degeneracy = 0;
		/** your favorite refreshment
		 * @type {string} */
		this.refreshment = "cigar";
		/**
		 * * The method of consumption of .refreshment
		 * * 0: smoked
		 * * 1: drank
		 * * 2: eaten
		 * * 3: snorted
		 * * 4: injected
		 * * 5: popped
		 * * 6: orally dissolved
		 */
		this.refreshmentType = 0;
		/** @type {number} */
		this.pronoun = App.Data.Pronouns.Kind.male;
		/**
		 * * career prior to becoming owner
		 * * "wealth"
		 * * "capitalist"
		 * * "mercenary"
		 * * "slaver"
		 * * "engineer"
		 * * "medicine"
		 * * "celebrity"
		 * * "escort"
		 * * "servant"
		 * * "gang"
		 * * "BlackHat"
		 * * "arcology owner"
		 */
		this.career = "capitalist";
		/**
		 * * how player became owner
		 * * "wealth"
		 * * "diligence"
		 * * "force"
		 * * "social engineering"
		 * * "luck"
		 */
		this.rumor = "wealth";
		/** Player's ID */
		this.ID = -1;
		/** your ability to function normally in day to day affairs
		 *
		 * 0: normal, 1: hindered, 2: unable */
		this.physicalImpairment = 0;
		/** Player's prestige */
		this.prestige = 0;
		/** reason for prestige
		 * @type {string|number} */
		this.prestigeDesc = 0;
		this.relationships = new App.Entity.PlayerRelationshipsState();
		this.father = 0;
		this.mother = 0;
		this.daughters = 0;
		this.sisters = 0;
		/** week you was born (int between 0-51) */
		this.birthWeek = jsRandom(0, 51);
		/** How old you really are. */
		this.actualAge = 35;
		/** How old your body looks. */
		this.visualAge = 35;
		/** How old your body is. */
		this.physicalAge = 35;
		/** How old your ovaries are. (used to trick menopause) */
		this.ovaryAge = 35;
		/** has had facial surgery to reduce age. 0: no, 1: yes */
		this.ageImplant = 0;
		/** compatibility **/
		this.devotion = 0;
		this.health = {
			/**
			 * your health
			 * * -90 - : On the edge of death
			 * * -90 - -51: Extremely unhealthy
			 * * -50 - -21: Unhealthy
			 * * -20 -  20: Healthy
			 * * 21  -  50: Very healthy
			 * * 50  -  90: Extremely healthy
			 * * 90  -  : Unnaturally healthy
			 */
			condition: 0,
			/** your short term health damage */
			shortDamage: 0,
			/** your long term health damage */
			longDamage: 0,
			/**
			 * your current illness status
			 * * 0 : Not ill
			 * * 1 : A little under the weather
			 * * 2 : Minor illness
			 * * 3 : Ill
			 * * 4 : serious illness
			 * * 5 : dangerous illness
			 */
			illness: 0,
			/**
			 * your current level of exhaustion
			 * * 0  - 50 : Perfectly fine
			 * * 50 - 80 : tired
			 * * 80 - 100 : exhausted
			 */
			tired: 0,
			/** your combined health (condition - short - long) */
			health: 0
		};
		/**
		 * you have a minor injury ("black eye", "bruise", "split lip")
		 * @type {number | string}
		 */
		this.minorInjury = 0;
		/**
		 * you have a life-changing injury/malaise
		 * @type {number | string}
		 */
		this.criticalDamage = 0;
		/**
		 * your weight
		 * * 191+: dangerously obese
		 * * 190 - 161: super obese
		 * * 160 - 131: obese
		 * * 130 - 96: fat
		 * * 95 - 31: overweight
		 * * 30 - 11: curvy
		 * * 10 - -10: neither too fat nor too skinny
		 * * -11 - -30: thin
		 * * -31 - -95: very thin
		 * * -96 - : emaciated
		 */
		this.weight = 0;
		/**
		 * your musculature
		 * * 96+ : extremely muscular
		 * * 31 - 95: muscular
		 * * 6 - 30: toned
		 * * -5 - 5: none
		 * * -30 - -6: weak
		 * * -95 - -31: very weak
		 * * -96- : frail
		 */
		this.muscles = 30;
		/**
		 * your height in cm
		 * * < 150: petite
		 * * 150 - 159: short
		 * * 160 - 169: average
		 * * 170 - 185: tall
		 * * 186+ : very tall
		 */
		this.height = 185;
		/** you have height implant
		 * -1: -10 cm, 0: none, 1: +10 cm */
		this.heightImplant = 0;
		/** your nationality */
		this.nationality = "Stateless";
		/** your race */
		this.race = "white";
		/** your original race */
		this.origRace = "white";
		/**
		 * your markings
		 * * "beauty mark"
		 * * "birthmark"
		 * * "freckles"
		 * * "heavily freckled"
		 */
		this.markings = "none";
		/** "none", "glasses", "corrective glasses", "corrective contacts" */
		this.eyewear = "none";
		/**
		 * your eyes
		 */
		this.eye = new App.Entity.PlayerEyeState();
		/** your hearing
		 *
		 * -2: deaf; -1: hard of hearing; 0: normal */
		this.hears = 0;
		/** "none", "hearing aids", "muffling ear plugs", "deafening ear plugs" */
		this.earwear = "none";
		/** is there an inner ear implant device
		 * 0: no; 1: yes */
		this.earImplant = 0;
		/** the shape of your outer ears
		 * "none", "damaged", "normal", "pointy", "elven", "ushi" */
		this.earShape = "normal";
		/** type of kemonomimi ears if any
		 * "neko", "inu", "kit", "tanuki", "usagi" */
		this.earT = "none";
		/** kemonomimi ear color
		 * "hairless" */
		this.earTColor = "hairless";
		/** sense of smell
		0 - yes, -1 - no */
		this.smells = 0;
		/** sense of taste
		0 - yes, -1 - no */
		this.tastes = 0;
		/** horn type if any
		 * "none", "curved succubus horns", "backswept horns", "cow horns", "one long oni horn", "two long oni horns", "small horns" */
		this.horn = "none";
		/** horn color */
		this.hornColor = "none";
		/** type of tail installed
		 * "none", "mod", "combat", "sex"*/
		this.tail = "none";
		/**
		 * Do you have a tail interface installed
		 * * 0: no
		 * * 1: yes
		 */
		this.PTail = 0;
		/** the current shape of your modular tail
		 * "none", "neko", "inu", "kit", "kitsune", "tanuki", "ushi", "usagi", "risu", "uma" */
		this.tailShape = "none";
		/** tail color */
		this.tailColor = "none";
		/** yout original hair color, defaults to your initial hair color. */
		this.origHColor = "blonde";
		/** hair color */
		this.hColor = "blonde";
		/** pubic hair color */
		this.pubicHColor = "blonde";
		/** armpit hair style */
		this.underArmHColor = "blonde";
		/** eyebrowHColor*/
		this.eyebrowHColor = "blonde";
		/** your original skin color. */
		this.origSkin = "light";
		/** skin color */
		this.skin = "light";
		/**
		 * hair length
		 * * 150: calf-length
		 * * 149-100: ass-length
		 * * 99-30: long
		 * * 29-10: shoulder-length
		 * * 9-0: short
		 */
		this.hLength = 2;
		/**
		 * eyebrow thickness
		 * * "pencil-thin"
		 * * "thin"
		 * * "threaded"
		 * * "natural"
		 * * "tapered"
		 * * "thick"
		 * * "bushy"
		 */
		this.eyebrowFullness = "natural";
		/** hair style */
		this.hStyle = "neat";
		/** pubic hair style */
		this.pubicHStyle = "hairless";
		/** armpit hair style */
		this.underArmHStyle = "hairless";
		/** eyebrowHStyle */
		this.eyebrowHStyle = "natural";
		/**
		 * slave waist
		 * * 96+: masculine
		 * * 95 - 41: ugly
		 * * 40 - 11: unattractive
		 * * 10 - -10: average
		 * * -11 - -40: feminine
		 * * -40 - -95: hourglass
		 * * -96-: absurd
		 */
		this.waist = 0;
		/** series of rings up the back that can be tied together. 0: no, 1: yes */
		this.corsetPiercing = 0;
		/**
		 * What level of prosthetic interface you have installed
		 * * 0: no interface
		 * * 1: basic interface
		 * * 2: advanced interface
		 */
		this.PLimb = 0;
		/**
		 * your legs
		 */
		this.leg = {
			left: new App.Entity.LimbState(),
			right: new App.Entity.LimbState()
		};
		/**
		 * your arms
		 */
		this.arm = {
			left: new App.Entity.LimbState(),
			right: new App.Entity.LimbState()
		};
		/** are your heels clipped
		 *
		 * 0: no, 1: yes */
		this.heels = 0;
		/** your voice
		 *
		 * 0: mute, 1: deep, 2: feminine, 3: high, girly */
		this.voice = 1;
		/** has voice implant
		 *
		 * 0: no; 1: yes, high; -1: yes, low */
		this.voiceImplant = 0;
		/** have cybernetic voicebox
		 *
		 * 0: no; 1: yes */
		this.electrolarynx = 0;
		/**
		 * your accent
		 * * 0: none
		 * * 1: attractive
		 * * 2: heavy
		 * * 3: does not speak language
		 */
		this.accent = 0;
		/**
		 * shoulder width
		 * * -2: very narrow
		 * * -1: narrow
		 * * 0: feminine
		 * * 1: broad
		 * * 2: very broad
		 */
		this.shoulders = 0;
		/**
		 * have shoulder implant
		 *
		 * * -1: shoulders -1
		 * * 0: none
		 * * 1: shoulders +1
		 */
		this.shouldersImplant = 0;
		/**
		 * your boob size (in cc)
		 * * 0-299	- flat;
		 * * 300-399   - A-cup;
		 * * 400-499   - B-cup
		 * * 500-649   - C-cup
		 * * 650-799   - D-cup
		 * * 800-999   - DD-cup
		 * * 1000-1199 - F-cup
		 * * 1200-1399 - G-cup
		 * * 1400-1599 - H-cup
		 * * 1600-1799 - I-cup
		 * * 1800-2049 - J-cup
		 * * 2050-2299 - K-cup
		 * * 2300-2599 - L-cup
		 * * 2600-2899 - M-cup
		 * * 2900-3249 - N-cup
		 * * 3250-3599 - O-cup
		 * * 3600-3949 - P-cup
		 * * 3950-4299 - Q-cup
		 * * 4300-4699 - R-cup
		 * * 4700-5099 - S-cup
		 * * 5100-5499 - T-cup
		 * * 5500-6499 - U-cup
		 * * 6500-6999 - V-cup
		 * * 7000-7499 - X-cup
		 * * 7500-7999 - Y-cup
		 * * 8000-8499 - Z-cup
		 * * 8500-8999 - ZZ-cup
		 * * 9000-9999 - ZZZ-cup
		 * * 10000-14999 - obscenely massive
		 * * 15000-24999 - arm filling
		 * * 25000-39999 - figure dominating
		 * * 40000-54999 - beachball-sized
		 * * 55000-69999 - lap filling
		 * * 70000-89999 - door-crowding
		 * * 90000-100000 - door-jamming
		 */
		this.boobs = 100;
		/** breast engorgement from unmilked tits */
		this.boobsMilk = 0;
		/**
		 * your implant size
		 * * 0: no implants;
		 * * 1-199: small implants;
		 * * 200-399: normal implants;
		 * * 400-599: large implants;
		 * * 600+: boobsImplant size fillable implants
		 */
		this.boobsImplant = 0;
		/**
		 * Implant type
		 * * "none"
		 * * "normal"
		 * * "string"
		 * * "fillable"
		 * * "advanced fillable"
		 * * "hyper fillable"
		 */
		this.boobsImplantType = "none";
		/**
		 * breast shape
		 * * "normal"
		 * * "perky"
		 * * "saggy"
		 * * "torpedo-shaped"
		 * * "downward-facing"
		 * * "wide-set"
		 */
		this.boobShape = "perky";
		/**
		 * nipple shape
		 * * "huge"
		 * * "puffy"
		 * * "inverted"
		 * * "tiny"
		 * * "cute"
		 * * "partially inverted"
		 * * "fuckable"
		 */
		this.nipples = "cute";
		/**
		 * nipple are pierced
		 * @default 0
		 * 0: none; 1: yes; 2: heavily */
		this.nipplesPiercing = 0;
		/** what accessory, if any, are on your nipples */
		this.nipplesAccessory = "none";
		/** slave areolae
		 *
		 * 0: normal; 1: large; 2: unusually wide; 3: huge, 4: massive */
		this.areolae = 0;
		/** edge of areolae are pierced
		 * @default 0
		 * 0: none; 1: yes; 2: heavy */
		this.areolaePiercing = 0;
		/** your areolae shape ("heart"; "star"; "circle") */
		this.areolaeShape = "circle";
		/**
		 * boobs tattoo
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string | number}
		 */
		this.boobsTat = 0;
		/** your lactation
		 *
		 * 0: none; 1: natural; 2: implant */
		this.lactation = 0;
		/** how many more weeks until lactation dries up
		 *
		 * usually 2 as interactions and lact. implant reset it to 2 */
		this.lactationDuration = 0;
		/**
		 * odds of inducing lactation
		 *
		 * begins trying on breast play if over 10 */
		this.induceLactation = 0;
		/** 0: 10: not used to producing milk(no bonuses);
		 * 11: 50: used to producing milk;
		 * 51: 100: heavily adapted to producing milk(big bonus) */
		this.lactationAdaptation = 0;
		/**
		 * hip size
		 * * -2: very narrow
		 * * -1: narrow
		 * * 0: normal
		 * * 1: wide hips
		 * * 2: very wide hips
		 * * 3: inhumanly wide hips
		 */
		this.hips = 0;
		/** you have hip implant
		 *
		 * -1: hips -1; 0: none; 1: hips +1 */
		this.hipsImplant = 0;
		/**
		 * butt size
		 * * 0	: flat
		 * * 1	: small
		 * * 2   : plump *
		 * * 3	: big bubble butt
		 * * 4	: huge
		 * * 5	: enormous
		 * * 6	: gigantic
		 * * 7	: ridiculous
		 * * 8 - 10: immense
		 * * 11 - 20: inhuman
		 *
		 * _* Descriptions vary for just how big 2 is, as such, it may be better to just go with 3_
		 */
		this.butt = 2;
		/**
		 * butt implant type and size
		 *
		 * * 0: none
		 * * 1: butt implant
		 * * 2: big butt implant
		 * * 3: fillable butt implants
		 * * 5 - 8: advanced fillable implants
		 * * 9+: hyper fillable implants
		 */
		this.buttImplant = 0;
		/**
		 * Implant type
		 * * "none"
		 * * "normal"
		 * * "string"
		 * * "fillable"
		 * * "advanced fillable"
		 * * "hyper fillable"
		 */
		this.buttImplantType = "none";
		/**
		 * butt tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.buttTat = 0;
		/**
		 * face attractiveness
		 *
		 * * -96 - : very ugly
		 * * -95 - -41: ugly
		 * * -40 - -11: unattractive
		 * * -10 - 10: attractive
		 * * 11 - 40: very pretty
		 * * 41 - 95: gorgeous
		 * * 96+: mind blowing
		 */
		this.face = 100;
		/**
		 * facial surgery degree
		 *
		 * * 0 - 14: none
		 * * 15 - 34: Subtle Improvements
		 * * 35 - 64: Noticeable Work
		 * * 65 - 99: Heavily Reworked
		 * * 100: Uncanny Valley
		 */
		this.faceImplant = 0;
		/**
		 * accepts string (will be treated as "normal")
		 * * "normal"
		 * * "masculine"
		 * * "androgynous"
		 * * "cute"
		 * * "sensual"
		 * * "exotic"
		 */
		this.faceShape = "normal";
		/**
		 * lip size (0 - 100)
		 * * 0 - 10: thin
		 * * 11 - 20: normal
		 * * 21 - 40: pretty
		 * * 41 - 70: plush
		 * * 71 - 95: huge(lisps)
		 * * 96 - 100: facepussy(mute)
		 */
		this.lips = 15;
		/**
		 * how large her lip implants are
		 * @see lips
		 */
		this.lipsImplant = 0;
		/**
		 * lips pierced
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.lipsPiercing = 0;
		/**
		 * lip tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "permanent makeup"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.lipsTat = 0;
		/**
		 * teeth type
		 * * "normal"
		 * * "crooked"
		 * * "straightening braces"
		 * * "cosmetic braces"
		 * * "removable"
		 * * "pointy"
		 * * "baby"
		 * * "mixed"
		 */
		this.teeth = "normal";
		/**
		 * have tongue piercing
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.tonguePiercing = 0;
		/**
		 * vagina type
		 * * -1: no vagina
		 * * 0: virgin
		 * * 1: tight
		 * * 2: reasonably tight
		 * * 3: loose
		 * * 4: cavernous
		 * * 10: ruined
		 */
		this.vagina = -1;
		/** have has your vagina improved
		 *
		 * 0: no; 1: yes; */
		this.newVag = 0;
		/** exclusive variable
		 * how wet you are
		 *
		 * 0: dry; 1: wet; 2: soaking wet */
		this.vaginaLube = 0;
		/** have vagina piercing
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.vaginaPiercing = 0;
		/**
		 * vagina tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.vaginaTat = 0;
		/**
		 * pregnancy time or state.See Pregnancy Control section for more.
		 * * -3: sterilized
		 * * -2: sterile
		 * * -1: contraceptives
		 * * 0: fertile
		 * * 1 - 10: pregnant, not showing
		 * * 11 - 20: showing
		 * * 21 - 30: pregnant
		 * * 30 - 35: very pregnant
		 */
		this.preg = 0;
		/**
		 * accepts ID See Pregnancy Control section for more.
		 *
		 * Who sired your pregnancy
		 * * -9: a futanari sister
		 * * -8: an animal
		 * * -7: designer baby
		 * * -6: a member of the Societal Elite
		 * * -5: one of your clients
		 * * -4: another arcology owner
		 * * -3: your former Master
		 * * -2: citizen of your arcology
		 * * -1: you
		 * * 0: Unidentifiable
		 */
		this.pregSource = 0;
		/**
		 * Number of children.
		 *
		 * **Warning!** Should be not changed after initial impregnation setup.
		 * See Pregnancy Control section for more.
		 */
		this.pregType = 0;
		/**
		 * Number of ready to be impregnated ova (override normal cases),
		 *
		 * For delayed impregnations with multiples.Used onetime on next call of the SetPregType
		 * widget. After SetPregType use it to override .pregType, it set back to 0 automatically.
		 */
		this.readyOva = 0;
		/** exclusive variable
		 * (uncommon in events)($PC.preg >= 28)
		 * how you act when heavily pregnant
		 * * 0 - no change
		 * * 1 - submissive and motherly
		 * * 2 - aggressive and dominant
		 */
		this.pregMood = 0;
		/**
		 * How adapted you are to being pregnant (allows for larger, safer pregnancies)
		 */
		this.pregAdaptation = 50;
		/**
		 * Ovary implant type.
		 *
		 * * 0: no implants
		 * * "fertility": higher chance of twins (or more)
		 * * "sympathy": doubles eggs released
		 * * "asexual": self-fertilizing
		 */
		this.ovaImplant = 0;
		/**
		 * Womb focused enhancements.
		 *
		 * * "none"
		 * * "restraint": Provides structural support for extremely oversized pregnancies
		 */
		this.wombImplant = "none";
		/**
		 * Menstrual cycle known variable. To be used for fert cycle discover and things like pregnancy without a first period
		 *
		 * * 0: no
		 * * 1: yes
		 */
		this.fertKnown = 0;
		/**
		 * Menstrual cycle control variable.
		 *
		 * * 0: Danger week
		 * * 1+: safe week
		 */
		this.fertPeak = 0;
		/**
		 * are you a broodmother
		 *
		 * * 0: no
		 * * 1: standard 1 birth / week
		 * * 2: black market 12 births / week
		 * * 3: black market upgrade for implant firmware, to allow change weekly number
		 * of ova in range of 1 to 12 in remote surgery block. (broodmotherFetuses change
		 * through remote surgery). (future usage)
		 */
		this.broodmother = 0;
		/**
		 * count of ova that broodmother implant force to release.
		 *
		 * Should be set with "broodmother" property together. If broodmother === 0 has no meaning.
		 */
		this.broodmotherFetuses = 0;
		/**
		 * If broodmother implant set to pause it 's work.
		 *
		 * 1: implant on pause !1: working.
		 *
		 * If broodmother birth her last baby and her implant is on pause, she will be in contraception like state.
		 */
		this.broodmotherOnHold = 0;
		/**
		 * Number of weeks left until last baby will be birthed.
		 *
		 * Mainly informative only. Updated automatically at birth process based on remaining fetuses. 0 - 37
		 */
		this.broodmotherCountDown = 0;
		/**
		 * variable used to set off the birth events
		 *
		 * 1: birth this week; 0: not time yet */
		this.labor = 0;
		/**
		 * may accept strings, use at own risk
		 *
		 * * "none"
		 * * "a small empathy belly"
		 * * "a medium empathy belly"
		 * * "a large empathy belly"
		 * * "a huge empathy belly"
		 * * "a corset"
		 * * "an extreme corset"
		 * * "a support band"
		 */
		this.bellyAccessory = "none";
		/**
		 * labia type
		 * * 0: minimal
		 * * 1: big
		 * * 2: huge
		 * * 3: huge dangling
		 */
		this.labia = 0;
		/**
		 * clit size
		 * * 0: normal
		 * * 1: large
		 * * 2: huge
		 * * 3: enormous
		 * * 4: penis-like
		 * * 5: like a massive penis
		 */
		this.clit = 0;
		/**
		 * is clit pierced
		 * * 0: no
		 * * 1: yes
		 * * 2: heavy
		 * * 3: smart
		 */
		this.clitPiercing = 0;
		/** 0: circumcised; 1+:uncut, also affects foreskin size */
		this.foreskin = 0;
		/**
		 * anus size
		 * * 0: virgin
		 * * 1: tight
		 * * 2: loose
		 * * 3: very loose
		 * * 4: gaping
		 */
		this.anus = 0;
		/** used to calculate size of area around anus. */
		this.analArea = 1;
		/**
		 * dick size
		 * * 0: none
		 * * 1: tiny
		 * * 2: little
		 * * 3: normal
		 * * 4: big
		 * * 5: huge
		 * * 6: gigantic
		 * * 7: massive/gigantic
		 * * 8: truly imposing/titanic
		 * * 9: monstrous/absurd
		 * * 10: awe-inspiring/inhuman
		 * * 11+: hypertrophied
		 */
		this.dick = 4;
		/**
		 * is dick pierced
		 * * 0: no
		 * * 1: yes
		 * * 2: heavy
		 */
		this.dickPiercing = 0;
		/**
		 * dick tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.dickTat = 0;
		/**
		 * does the slave have a prostate?
		 * * 0: no
		 * * 1: normal
		 * * 2: hyperstimulated +20%
		 * * 3: modified hyperstimulated +50%
		 */
		this.prostate = 1;
		/**
		 * ball size
		 * * 0: none
		 * * 1: vestigial
		 * * 2: small
		 * * 3: average
		 * * 4: large
		 * * 5: massive
		 * * 6: huge
		 * * 7: giant
		 * * 8: enormous
		 * * 9: monstrous
		 * * 10: inhuman
		 * * 11+: hypertrophied
		 */
		this.balls = 3;
		/** Exclusive variable
		 * ball size booster
		 * * 0: none
		 */
		this.ballsImplant = 0;
		/**
		 * scrotum size
		 *
		 * function relative to .balls
		 *
		 * *If .balls > 0 and .scrotum === 0, balls are internal*
		 */
		this.scrotum = 4;
		/** has ovaries
		 *
		 * 0: no; 1: yes */
		this.ovaries = 0;
		/** has anus piercing
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.anusPiercing = 0;
		/**
		 * anus tattoo
		 *
		 * takes one of the following strings or 0
		 * * "bleached"
		 * * "tribal patterns"
		 * * "flowers"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.anusTat = 0;
		/**
		 * has makeup
		 * * 0: none
		 * * 1: minimal
		 * * 2: expensive, luxurious
		 * * 3: color-coordinated with hair
		 * * 4: heavy
		 * * 5: neon
		 * * 6: color-coordinated neon
		 * * 7: metallic
		 * * 8: color-coordinated metallic
		 */
		this.makeup = 0;
		/**
		 * nail type
		 * * 0: neatly clipped
		 * * 1: long and elegant
		 * * 2: color-coordinated with hair
		 * * 3: sharp and claw-like
		 * * 4: bright and glittery
		 * * 5: very long and garish
		 * * 6: neon
		 * * 7: color-coordinated neon
		 * * 8: metallic
		 * * 9: color-coordinated metallic
		 */
		this.nails = 0;
		/**
		 * brand
		 *
		 * @type {Object.<string, string>} */
		this.brand = {};
		/** has pierced ears
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.earPiercing = 0;
		/** has pierced nose
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.nosePiercing = 0;
		/** has eyebrow piercing
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.eyebrowPiercing = 0;
		/** has navel piercing
		 *
		 * 0: no; 1: yes; 2: heavy */
		this.navelPiercing = 0;
		/**
		 * shoulder tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.shouldersTat = 0;
		/**
		 * arm tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.armsTat = 0;
		/**
		 * leg tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.legsTat = 0;
		/**
		 * back tattoo
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.backTat = 0;
		/**
		 * tramp stamp
		 *
		 * takes one of the following strings or 0
		 * * "tribal patterns"
		 * * "flowers"
		 * * "scenes"
		 * * "Asian art"
		 * * "degradation"
		 * * "counting"
		 * * "advertisements"
		 * * "rude words"
		 * * "bovine patterns"
		 * * "sacrament"
		 * * "Sacrilege"
		 * * "Possessive"
		 * * "Paternalist"
		 * @type {string|number} */
		this.stampTat = 0;
		/**
		 * * "healthy"
		 * * "restricted"
		 * * "muscle building"
		 * * "fattening"
		 * * "slimming"
		 * * "XX"
		 * * "XY"
		 * * "XXY"
		 * * "cum production"
		 * * "cleansing"
		 * * "fertility"
		 */
		this.diet = "healthy";
		/**
		 * * -2: heavy male hormones
		 * * -1: male hormones
		 * * 0: none
		 * * 1: female hormones
		 * * 2: heavy female hormones
		 */
		this.hormones = 0;
		/** compatibility */
		this.drugs = "no drugs";
		/** 0: none; 1: preventatives; 2: curatives */
		this.curatives = 0;
		/** if greater than 10 triggers side effects from drug use. */
		this.chem = 0;
		/** 0: none; 1: standard; 2: powerful */
		this.aphrodisiacs = 0;
		/**
		 * how addict to aphrodisiacs slave is
		 * * 0: not
		 * * 1-2: new addict
		 * * 3-9: confirmed addict
		 * * 10+: dependent
		 */
		this.addict = 0;
		/**
		 * may accept strings, use at own risk
		 *
		 * * "a nice maid outfit"
		 * * "a slutty outfit"
		 * * "nice business attire"
		 * * "no clothing"
		 */
		this.clothes = "nice business attire";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 */
		this.collar = "none";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "flats"
		 */
		this.shoes = "none";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "bullet vibrator"
		 * * "smart bullet vibrator"
		 * * "dildo"
		 * * "large dildo"
		 * * "huge dildo"
		 * * "long dildo"
		 * * "long, large dildo"
		 * * "long, huge dildo"
		 */
		this.vaginalAccessory = "none";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "vibrator"
		 */
		this.vaginalAttachment = "none";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "sock"
		 * * "vibrator"
		 */
		this.dickAccessory = "none";
		/**
		 * whether the slave has a chastity device on their anus
		 * 0 - no
		 * 1 - yes
		 */
		this.chastityAnus = 0;
		/**
		 * whether the slave has a chastity device on their penis
		 * 0 - no
		 * 1 - yes
		 */
		this.chastityPenis = 0;
		/**
		 * whether the slave has a chastity device on their vagina
		 * 0 - no
		 * 1 - yes
		 */
		this.chastityVagina = 0;
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "hand gloves"
		 * * "elbow gloves"
		 */
		this.armAccessory = "none";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "short stockings"
		 * * "long stockings"
		 */
		this.legAccessory = "none";
		/**
		 * may accept strings, use at own risk
		 * * "none"
		 * * "plug"
		 * * "large plug"
		 * * "huge plug"
		 * * "long plug"
		 * * "long, large plug"
		 * * "long, huge plug"
		 */
		this.buttplug = "none";
		/**
		 * Do you have an attachment on your buttplug
		 *
		 * may accept strings, use at own risk
		 * * "none"
		 * * "tail"
		 * * "fox tail"
		 * * "cat tail"
		 * * "cow tail"
		 */
		this.buttplugAttachment = "none";
		/**
		 * your intelligence
		 * * -100 - -96: borderline retarded
		 * * -95 - -51: very slow
		 * * -50 - -16: slow
		 * * -15 - 15: average
		 * * 16 - 50: smart
		 * * 51 - 95: very smart
		 * * 96 - 100: brilliant
		 */
		this.intelligence = 100;
		/**
		 * Degree of your education
		 * * -15+: miseducated (you appear to be dumber than you really are)
		 * * 0: uneducated
		 * * 1+: partial education (not really used)
		 * * 15+: educated
		 * * 30: well educated
		 */
		this.intelligenceImplant = 30;
		/**
		 * how much fucking you can do in a week
		 */
		this.sexualEnergy = 4; // split this into the following two variables somehow
		/**
		 * sex drive
		 * * 0 - 20: no sex drive
		 * * 21 - 40: poor sex drive
		 * * 41 - 60: average sex drive
		 * * 61 - 80: good sex drive
		 * * 81 - 95: powerful sex drive
		 * * 96+: nymphomaniac
		 */
		this.energy = 80;
		/**
		 * how badly you need sex. Will be how much sex you can have a week
		 *
		 * 0: sated
		 */
		this.need = 0;
		/**
		 * attraction to women
		 * * 0 - 5: disgusted by women
		 * * 6 - 15: turned off by women
		 * * 15 - 35: not attracted to women
		 * * 36 - 65: indifferent to women
		 * * 66 - 85: attracted to women
		 * * 86 - 95: aroused by women
		 * * 96+: passionate about women
		 *
		 * *if both attrXX and attrXY > 95, you will be omnisexual*
		 *
		 * *if energy > 95 and either attrXX or attrXY > 95, you will be nymphomaniac*
		 */
		this.attrXX = 100;
		/**
		 * attraction to men
		 * * 0 - 5: disgusted by men
		 * * 6 - 15: turned off by men
		 * * 15 - 35: not attracted to men
		 * * 36 - 65: indifferent to men
		 * * 66 - 85: attracted to men
		 * * 86 - 95: aroused by men
		 * * 96+: passionate about men
		 *
		 * *if both attrXX and attrXY > 95, you will be omnisexual*
		 *
		 * *if energy > 95 and either attrXX or attrXY > 95, you will be nymphomaniac*
		 */
		this.attrXY = 100;
		/**
		 * * "none"
		 * * "mindbroken"
		 * * "submissive"
		 * * "cumslut"
		 * * "humiliation"
		 * * "buttslut"
		 * * "boobs"
		 * * "sadist"
		 * * "masochist"
		 * * "dom"
		 * * "pregnancy"
		 */
		this.fetish = "none";
		/** how strong your fetish is (10-100)
		 *
		 * 10+: enjoys fetish; 60+: likes fetish; 95+: loves fetish */
		this.fetishStrength = 70;
		/**
		 * * "none"
		 * * "arrogant": clings to her dignity, thinks slavery is beneath her
		 * * "bitchy": can 't keep her opinions to herself
		 * * "odd": says and does odd things
		 * * "hates men": hates men
		 * * "hates women": hates women
		 * * "gluttonous": likes eating, gains weight
		 * * "anorexic": dislikes eating and being forced to eat, loses weight
		 * * "devout": resistance through religious faith
		 * * "liberated": believes slavery is wrong
		 */
		this.behavioralFlaw = "none";
		/**
		 * * "none"
		 * * "confident": believes she has value as a slave
		 * * "cutting": often has as witty or cunning remark ready, knows when to say it
		 * * "funny": is funny
		 * * "fitness": loves working out
		 * * "adores women": likes spending time with women
		 * * "adores men": likes spending time with men
		 * * "insecure": defines herself on the thoughts of others
		 * * "sinful": breaks cultural norms
		 * * "advocate": advocates slavery
		 */
		this.behavioralQuirk = "none";
		/**
		 * * "none"
		 * * "hates oral": hates oral sex
		 * * "hates anal": hates anal sex
		 * * "hates penetration": dislikes penetrative sex
		 * * "shamefast": nervous when naked
		 * * "idealistic": believes sex should be based on love and consent
		 * * "repressed": dislikes sex
		 * * "apathetic": inert during sex
		 * * "crude": sexually crude and has little sense of what partners find disgusting during sex
		 * * "judgemental": sexually judgemental and often judges her sexual partners' performance
		 * * "neglectful": disregards herself in sex
		 * * "cum addict": addicted to cum
		 * * "anal addict": addicted to anal
		 * * "attention whore": addicted to being the center of attention
		 * * "breast growth": addicted to her own breasts
		 * * "abusive": sexually abusive
		 * * "malicious": loves causing pain and suffering
		 * * "self hating": hates herself
		 * * "breeder": addicted to being pregnant
		 */
		this.sexualFlaw = "none";
		/**
		 * * "none"
		 * * "gagfuck queen": can take a facefucking
		 * * "painal queen": knows how far she can go without getting hurt
		 * * "strugglefuck queen": knows how much resistance her partners want
		 * * "tease": is a tease
		 * * "romantic": enjoys the closeness of sex
		 * * "perverted": enjoys breaking sexual boundaries
		 * * "caring": enjoys bring her partners to orgasm
		 * * "unflinching": willing to do anything
		 * * "size queen": prefers big cocks
		 */
		this.sexualQuirk = "none";
		/** 0: does not have; 1: carrier; 2: active
		 * * heterochromia is an exception. String = active
		 */
		this.geneticQuirks = {
			/** Oversized breasts. Increased growth rate, reduced shrink rate. Breasts try to return to oversized state if reduced. */
			macromastia: 0,
			/** Greatly oversized breasts. Increased growth rate, reduced shrink rate. Breasts try to return to oversized state if reduced.
			 *
			 * **macromastia + gigantomastia** - Breasts never stop growing. Increased growth rate, no shrink rate. */
			gigantomastia: 0,
			/** is prone to having twins, shorter pregnancy recovery rate */
			fertility: 0,
			/** is prone to having multiples, even shorter pregnancy recovery rate
			 *
			 * **fertility + hyperFertility** - will have multiples, even shorter pregnancy recovery rate */
			hyperFertility: 0,
			/** pregnancy does not block ovulation, slave can become pregnant even while pregnant */
			superfetation: 0,
			/** is abnormally tall. gigantism + dwarfism - is very average*/
			gigantism: 0,
			/** is abnormally short. gigantism + dwarfism - is very average*/
			dwarfism: 0,
			/** has a flawless face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
			pFace: 0,
			/** has a hideous face. pFace + uFace - Depends on carrier status, may swing between average and above/below depending on it */
			uFace: 0,
			/** has pale skin, white hair and red eyes */
			albinism: 0,
			/** may have mismatched eyes */
			heterochromia: 0,
			/** ass never stops growing. Increased growth rate, reduced shrink rate. */
			rearLipedema: 0,
			/** has (or will have) a huge dong */
			wellHung: 0,
			/** constantly gains weight unless dieting, easier to gain weight. wGain + wLoss - weight gain/loss fluctuates randomly */
			wGain: 0,
			/** constantly loses weight unless gaining, easier to lose weight. wGain + wLoss - weight gain/loss fluctuates randomly */
			wLoss: 0,
			/** body attempts to normalize to an androgynous state */
			androgyny: 0,
			/** constantly gains muscle mass, easier to gain muscle. mGain + mLoss - muscle gain/loss amplified, passively lose muscle unless building */
			mGain: 0,
			/** constantly loses muscle mass, easier to gain muscle. mGain + mLoss - muscle gain/loss amplified, passively lose muscle unless building */
			mLoss: 0,
			/** slave can only ever birth girls */
			girlsOnly: 0
		};
		/** Counts various thing you have done in */
		this.counter = new App.Entity.PlayerActionsCountersState();
		/** Values provided by players */
		this.custom = new App.Entity.PlayerCustomAddonsState();
		/**
		 * You have a tattoo that is only recognizable when you have a big belly.
		 * * "a heart"
		 * * "a star"
		 * * "a butterfly"
		 * @type {string|number} */
		this.bellyTat = 0;
		/**
		 * You have a series of tattoos to denote how many abortions you've had.
		 * * -1: no tattoo
		 * *  0: assigned to have tattoo, may not have one yet
		 * * 1+: number of abortion tattoos she has
		 */
		this.abortionTat = -1;
		/**
		 * You have a series of tattoos to denote how many times you've given birth.
		 * * -1: no tattoo
		 * *  0: assigned to have tattoo, may not have one yet
		 * * 1+: number of birth tattoos she has
		 */
		this.birthsTat = -1;
		/** You will give birth this week.
		 *
		 * 1: true; 0: false */
		this.induce = 0;
		/** You have an anal womb and can get pregnant.
		 *
		 * 1: true; 0: false */
		this.mpreg = 0;
		/** How much fluid is distending your middle.
		 *
		 * 1: 2L; 2: 4L; 3: 8L */
		this.inflation = 0;
		/**
		 * What kind of fluid is in you.
		 * * "none"
		 * * "water"
		 * * "cum"
		 * * "milk"
		 * * "food"
		 * * "aphrodisiac"
		 * * "curative"
		 * * "tightener"
		 * * "urine"
		 */
		this.inflationType = "none";
		/**
		 * How you are being filled.
		 * * 0: not
		 * * 1: oral
		 * * 2: anal
		 * * 3: orally by another slave
		 */
		this.inflationMethod = 0;
		/** If inflationMethod === 3, ID of the slave filling you with milk. */
		this.milkSource = 0;
		/** If inflationMethod 3, ID of the slave filling you with cum. */
		this.cumSource = 0;
		/** Your internals have ruptured. Used with poor health and overinflation.
		 *
		 * 1: true; 0: false */
		this.burst = 0;
		/** Do you know you are pregnant.
		 *
		 * 0: no; 1: yes */
		this.pregKnown = 0;
		/** How long you have been pregnant
		 *
		 * used in place of .preg when pregnancy speed up and slow down are used
		 *
		 * if negative, designates postpartum. */
		this.pregWeek = 0;
		/**
		 * how big your belly is in CCs
		 *
		 * ||thresholds:|
		 * |-|-|
		 * 100	| bloated
		 * 1500   | early pregnancy
		 * 5000   | obviously pregnant
		 * 10000  | very pregnant
		 * 15000  | full term
		 * 30000  | full term twins
		 * 45000  | full term triplets
		 * 60000  | full term quads
		 * 75000  | full term quints
		 * 90000  | full term sextuplets
		 * 105000 | full term septuplets
		 * 120000 | full term octuplets
		 * 150000 | oversized pregnancy
		 * 300000 | hyperpreg state 1
		 * 450000 | hyperpreg state 2
		 * 600000 | hyperpreg state 3
		 * 750000 | hyperpreg state 4
		 */
		this.belly = 0;
		/**
		 * how big your belly is in CCs (pregnancy only)
		 *
		 * ||thresholds|
		 * |-|-|
		 * 100	| bloated
		 * 1500   | early pregnancy
		 * 5000   | obviously pregnant
		 * 10000  | very pregnant
		 * 15000  | full term
		 * 30000  | full term twins
		 * 45000  | full term triplets
		 * 60000  | full term quads
		 * 75000  | full term quints
		 * 90000  | full term sextuplets
		 * 105000 | full term septuplets
		 * 120000 | full term octuplets
		 * 150000 | oversized pregnancy (9+ babies)
		 * 300000 | hyperpreg state 1 (20+ babies)
		 * 450000 | hyperpreg state 2 (30+ babies)
		 * 600000 | hyperpreg state 3 (40+ babies)
		 * 750000 | hyperpreg state 4 (50+ babies)
		 */
		this.bellyPreg = 0;
		/**
		 * how big your belly is in CCs (fluid distension only)
		 *
		 * ||thresholds|
		 * |-|-|
		 * 100   | bloated
		 * 2000  | clearly bloated (2 L)
		 * 5000  | very full (~1 gal)
		 * 10000 | full to bursting (~2 gal)
		 */
		this.bellyFluid = 0;
		/**
		 * Do you have a fillable abdominal implant.
		 * * -1: no
		 * * 0+: yes
		 * * 2000+: Early pregnancy
		 * * 4000+: looks pregnant
		 * * 8000+: looks full term
		 * * 16000+: hyperpregnant 1
		 * * 32000+: hyperpregnant 2
		 */
		this.bellyImplant = -1;
		/** How saggy your belly is after being distended for too long.
		 *
		 * 1+ changes belly description */
		this.bellySag = 0;
		/** How saggy your belly is from being too pregnant.
		 *
		 * 1+ changes belly description and overrides/coincides with bellySag */
		this.bellySagPreg = 0;
		/**
		 * Has the your belly implant been filled this week. Causes health damage for overfilling.
		 *
		 * 0: no pain; 1: will experience pain; 2: cannot be filled this week */
		this.bellyPain = 0;
		/** Do you have a cervical implant that slowly feeds cum from being fucked into a fillable implant.
		 *
		 * 0: no; 1: vaginal version only; 2: anal version only; 3: both vaginal and anal */
		this.cervixImplant = 0;
		/** Target .physicalAge for female puberty to occur. */
		this.pubertyAgeXX = 13;
		/** Have you gone through female puberty.
		 *
		 * 0: no; 1: yes */
		this.pubertyXX = 1;
		/** Target .physicalAge for male puberty to occur. */
		this.pubertyAgeXY = 13;
		/** Have you slave gone through male puberty.
		 *
		 * 0: no; 1: yes */
		this.pubertyXY = 1;
		/**
		 * scar
		 * Sub-object:
		 * the body part in question, such as back or left hand
		 * the key of that part is the type of scar they can have and the value is how serious it is, from 0 up
		 * @type {Object.<string, object>} */
		this.scar = {};
		/**
		 * In a eugenics society, you are a designated breeder.
		 *
		 * 1: yes; 0: no */
		this.breedingMark = 0;
		/**
		 * What species of sperm she produces.
		 * * "human"
		 * * "sterile"
		 * * "dog"
		 * * "pig"
		 * * "horse"
		 * * "cow"
		 */
		this.ballType = "human";
		/**
		 * What species of ovum she produces.
		 * * "human"
		 * * "dog"
		 * * "pig"
		 * * "horse"
		 * * "cow"
		 */
		this.eggType = "human";
		/** */
		this.ageAdjust = 0;
		/** You are bald
		 *
		 * 0: no; 1: yes */
		this.bald = 0;
		/** You are in your original body.
		 *
		 * 0: yes; 1+: number of swaps (increases upkeep each time) */
		this.bodySwap = 0;
		/** Who, if relevant, the body belonged to. */
		this.origBodyOwner = "";
		/** Who, if relevant, the body belonged to. */
		this.origBodyOwnerID = 0;
		/**
		 * Slave's current hormonal balance, directs saHormones changes
		 *
		 * ||thresholds|
		 * |-|-|
		 * -500 - -400 | overwhelmingly masculine
		 * -399 - -300 | extremely masculine
		 * -299 - -200 | heavily masculine
		 * -199 - -100 | very masculine
		 * -99 - -21 | masculine
		 * -20 - 20 | neutral
		 * 21 - 99 | feminine
		 * 100 - 199 | very feminine
		 * 200 - 299 | heavily feminine
		 * 300 - 399 | extremely feminine
		 * 400 - 500 | overwhelmingly feminine
		 */
		this.hormoneBalance = 0;
		/** Do you have the breast shape maintaining mesh implant.
		 *
		 * 0: no; 1: yes */
		this.breastMesh = 0;
		/** Used to denote you are giving birth prematurely.
		 *
		 * 0: no; 1: yes */
		this.prematureBirth = 0;
		/** Were you born prematurely?
		 *
		 * 0: no; 1: yes */
		this.premature = 0;
		/** Have you had a vasectomy?
		 *
		 * 0: no; 1: yes */
		this.vasectomy = 0;
		/** Your skills */
		this.skill = new App.Entity.PlayerSkillsState();
		/** Your Preferences */
		this.rules = new App.Entity.PlayerRulesState();
		/** Whether she was put in the incubator at birth
		 *
		 * 0: no; 1: yes, comforting; 2: yes, terrifying */
		this.tankBaby = 0;
		/** */
		this.clone = 0;
		/** */
		this.geneMods = {
			/** Do you have induced NCS?
			 *
			 * 0: no; 1: yes */
			NCS: 0,
			/** Have you undergone the elasticity (plasticity) treatment?
			 *
			 * 0: no; 1: yes */
			rapidCellGrowth: 0
		};
		/** erratic weight gain
		 *
		 * 0: stable; 1: gaining; -1: losing */
		this.weightDirection = 0;
		// exclusive minor player variables (probably) here
		/** Number of your children reserved for the incubator
		 * int */
		this.reservedChildren = 0;
		/** Number of your children reserved for the nursery
		 * int */
		this.reservedChildrenNursery = 0;
		/** are you on fertility supplements
		 *
		 * 0: no; 1: yes */
		this.fertDrugs = 0;
		/** have you been drugged with fertility drugs
		 *
		 * 0: no; 1+: how many weeks they will remain in your system */
		this.forcedFertDrugs = 0;
		/** Are you taking pills to fuck more slaves each week?
		 *
		 * 0: no; 1: yes */
		this.staminaPills = 0;
	}

	/** Creates an object suitable for setting nested attributes as it would be a SlaveState
	 * @returns {object} object containing all the attributes
	 * that are complex objects in the SlaveState class
	 */
	static makeSkeleton() {
		return {
			arm: {left: {}, right: {}},
			leg: {left: {}, right: {}},
			eye: {left: {}, right: {}},
			readyProsthetics: [], // yes, not an object, but needed for hero slaves
			counter: {},
			brand: {},
			scar: {},
			skill: {},
			rules: {},
			custom: {},
		};
	}
};

/**
 * @callback playerOperation
 * @param {App.Entity.PlayerState} s
 * @returns {void}
 */

/**
 * @callback slaveTestCallback
 * @param {App.Entity.PlayerState} PC
 * @returns {boolean}
 */


code:
/* This function adds the missing slave object variables to the player object and prunes player exclusive variables. You can only imagine what this is used for. */
/* This needs to find some way to survive refresh/newgame without showing up on all saves */
globalThis.convertPlayerToSlave = function(slave, badEnd = "boring") {
	/* add slave variables */
	slave.skill.vaginal = 100;
	slave.skill.oral = 100;
	slave.skill.anal = 100;
	slave.skill.whoring = 0;
	slave.skill.entertainment = 100;
	slave.skill.combat = 1;
	slave.skill.headGirl = 200;
	slave.skill.recruiter = 200;
	slave.skill.bodyguard = 0;
	slave.skill.madam = 100;
	slave.skill.DJ = 0;
	slave.skill.nurse = 0;
	slave.skill.teacher = 0;
	slave.skill.attendant = 0;
	slave.skill.matron = 0;
	slave.skill.stewardess = 0;
	slave.skill.milkmaid = 0;
	slave.skill.farmer = 0;
	slave.skill.wardeness = 200;
	slave.skill.servant = 0;
	slave.skill.entertainer = 100;
	slave.skill.whore = 0;
	/* small skill adjustments */
	if (slave.career === "medicine") {
		slave.skill.nurse = 200;
	} else if (slave.career === "escort") {
		slave.skill.whoring = 100;
		slave.skill.whore = 100;
	} else if (slave.career === "servant") {
		slave.skill.stewardess = 200;
	}
	slave.career = "an arcology owner";
	slave.pronoun = App.Data.Pronouns.Kind.female;
	slave.counter.births = 0;
	slave.counter.publicUse = 0;
	slave.counter.pitKills = 0;
	slave.counter.PCChildrenFathered = 0;
	slave.counter.PCKnockedUp = 0;
	slave.counter.slavesFathered = 0;
	slave.counter.slavesKnockedUp = 0;
	slave.tattoo = "";
	slave.label = "";
	slave.desc = "";
	slave.title = "";
	slave.titleLisp = "";
	slave.image = null;
	slave.hairVector = 0;
	slave.weekAcquired = 0;
	slave.origin = "A former arcology owner that made some poor decisions in $his life.";
	slave.porn = new App.Entity.PlayerPornPerformanceState();
	slave.relationship = 0;
	slave.relationshipTarget = 0;
	slave.rivalry = 0;
	slave.rivalryTarget = 0;
	slave.subTarget = 0;
	slave.father = 0;
	slave.mother = 0;
	slave.daughters = 0;
	slave.sisters = 0;
	slave.canRecruit = 0;
	slave.choosesOwnAssignment = 0;
	slave.assignment = Job.REST;
	slave.sentence = 0;
	slave.training = 0;
	slave.toyHole = "all her holes";
	slave.indenture = -1;
	slave.indentureRestrictions = 0;
	slave.trust = 0;
	slave.oldTrust = 0;
	slave.devotion = -100;
	slave.oldDevotion = -100;
	slave.clitSetting = "vanilla";
	slave.rules = new App.Entity.PlayerRulesState();
	slave.useRulesAssistant = 1;
	slave.dietCum = 0;
	slave.dietMilk = 0;
	slave.fuckdoll = 0;
	slave.choosesOwnClothes = 0;
	slave.clothes = "no clothing";
	slave.sexAmount = 0;
	slave.sexQuality = 0;
	slave.attrKnown = 0;
	slave.fetishKnown = 0;
	slave.rudeTitle = 0;
	slave.currentRules = [];
	slave.HGExclude = 0;
	slave.choosesOwnChastity = 0;
	slave.pregControl = "none";
	slave.readyProsthetics = [];
	slave.death = "";
	slave.onDiet = 0;
	slave.haircuts = 0;
	slave.newGamePlus = 0;
	/* eslint-disable camelcase*/
	slave.NCSyouthening = 0;
	slave.override_Race = 0;
	slave.override_Skin = 0;
	slave.override_Eye_Color = 0;
	slave.override_H_Color = 0;
	slave.override_Pubic_H_Color = 0;
	slave.override_Arm_H_Color = 0;
	slave.override_Brow_H_Color = 0;
	/* eslint-enable */
	slave.albinismOverride = null;
	slave.slaveCost = 0;
	slave.lifetimeCashExpenses = 0;
	slave.lifetimeCashIncome = 0;
	slave.lastWeeksCashIncome = 0;
	slave.lifetimeRepExpenses = 0;
	slave.lifetimeRepIncome = 0;
	slave.lastWeeksRepIncome = 0;
	slave.lastWeeksRepExpenses = 0;
	slave.reservedChildren = 0;
	slave.reservedChildrenNursery = 0;

	/* remove player variables */
	delete slave.skill.trading;
	delete slave.skill.warfare;
	delete slave.skill.slaving;
	delete slave.skill.engineering;
	delete slave.skill.medicine;
	delete slave.skill.hacking;
	delete slave.skill.cumTap;
	delete slave.counter.birthElite;
	delete slave.counter.birthMaster;
	delete slave.counter.birthDegenerate;
	delete slave.counter.birthClient;
	delete slave.counter.birthArcOwner;
	delete slave.counter.birthCitizen;
	delete slave.counter.birthFutaSis;
	delete slave.counter.birthSelf;
	delete slave.counter.birthLab;
	delete slave.counter.birthOther;
	delete slave.counter.storedCum;
	delete slave.relationships;
	delete slave.title;
	delete slave.degeneracy;
	delete slave.refreshment;
	delete slave.refreshmentType;
	delete slave.rumor;
	delete slave.physicalImpairment;
	delete slave.fertDrugs;
	delete slave.forcedFertDrugs;
	delete slave.staminaPills;

	/* badEnd will be used here to apply unique effects depending on the ending */

	switch (badEnd) {
		case "notSupreme":
			slave.boobsTat = `'Subhuman ${capFirstChar(slave.race)}' is printed across $his chest.`;
			break;
		case "subjugated":
			slave.stampTat = `'${capFirstChar(slave.race)} Fuckmeat' is printed above $his butt.`;
			break;
		default:
			slave.buttTat = `'Product of ${V.arcologies[0].name}.' is stamped on $his left buttock.`;
	}

	return slave;
};

repo_name: KnightBoulegard/fc

license: mit


code:
globalThis.basePlayer = function() {
	return new App.Entity.PlayerState();
};

/**
 * Helper function returning PC's title
 * @returns {string}
 */
globalThis.properTitle = function() {
	const PC = V.PC;
	if (PC.customTitle) {
		return PC.customTitle;
	} else if (PC.title !== 0) {
		return "Sir";
	} else {
		return "Ma'am";
	}
};

/**
 * Helper function returning slave's title for PC in situations where WrittenMaster() is inappropriate
 * @returns {string}
 */
globalThis.properMaster = function() {
	const PC = V.PC;
	if (PC.customTitle) {
		return PC.customTitle;
	} else if (PC.title !== 0) {
		return "Master";
	} else {
		return "Mistress";
	}
};

globalThis.PlayerName = function() {
	const names = V.PC.slaveSurname ? [V.PC.slaveName, V.PC.slaveSurname] : [V.PC.slaveName];
	if ((V.surnameOrder !== 1 && ["Cambodian", "Chinese", "Hungarian", "Japanese", "Korean", "Mongolian", "Taiwanese", "Vietnamese"].includes(V.PC.nationality)) || (V.surnameOrder === 2)) {
		names.reverse();
	}
	return names.join(" ");
};

globalThis.PCTitle = function() {
	const titles = [];

	V.PCTitle = PlayerName();

	if (V.cheater === 1) {
		V.PCTitle = (`${V.PCTitle} the Cheater`);
	} else if (V.arcologies[0].FSRestart > 10) {
		V.PCTitle = (`${V.PCTitle} of the Societal Elite`);
	} else if (V.rep > 18000) {
		V.PCTitle = (`${V.PCTitle} the Great`);
	} else if (V.rep > 17000) {
		V.PCTitle = (`the exalted ${V.PCTitle}`);
	} else if (V.rep > 16000) {
		V.PCTitle = (`the illustrious ${V.PCTitle}`);
	} else if (V.rep > 15000) {
		V.PCTitle = (`the prestigious ${V.PCTitle}`);
	} else if (V.rep > 14000) {
		V.PCTitle = (`the renowned ${V.PCTitle}`);
	} else if (V.rep > 13000) {
		V.PCTitle = (`the famed ${V.PCTitle}`);
	} else if (V.rep > 12000) {
		V.PCTitle = (`the celebrated ${V.PCTitle}`);
	} else if (V.rep > 11000) {
		V.PCTitle = (`the honored ${V.PCTitle}`);
	} else if (V.rep > 10000) {
		V.PCTitle = (`the acclaimed ${V.PCTitle}`);
	} else if (V.rep > 9000) {
		V.PCTitle = (`the eminent ${V.PCTitle}`);
	} else if (V.rep > 8250) {
		V.PCTitle = (`the prominent ${V.PCTitle}`);
	} else if (V.rep > 7500) {
		V.PCTitle = (`the distinguished ${V.PCTitle}`);
	} else if (V.rep > 6750) {
		V.PCTitle = (`the admired ${V.PCTitle}`);
	} else if (V.rep > 6000) {
		V.PCTitle = (`the esteemed ${V.PCTitle}`);
	} else if (V.rep > 5250) {
		V.PCTitle = (`the respected ${V.PCTitle}`);
	} else if (V.rep > 4500) {
		V.PCTitle = (`the known ${V.PCTitle}`);
	} else if (V.rep > 3750) {
		V.PCTitle = (`the recognized ${V.PCTitle}`);
	} else if (V.rep > 3000) {
		V.PCTitle = (`the rumored ${V.PCTitle}`);
	}

	V.PCTitle = (`${V.PCTitle}, `);

	if (V.PC.name === "FC Dev") {
		titles.push("the Creator");
	}

	if (V.plot === 1) {
		if (V.invasionVictory === 3) {
			if (V.PC.title === 1) {
				titles.push("Hero of the City");
			} else {
				titles.push("Heroine of the City");
			}
		} else if (V.invasionVictory === 2) {
			titles.push("Defender of the City");
		}
		if (V.daughtersVictory === 3) {
			titles.push("Destroyer of the Daughters");
		} else if (V.daughtersVictory === 2) {
			if (V.PC.title === 1) {
				titles.push("Victor over the Daughters");
			} else {
				titles.push("Victrix over the Daughters");
			}
		}
	}

	if (V.SF.Toggle && V.SF.FS.Tension > 100) {
		switch (V.SF.FS.BadOutcome) {
			case 'MIGRATION':
				titles.push("The Abandoned");
				break;
			case 'Revolt':
				titles.push("The Betrayed");
				break;
			case 'ANNIHILATION':
				titles.push("The Runner");
				break;
			case 'OCCUPATION':
				titles.push("The Occupied");
				break;
			case 'ASSIMILATION':
				titles.push("The Deceived");
				break;
			case 'ISOLATION':
				titles.push("The Ignored");
				break;
		}
	}

	if (V.mercenaries >= 5) {
		if (V.mercenariesTitle === "Evocati") {
			titles.push(`Princeps of the ${V.mercenariesTitle}`);
		} else if (V.mercenariesTitle === "Knights") {
			if (V.PC.title === 1) {
				titles.push(`Lord Commander of the ${V.mercenariesTitle}`);
			} else {
				titles.push(`Lady Commander of the ${V.mercenariesTitle}`);
			}
		} else if (V.mercenariesTitle === "Immortals") {
			titles.push(`Tyrant of the ${V.mercenariesTitle}`);
		} else {
			titles.push(`Commander of the ${V.mercenariesTitle}`);
		}
	} else if (V.mercenaries >= 1) {
		titles.push("Commander of the Mercenaries");
	}

	if (V.dispensary === 1) {
		if (V.PC.title === 1) {
			titles.push("Pharmacologos");
		} else {
			titles.push("Pharmacologes");
		}
	}

	if (V.arcologies[0].FSSupremacist >= V.FSLockinLevel * 0.9) {
		titles.push("Grand Champion of the Blood");
	} else if (V.arcologies[0].FSSupremacist >= V.FSLockinLevel * 0.6) {
		titles.push("Champion of the Blood");
	} else if (V.arcologies[0].FSSupremacist >= V.FSLockinLevel * 0.3) {
		titles.push("Defender of the Blood");
	}

	if (V.arcologies[0].FSSubjugationist >= V.FSLockinLevel * 0.9) {
		titles.push("Grand Overseer of the Inferior Race");
	} else if (V.arcologies[0].FSSubjugationist >= V.FSLockinLevel * 0.6) {
		titles.push("Overseer of the Inferior Race");
	} else if (V.arcologies[0].FSSubjugationist >= V.FSLockinLevel * 0.3) {
		titles.push("Subduer of the Inferior Race");
	}

	if (V.arcologies[0].FSGenderRadicalist >= V.FSLockinLevel * 0.9) {
		titles.push("Buttfucker of All Slaves");
	} else if (V.arcologies[0].FSGenderRadicalist >= V.FSLockinLevel * 0.6) {
		titles.push("Sodomizer of the Traps");
	} else if (V.arcologies[0].FSGenderRadicalist >= V.FSLockinLevel * 0.3) {
		if (V.PC.title === 1) {
			titles.push("Penetrator of the Sissies");
		} else {
			titles.push("Penetratrix of the Sissies");
		}
	}

	if (V.arcologies[0].FSGenderFundamentalist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("Father to the City");
		} else {
			titles.push("Mother to the City");
		}
	} else if (V.arcologies[0].FSGenderFundamentalist >= V.FSLockinLevel * 0.6) {
		titles.push("Defender of Women");
	} else if (V.arcologies[0].FSGenderFundamentalist >= V.FSLockinLevel * 0.3) {
		titles.push("Restorer of Morals");
	}

	if (V.arcologies[0].FSPaternalist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("Protector to All Slaves");
		} else {
			titles.push("Protectrix to All Slaves");
		}
	} else if (V.arcologies[0].FSPaternalist >= V.FSLockinLevel * 0.6) {
		if (V.PC.title === 1) {
			titles.push("Benefactor of Slaves");
		} else {
			titles.push("Benefactrix of Slaves");
		}
	} else if (V.arcologies[0].FSPaternalist >= V.FSLockinLevel * 0.3) {
		titles.push("Pursuer of Justice");
	}

	if (V.arcologies[0].FSRepopulationFocus >= V.FSLockinLevel * 0.9) {
		titles.push("the Savior of the Future");
	} else if (V.arcologies[0].FSRepopulationFocus >= V.FSLockinLevel * 0.6) {
		titles.push("the Holder of the Future");
	} else if (V.arcologies[0].FSRepopulationFocus >= V.FSLockinLevel * 0.3) {
		titles.push("the Repopulist");
	}

	if (V.arcologies[0].FSDegradationist >= V.FSLockinLevel * 0.9) {
		titles.push("Holder of the Rod and the Lash");
	} else if (V.arcologies[0].FSDegradationist >= V.FSLockinLevel * 0.6) {
		titles.push("Subduer of Slaves");
	} else if (V.arcologies[0].FSDegradationist >= V.FSLockinLevel * 0.3) {
		titles.push("Pursuer of Justice");
	}

	if (V.arcologies[0].FSIntellectualDependency >= V.FSLockinLevel * 0.9) {
		titles.push("Sovereign of Bimbos");
	} else if (V.arcologies[0].FSIntellectualDependency >= V.FSLockinLevel * 0.6) {
		titles.push("Shepherd of the Slow");
	} else if (V.arcologies[0].FSIntellectualDependency >= V.FSLockinLevel * 0.3) {
		titles.push("Lover of Bimbos");
	}

	if (V.arcologies[0].FSSlaveProfessionalism >= V.FSLockinLevel * 0.9) {
		titles.push("the Mastermind");
	} else if (V.arcologies[0].FSSlaveProfessionalism >= V.FSLockinLevel * 0.6) {
		titles.push("the Genius");
	} else if (V.arcologies[0].FSSlaveProfessionalism >= V.FSLockinLevel * 0.3) {
		titles.push("the Smart");
	}

	if (V.arcologies[0].FSBodyPurist >= V.FSLockinLevel * 0.9) {
		titles.push("the Purifier of the Breasts");
	} else if (V.arcologies[0].FSBodyPurist >= V.FSLockinLevel * 0.6) {
		titles.push("the Discerning");
	} else if (V.arcologies[0].FSBodyPurist >= V.FSLockinLevel * 0.3) {
		titles.push("the Tasteful");
	}

	if (V.arcologies[0].FSAssetExpansionist >= V.FSLockinLevel * 0.9) {
		titles.push("the Expander of the Breasts");
	} else if (V.arcologies[0].FSAssetExpansionist >= V.FSLockinLevel * 0.6) {
		titles.push("the Expander");
	} else if (V.arcologies[0].FSAssetExpansionist >= V.FSLockinLevel * 0.3) {
		if (V.PC.title === 1) {
			titles.push("the Implanter");
		} else {
			titles.push("the Implantrix");
		}
	}

	if (V.arcologies[0].FSStatuesqueGlorification >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("He Who Stands Above All");
		} else {
			titles.push("She Who Stands Above All");
		}
	} else if (V.arcologies[0].FSStatuesqueGlorification >= V.FSLockinLevel * 0.6) {
		titles.push("Agent of Growth");
	} else if (V.arcologies[0].FSStatuesqueGlorification >= V.FSLockinLevel * 0.3) {
		titles.push("height fetishist");
	}

	if (V.arcologies[0].FSPetiteAdmiration >= V.FSLockinLevel * 0.9) {
		titles.push("Supporter of the Small");
	} else if (V.arcologies[0].FSPetiteAdmiration >= V.FSLockinLevel * 0.6) {
		titles.push("the Size Enthusiast");
	} else if (V.arcologies[0].FSPetiteAdmiration >= V.FSLockinLevel * 0.3) {
		titles.push("height fetishist");
	}

	if (V.arcologies[0].FSPastoralist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("the Master of Stock");
		} else {
			titles.push("the Mistress of Stock");
		}
	} else if (V.arcologies[0].FSPastoralist >= V.FSLockinLevel * 0.6) {
		titles.push("the Rancher");
	} else if (V.arcologies[0].FSPastoralist >= V.FSLockinLevel * 0.3) {
		titles.push("the Farmer");
	}

	if (V.arcologies[0].FSPhysicalIdealist >= V.FSLockinLevel * 0.9) {
		titles.push("beloved of Brodin");
	} else if (V.arcologies[0].FSPhysicalIdealist >= V.FSLockinLevel * 0.6) {
		if (V.PC.title === 1) {
			titles.push("he of the godlike Body");
		} else {
			titles.push("she of the godlike Body");
		}
	} else if (V.arcologies[0].FSPhysicalIdealist >= V.FSLockinLevel * 0.3) {
		titles.push("advancer of Gains");
	}

	if (V.arcologies[0].FSHedonisticDecadence >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("Master of Softness");
		} else {
			titles.push("Lady of Softness");
		}
	} else if (V.arcologies[0].FSHedonisticDecadence >= V.FSLockinLevel * 0.6) {
		titles.push("Thickness Enthusiast");
	} else if (V.arcologies[0].FSHedonisticDecadence >= V.FSLockinLevel * 0.3) {
		titles.push("the Feeder");
	}

	if (V.arcologies[0].FSMaturityPreferentialist >= V.FSLockinLevel * 0.9) {
		titles.push("Grand Preserver of MILFS");
	} else if (V.arcologies[0].FSMaturityPreferentialist >= V.FSLockinLevel * 0.6) {
		titles.push("Fucker of MILFS");
	} else if (V.arcologies[0].FSMaturityPreferentialist >= V.FSLockinLevel * 0.3) {
		if (V.PC.title === 1) {
			titles.push("he of the notorious MILF preference");
		} else {
			titles.push("she of the notorious MILF preference");
		}
	}

	if (V.arcologies[0].FSYouthPreferentialist >= V.FSLockinLevel * 0.9) {
		titles.push("Keeper of the Magnificent Young Harem");
	} else if (V.arcologies[0].FSYouthPreferentialist >= V.FSLockinLevel * 0.6) {
		titles.push("Keeper of Virgins");
	} else if (V.arcologies[0].FSYouthPreferentialist >= V.FSLockinLevel * 0.3) {
		titles.push("the Virginbreaker");
	}

	if (V.arcologies[0].FSChattelReligionistLaw === 1) {
		titles.push("the Prophet");
	} else if (V.arcologies[0].FSChattelReligionist >= V.FSLockinLevel * 0.9) {
		titles.push("Keeper of the Blade and Chalice");
	} else if (V.arcologies[0].FSChattelReligionist >= V.FSLockinLevel * 0.6) {
		titles.push("Champion of the Faith");
	} else if (V.arcologies[0].FSChattelReligionist >= V.FSLockinLevel * 0.3) {
		titles.push("the Holy");
	}

	if (V.arcologies[0].FSRomanRevivalist >= V.FSLockinLevel * 0.9) {
		titles.push("First Consul");
	} else if (V.arcologies[0].FSRomanRevivalist >= V.FSLockinLevel * 0.6) {
		titles.push("Aedile");
	} else if (V.arcologies[0].FSRomanRevivalist >= V.FSLockinLevel * 0.3) {
		titles.push("Quaestor");
	}

	if (V.arcologies[0].FSAztecRevivalist >= V.FSLockinLevel * 0.9) {
		titles.push("Tlatcani");
	} else if (V.arcologies[0].FSAztecRevivalist >= V.FSLockinLevel * 0.6) {
		titles.push("Cihuacoatl");
	} else if (V.arcologies[0].FSAztecRevivalist >= V.FSLockinLevel * 0.3) {
		titles.push("Tlatoani");
	}

	if (V.arcologies[0].FSEgyptianRevivalist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("the Living God");
		} else {
			titles.push("the Living Goddess");
		}
	} else if (V.arcologies[0].FSEgyptianRevivalist >= V.FSLockinLevel * 0.6) {
		titles.push("Pharaoh");
	} else if (V.arcologies[0].FSEgyptianRevivalist >= V.FSLockinLevel * 0.3) {
		if (V.PC.title === 1) {
			titles.push("Prince of the Nile");
		} else {
			titles.push("Princess of the Nile");
		}
	}

	if (V.arcologies[0].FSEdoRevivalist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("Emperor and Descendant of Amaterasu");
		} else {
			titles.push("Amaterasu Reborn");
		}
	} else if (V.arcologies[0].FSEdoRevivalist >= V.FSLockinLevel * 0.6) {
		titles.push("Shogun");
	} else if (V.arcologies[0].FSEdoRevivalist >= V.FSLockinLevel * 0.3) {
		titles.push("Daimyo");
	}

	if (V.arcologies[0].FSArabianRevivalist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("Caliph");
		} else {
			titles.push("Handmaiden of Allah");
		}
	} else if (V.arcologies[0].FSArabianRevivalist >= V.FSLockinLevel * 0.6) {
		if (V.PC.title === 1) {
			titles.push("Sultan");
		} else {
			titles.push("Sultana");
		}
	} else if (V.arcologies[0].FSArabianRevivalist >= V.FSLockinLevel * 0.3) {
		titles.push("Beloved of Allah");
	}

	if (V.arcologies[0].FSChineseRevivalist >= V.FSLockinLevel * 0.9) {
		if (V.PC.title === 1) {
			titles.push("Emperor and Holder of the Mandate of Heaven");
		} else {
			titles.push("Empress and Holder of the Mandate of Heaven");
		}
	} else if (V.arcologies[0].FSChineseRevivalist >= V.FSLockinLevel * 0.6) {
		if (V.PC.title === 1) {
			titles.push("Emperor");
		} else {
			titles.push("Empress");
		}
	} else if (V.arcologies[0].FSChineseRevivalist >= V.FSLockinLevel * 0.3) {
		if (V.PC.title === 1) {
			titles.push("Governor of the Province");
		} else {
			titles.push("Governess of the Province");
		}
	}

	const facilities = App.Entity.facilities;
	if (facilities.brothel.employeesIDs().size >= 15) {
		if (V.PC.title === 1) {
			titles.push("Procurator of the Brothel");
		} else {
			titles.push("Procuratrix of the Brothel");
		}
	}

	if (facilities.club.employeesIDs().size >= 15) {
		titles.push("First on the Club");
	}
	if (facilities.dairy.employeesIDs().size >= 15) {
		titles.push("Keeper of the Cattle");
	}
	if (V.cumSlaves >= 15) {
		if (V.PC.title === 1) {
			titles.push("Extractor of the Ejaculate");
		} else {
			titles.push("Extractrix of the Ejaculate");
		}
	}
	if (facilities.servantsQuarters.employeesIDs().size >= 15) {
		if (V.PC.title === 1) {
			titles.push("Director of the Servants");
		} else {
			titles.push("Directrix of the Servants");
		}
	}
	if (facilities.schoolroom.employeesIDs().size >= 10) {
		if (V.PC.title === 1) {
			titles.push("Educator of the Slaves");
		} else {
			titles.push("Educatrix of the Slaves");
		}
	}
	if (facilities.spa.employeesIDs().size >= 10) {
		titles.push("Order of the Bath");
	}
	if (facilities.arcade.employeesIDs().size >= 15) {
		titles.push("Comptroller of the Arcade");
	}
	if (V.nurseryBabies >= 10) {
		titles.push("Caretaker of the Youth");
	}

	const schoolsPresent = [];
	const schoolsPerfected = [];
	let schoolTitle = "";
	if (V.TSS.schoolProsperity >= 10) {
		schoolsPerfected.push("The Slave School");
	} else if (V.TSS.schoolPresent === 1) {
		schoolsPresent.push("The Slave School");
	}
	if (V.GRI.schoolProsperity >= 10) {
		schoolsPerfected.push("The Growth Research Institute");
	} else if (V.GRI.schoolPresent === 1) {
		schoolsPresent.push("The Growth Research Institute");
	}
	if (V.SCP.schoolProsperity >= 10) {
		schoolsPerfected.push("St. Claver Preparatory");
	} else if (V.SCP.schoolPresent === 1) {
		schoolsPresent.push("St. Claver Preparatory");
	}
	if (V.LDE.schoolProsperity >= 10) {
		schoolsPerfected.push("L'École des Enculées");
	} else if (V.LDE.schoolPresent === 1) {
		schoolsPresent.push("L'École des Enculées");
	}
	if (V.TGA.schoolProsperity >= 10) {
		schoolsPerfected.push("The Gymnasium-Academy");
	} else if (V.TGA.schoolPresent === 1) {
		schoolsPresent.push("The Gymnasium-Academy");
	}
	if (V.HA.schoolProsperity >= 10) {
		schoolsPerfected.push("The Hippolyta Academy");
	} else if (V.HA.schoolPresent === 1) {
		schoolsPresent.push("The Hippolyta Academy");
	}
	if (V.TCR.schoolProsperity >= 10) {
		schoolsPerfected.push("The Cattle Ranch");
	} else if (V.TCR.schoolPresent === 1) {
		schoolsPresent.push("The Cattle Ranch");
	}
	if (V.NUL.schoolProsperity >= 10) {
		schoolsPerfected.push("Nueva Universidad de Libertad");
	} else if (V.NUL.schoolPresent === 1) {
		schoolsPresent.push("Nueva Universidad de Libertad");
	}
	if (schoolsPerfected.length > 0) {
		if (V.PC.title === 1) {
			schoolTitle = "Benefactor of ";
		} else {
			schoolTitle = "Benefactrix of ";
		}
		if (schoolsPerfected.length === 1) {
			schoolTitle += schoolsPerfected[0];
		} else if (schoolsPerfected.length === 2) {
			schoolTitle += `${schoolsPerfected[0]} and ${schoolsPerfected[1]}`;
		} else {
			schoolsPerfected[schoolsPerfected.length - 1] = `and ${schoolsPerfected[schoolsPerfected.length - 1]}`;
			schoolTitle += schoolsPerfected.join(", ");
		}
		titles.push(schoolTitle);
	}

	if (schoolsPresent.length > 0) {
		schoolTitle = "Supporter of ";
		if (schoolsPresent.length === 1) {
			schoolTitle += schoolsPresent[0];
		} else if (schoolsPresent.length === 2) {
			schoolTitle += `${schoolsPresent[0]} and ${schoolsPresent[1]}`;
		} else {
			schoolsPresent[schoolsPresent.length - 1] = `and ${schoolsPresent[schoolsPresent.length - 1]}`;
			schoolTitle += schoolsPresent.join(", ");
		}
		titles.push(schoolTitle);
	}

	if (V.TFS.schoolProsperity >= 10) {
		titles.push("Honorary Sibling of the Futanari Sisters");
	} else if (V.TFS.schoolPresent === 1) {
		if (V.PC.title === 1) {
			titles.push("Protector of the Futanari Sisters");
		} else {
			titles.push("Protectrix of the Futanari Sisters");
		}
	}

	if (V.slaves.length > 50) {
		if (V.PC.title === 1) {
			titles.push("Master of Slaves");
		} else {
			titles.push("Mistress of Slaves");
		}
	} else if (V.slaves.length > 40) {
		titles.push("Holder of Slaves");
	} else if (V.slaves.length > 30) {
		titles.push("Keeper of Slaves");
	} else if (V.slaves.length > 20) {
		titles.push("Manager of Slaves");
	} else if (V.slaves.length > 10) {
		titles.push("owner of slaves");
	}
	const corpValue = App.Corporate.value;
	if (corpValue > 500000) {
		titles.push("Corporate Titan");
	} else if (corpValue > 250000) {
		titles.push("corporate innovator");
	} else if (corpValue > 100000) {
		titles.push("corporate founder");
	} else if (corpValue > 0) {
		if (V.PC.title === 1) {
			titles.push("noted corporate businessman");
		} else {
			titles.push("noted corporate businesswoman");
		}
	}

	if (V.rep > 18000) {
		if (V.PC.title === 1) {
			titles.push("unquestioned Master of the Arcology");
		} else {
			titles.push("unquestioned Mistress of the Arcology");
		}
	} else if (V.rep > 15000) {
		if (V.PC.title === 1) {
			titles.push("Lord of the Arcology");
		} else {
			titles.push("Lady of the Arcology");
		}
	} else if (V.rep > 12000) {
		titles.push("Ruler of the Arcology");
	} else if (V.rep > 9000) {
		titles.push("chief officer of the arcology");
	} else {
		titles.push("owner of the arcology");
	}

	if (titles.length === 1) {
		V.PCTitle += titles[0];
	} else if (titles.length === 2) {
		V.PCTitle += `${titles[0]} and ${titles[1]}`;
	} else {
		titles[titles.length - 1] = `and ${titles[titles.length - 1]}`;
		V.PCTitle += titles.join(", ");
	}
};

/**
 * @param {string} input
 * @param {number} [increase=1]
 * @returns {string}
 */
globalThis.IncreasePCSkills = function(input, increase = 1) {
	if (Array.isArray(input)) {
		return input.reduce((r, inputArray) => r + IncreasePCSkills(inputArray, increase), '');
	}
	const player = V.PC,
	oldSkill = player.skill[input];
	player.skill[input] += increase; let t = ``;

	if (oldSkill < 10 && player.skill[input] >= 10) {
	 t += `<span class="green"> \nYou have gained basic knowledge in ${input}.</span>`;
	} else if (oldSkill < 30 && player.skill[input] >= 30) {
	 t += `<span class="green"> \nYou have gained some knowledge in ${input}.</span>`;
	} else if (oldSkill < 60 && player.skill[input] >= 60) {
	 t += `<span class="green"> \nYou have become an expert in ${input}.</span>`;
	} else if (oldSkill < 100 && player.skill[input] >= 100) {
	 t += `<span class="green"> \nYou have mastered ${input}.</span>`;
	}
	return t;
};


code:
:: PC Skin Workaround [nobr]

<<set $nextButton = "Get in", $nextLink = "PC Surgery Degradation">>

You can enter any color for your skin to be changed to. Once you have chosen, you just have to get in and let the machine do its thing.
<br><<textbox "$PC.skin" $PC.skin "PC Surgery Degradation">>


code:
/*
receiver - What is the state of the network box.
	-1: PC has not been given a welcome packet. (default)
	0: PC has been given a welcome packet but has not installed it.
	1+: box is installed.
channel[numberAsString] - how many times it has been viewed.
channel.last - program viewed last week.
pcViewership.count - How many weeks since the PC last watched FCTV.
pcViewership.frequency - How oftern should the PC watch FCTV.
	-1: Never.
	1: at least once a week.
	2: least every two weeks.
	4: at least once a month. (default)
remote - Does the PC have a FCTV branded remote (also used to trigger a slave acquisition event).
weekEnabled - The week FCTV was installed.
*/
globalThis.FCTV = (function() {
	return {
		channels:channels,
		manage: manage,
		showChannel: showChannel,
		incrementChannel: incrementChannel,
		incrementShow: incrementShow,
		channelCount: channelCount,
		showRange: showRange,
		FinalTouches: FinalTouches
	};

	function channels() {
		return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
	}

	function manage() {
		function convert(a, b) {
			return V.FCTVreceiver ? a : b;
		}
		delete V.FCTVenable;

		V.FCTV.receiver = V.FCTV.receiver > -1 ? V.FCTV.receiver : -1;
		if (convert && V.receiverAvailable) {
			V.FCTV.receiver = V.FCTVreceiver > 0 ? V.FCTVreceiver : 0;
		}

		if (V.FCTV.receiver > -1) {
			V.FCTV.channel = V.FCTV.channel || {};
			V.FCTV.pcViewership = V.FCTV.pcViewership || {};

			for (let i = 0; i < channels().length; i++) {
				let channel = num(channels()[i], true);
				let currentChannel = 'show'+capFirstChar(channel);
				V.FCTV.channel[channel] = convert(V[currentChannel], V.FCTV.channel[channel]) || 0;
			}
			V.FCTV.channel.last = convert(V.lastShow, V.FCTV.channel.last) || -1;

			V.FCTV.pcViewership.count = convert(V.FCTVcount, V.FCTV.pcViewership.count) || 0;
			V.FCTV.pcViewership.frequency = convert(V.FCTVrate, V.FCTV.pcViewership.frequency) || 4;
			V.FCTV.remote = convert(V.FCTVremote, V.FCTV.remote) || 0;

			if (V.FCTVreceiver && !V.FCTV.weekEnabled) {
				V.FCTV.weekEnabled = V.receiverAvailable > 1 ? V.receiverAvailable : 0;
			}
		}
	}

	function showChannel(i) {
		let x = {canSelect: 1, text: `A notification is shown: `};
		switch(i) {
		case 3: case 4:
			if (V.usedRemote && (!V.cheatMode || !V.debugMode)) {
				x.canSelect = -1;
			}
			break;
		case 5:
			if (!V.seePreg) {
				x.canSelect = -1; x.text += `<i>Too much baking detected, changing program.</i>`;
			}
			break;
		case 8:
			if (!V.seeHyperPreg) {
				x.canSelect = -1; x.text += `<i>Too much happiness detected, changing program.</i>`;
			}
			if (!V.seePreg) {
				x.canSelect = -1; x.text += `<i>Too much baking detected, changing program.</i>`;
			}
			break;
		case 10:
			if (!V.seeExtreme) {
				x.canSelect = -1; x.text += `<i>Too much hugging detected, changing program.</i>`;
			}
			if (!V.seeDicks && !V.makeDicks) {
				x.canSelect = -1; x.text += `<i>Too many hot dogs detected, changing program.</i>`;
			}
			break;
		case 11:
			if (V.purchasedSagBGone && V.FCTV.channel[num(i, true)] > 2) {
				x.canSelect = -1; x.text += `<i>Product purchase detected, skipping commercials.</i>`;
			}
			break;
		case 12:
			if (!V.seeIncest) {
				x.canSelect = -1; x.text += `<i>Too much familiarity detected, changing program.</i>`;
			}
			if (V.minimumSlaveAge > 13) {
				x.canSelect = -1; x.text += `<i>Actor not vintage enough, changing program.</i>`;
			}
			break;
		case 14:
			if (V.minimumSlaveAge > 13) {
				x.canSelect = -1; x.text += `<i>Actor not vintage enough, changing program.</i>`;
			}
			break;
		case 16:
			if (!V.seeDicks && !V.makeDicks) {
				x.canSelect = -1; x.text += `<i>Too many hot dogs detected, changing program.</i>`;
			}
			break;
		}

		if (V.all) { x.canSelect = 1; }
		return x;
	}

	function incrementChannel(i = V.FCTV.channel.selected) {
		V.FCTV.channel.selected = i; V.FCTV.channel[num(i, true)]++;
		if (i === 2 && V.FCTV.channel[num(i, true)] >= 12) {
			V.FCTV.channel[num(i, true)] = 0;
		}
		if (
			[14, 15].includes(i) && V.FCTV.channel[num(i, true)] === 3
			|| [13, 16].includes(i) && V.FCTV.channel[num(i, true)] === 4
			|| i === 12 && V.FCTV.channel[num(i, true)] === 9
		) {
			V.FCTV.channel[num(i, true)] = 1;
		}
	}

	function incrementShow() {
		V.show = V.usedRemote ? V.show + 1 : V.show;
	}

	function channelCount(i, operation = 'eq') {
		if (operation === 'eq') {
			if (V.FCTV.channel[num(V.FCTV.channel.selected, true)] === i) {
				return true;
			}
		} else if (operation === 'gt') {
			if (V.FCTV.channel[num(V.FCTV.channel.selected, true)] > i) {
				return true;
			}
		} else if (operation === 'lt') {
			if (V.FCTV.channel[num(V.FCTV.channel.selected, true)] < i) {
				return true;
			}
		}
		return false;
	}

	function showRange(low, max, operation = 'rand') {
		if (V.usedRemote) {
			V.show = !between(V.show, low, max) ? low : V.show;
		} else {
			V.show = operation === 'rand' ? jsRandom(low, max) : either(low, max);
		}
	}

	function FinalTouches(i, channel) {
		if (channel === 14) {
			i.behavioralFlaw = "arrogant"; i.markings = "none";
			if (i.weight > 130) {
				i.weight -= 100; i.waist = random(-10, 50);
			}
			i.health.condition = random(60, 80);
		} else if (channel === 4) {
			i.pubertyXX = 1; i.career = "a slave";
			i.origin = "You purchased $him from FCTV's Home Slave Shopping stream channel.";
			i.health.condition = 75;
			if (V.show < 3) {
				i.custom.tattoo = "$He has a small stylized 'A' tattooed on the nape of $his neck marking $him as the product of the famous breeding program at Arcturus Arcology.";
				Object.assign(i.skill, {
				'vaginal': 0,
				'entertainment': jsRandom(50, 80),
				'oral': jsRandom(20, 60),
				'anal': 0,
				'whoring': 0
				});
			} else if (V.show === 3) {
				Object.assign(i.skill, {
				'vaginal': jsRandom(50, 80),
				'oral': jsRandom(40, 80),
				'anal': jsRandom(20, 50),
				'whoring': jsRandom(0, 50)
				});
			} else if (V.show === 4) {
				Object.assign(i.skill, {
				'vaginal': jsRandom(50, 100),
				'oral': jsRandom(20, 50),
				'anal': jsRandom(10, 20)
				});
				i.counter.birthsTotal = jsRandom(2, 3);
			} else if (V.show === 5) {
				Object.assign(i.skill, {
				'vaginal': jsRandom(50, 100),
				'entertainment': jsRandom(20, 80),
				'oral': jsRandom(50, 100),
				'anal': jsRandom(20, 80),
				'whoring': jsRandom(20, 80)
				});
				i.counter.birthsTotal = jsRandom(1, 3);
			} else if (V.show === 6) {
				Object.assign(i.skill, {
				'vaginal': 15,
				'oral': 15,
				'anal': 15,
				'whoring': 15
				});
			} else if (V.show <= 8) {
				Object.assign(i.skill, {
				'oral': jsRandom(30, 60),
				'anal': jsRandom(20, 50),
				'whoring': jsRandom(0, 25)
				});
			} else if (V.show === 8) {
				Object.assign(i.skill, {
				'oral': jsRandom(40, 80),
				'anal': jsRandom(40, 80),
				'whoring': jsRandom(40, 70)
				});
			}
		}
		i.health.health = i.health.condition - i.health.shortDamage - i.health.longDamage;
	}
})();


code:
:: SE FCTV Install [nobr]

<<set $nextButton = "Continue", $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $encyclopedia = "FCTV", $FCTV.receiver = 0>>

You've been sitting in your office into the early afternoon going over bothersome lease documents that need your approval. When you take a break to look out the window, $assistant.name speaks up. "<<= properTitle()>>, you have received an approval welcome packet from 8HGG Inc. in regards to Free Cities TV. It seems that they've determined that $arcologies[0].name is now sufficiently developed enough to warrant a FCTV-Citizen connection. All the details and contracts necessary are included in the packet. From there, a receiver will need to be built onto $arcologies[0].name in order to access FCTV."

You browse the guide: home shopping networks, random dramas, how-to shows and a myriad of other things. Of more interest are some of the programs showing glimpses into foreign arcologies and how they are using the service to help mold society.

While FCTV attempts to exclude any dick-based, pregnancy, hyperpregnancy, and extreme content based on your settings, it may still hint at that content, especially the more mundane of it. If you wish to be absolutely sure, don't watch FCTV or do not install the receiver.


code:
:: SE FCTV Watch [nobr]

<<set $nextButton = "Continue", $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $encyclopedia = "FCTV">>
<<set $FCTV.pcViewership.count++, _possibleChannels = [0].concat(FCTV.channels())>>

Tired after a long day, you tell <<if $Concubine>>your concubine: @@.pink;$Concubine.slaveName@@<<else>>$assistant.name<</if>> to turn on the TV and
<<if !$usedRemote>>
	set FCTV to find a random show. Your larger-than-life screen flashes on, and is soon playing content from the popular streaming service.
	<<if $cheatMode > 0 || $debugMode > 0 || $FCTV.remote>>
	[[Use your remote|SE FCTV Watch][$usedRemote = 1]]
	<</if>>
	<<for _i = 0;; _i++>>
		<<set $FCTV.channel.selected = _possibleChannels[Math.floor(Math.random() * _possibleChannels.length)]>>
		<<if $FCTV.channel.last > -1 && $FCTV.channel.selected == $FCTV.channel.last>>

There is an audible tone from your screen, which then displays a message: Detected recent viewing, changing channel.

			<<run _possibleChannels.splice($FCTV.channel.selected, 1)>>
			<<continue>>
		<</if>>
		<<if FCTV.showChannel($FCTV.channel.selected).canSelect < 0 && ![3, 4].includes($FCTV.channel.selected)>>

 <<= FCTV.showChannel($FCTV.channel.selected).text>>

			<<run _possibleChannels.splice($FCTV.channel.selected, 1)>>
			<<continue>>
		<</if>>

		<<if _i > 2>>
			<<set $FCTV.channel.selected = -1>> <<break>>
		<</if>>
		<<break>>
	<</for>>
<<elseif $usedRemote && ($cheatMode > 0 || $debugMode > 0 || $FCTV.remote)>>
	bring you the remote so you can choose whatever show you find interesting.

	<<set _pos = 0>>

	<<for _i = 0; _i < _possibleChannels.length; _i++>>
		<<set _pos++>>
		<<capture _i>>
		<<if FCTV.showChannel(_i).canSelect > 0>>
			<<if $FCTV.channel.selected != _i>>
				[[_i|SE FCTV Watch][$FCTV.channel.selected = _i]]
			<<else>>
				<<link "@@.yellow;[_i]@@" "SE FCTV Watch">> <<set $FCTV.channel.selected = _i>> <</link>>
			<</if>>
		<<else>>
			<<if ![3, 4].includes(_i)>>
				<<= App.UI.disabledLink(_i, [FCTV.showChannel(_i).text])>>
			<<else>>
				<<= _i>>
			<</if>>
		<</if>>
		<</capture>>
		<<if _pos == 4>>
 <<set _pos = 0>> <</if>>
	<</for>>

	<<if $cheatMode > 0 || $debugMode > 0>>
		<<link "Toggle inappropriate" "SE FCTV Watch">>
			<<if $all>>
				<<set $all = 0>>
			<<else>>
				<<set $all = 1>>
			<</if>>
		<</link>> |
	<</if>>
	[[Randomise channel selection|SE FCTV Watch][$usedRemote = 0]]
	<<if $FCTV.channel.selected == $FCTV.channel.last>>

You tuned into this channel last week, you may want choose something else.
	<</if>>
	<<if $all>>

There is an audible tone from your screen, which then displays a message:
		Showing all content, for testing purposes.
	<</if>>

<</if>>

<<if $FCTV.channel.selected >= -1>> <<include "SE FCTV Shows">> <</if>>


code:
:: JobFulfillmentCenterDelivery [nobr]

<<set $JFCOrder = 0, $nextButton = "Continue", $nextLink = "Scheduled Event", $returnTo = "Scheduled Event", $encyclopedia = "Enslaving People">>

<<JFCSlave>>
<<set _slaveCost = slaveCost($activeSlave)>>
<<set _slaveCost = _slaveCost*6>>
<<setLocalPronouns $activeSlave>>

A slave dealer has submitted a slave to satisfy your ''$Role'' order.

//As usual, the asking price is quite high, to cover the costs of training a proper <<print $Role>>. In compensation, you can freely decline the slave should $he not meet your standards or the job has already been filled.//

<<set $saleDescription = 1, $applyLaw = 0>><<include "Long Slave Description">>

$His price is <<print cashFormat(_slaveCost)>>.

<<if $cash >= _slaveCost>>
	<<link "Accept the offered slave">>
		<<run cashX(forceNeg(_slaveCost), "slaveTransfer", $activeSlave)>>
		<<replace "#result">>
			$He has been very well trained by the dealer that offered $him to you. $He has also picked up on the fact that $he was specially selected, and is a little hopeful that this means $he may be treated well. $He is now eagerly awaiting your instructions.
			<<include "New Slave Intro">>
			<<set $Role = "">>
			<<if def $JFCReorder>><<run delete $JFCReorder>><</if>>
		<</replace>>
	<</link>>
<<else>>
	//You lack the necessary funds to accept the offered slave.//
<</if>>

<<link "Reject this offer and place the same order again">>
	<<set $JFCOrder = 1>>
	<<set $JFCReorder = 1>>
	<<goto $nextLink>>
<</link>>


code:
:: JobFulfillmentCenterOrder [nobr]

<<set $nextButton = "Back", $nextLink = "Buy Slaves", $returnTo = "Buy Slaves", $encyclopedia = "Kidnapped Slaves">>

<<setAssistantPronouns>>

<<if $JFCOrder == 0>>You work up a new slave order for posting where slave merchants can work to fulfill it.<</if>> <<if $JFCOrder == 1>>You review your posted slave order for a ''$Role''.<</if>> <<if $assistant.personality == 1>>As you work, $assistant.name makes lewd comments about what _heA looks forward to doing to this new slave.<</if>>

<<if $JFCOrder == 0>>

		<<link "Security">>
			<<replace "#JobType">>

					/*<<if $SF.Toggle && $SF.Active >= 1 && $SF.Facility.Toggle > 0 && $SF.Facility.Active > 0 && $SF.Facility.LCActive < 1>>

[[Lieutenant Colonel|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Lieutenant Colonel"]]
					<</if>>*/

[[Bodyguard|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Bodyguard"]]

[[Wardeness|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Wardeness"]]

[[Return|JobFulfillmentCenterOrder]]
			<</replace>>
		<</link>>

<<link "Management">>
			<<replace "#JobType">>

[[Headgirl|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Headgirl"]]

[[Teacher|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Teacher"]]

[[Nurse|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Nurse"]]

[[Attendant (normal)|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Attendant"]] | [[Attendant (motherly)|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Motherly Attendant"]]

[[Matron|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Matron"]]

[[Stewardess|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Stewardess"]]

[[Milkmaid|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Milkmaid"]]

[[Farmer|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Farmer"]]

[[Return|JobFulfillmentCenterOrder]]
			<</replace>>
		<</link>>

<<link "Entertainment">>
			<<replace "#JobType">>

[[DJ|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "DJ"]]

[[Madam|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Madam"]]

[[Concubine|JobFulfillmentCenterOrder][$JFCOrder = 1, $Role = "Concubine"]]

[[Return|JobFulfillmentCenterOrder]]
			<</replace>>
		<</link>>

<<else>>

[[Withdraw slave order|JobFulfillmentCenterOrder][$JFCOrder = 0, $Role = ""]]
<</if>>