diff --git a/src/js/generateNewSlaveJS.tw b/src/js/generateNewSlaveJS.tw new file mode 100644 index 0000000000000000000000000000000000000000..056ca833fe772f0b7752984e005d090cfc8f99cf --- /dev/null +++ b/src/js/generateNewSlaveJS.tw @@ -0,0 +1,1399 @@ +:: Generate New Slave JS [script] + +window.GenerateNewSlave = (function(){ + 'use strict'; + let V, slave; + + function GenerateNewSlave(sex) { + V = State.variables; + BaseSlave(); + slave = V.activeSlave; + + preGenCombinedStats(); + if (!sex) { + if (jsRandom(0,99) < V.seeDicks) { + GenerateXYSlave(); + } else if (V.seeDicks > 0) { + var femaleSlaveGen = 80; + if (V.arcologies[0].FSGenderFundamentalistSMR == 1 || V.arcologies[0].FSRepopulationFocusSMR == 1) { + femaleSlaveGen = 90; + } else if (V.arcologies[0].FSGenderRadicalist != "unset") { + femaleSlaveGen = 50; + } + if (jsRandom(1,100) > femaleSlaveGen && jsRandom(0,99) < V.seeDicks) { + GenerateXYSlave(); + } else { + GenerateXXSlave(); + } + } else { + GenerateXXSlave(); + } + } else if (sex == "XY") { + GenerateXYSlave(); + } else { + GenerateXXSlave(); + } + + postGenCleanup(); + }; + + function preGenCombinedStats() { + slave.ID = V.IDNumber++; + slave.weekAcquired = V.week; + slave.canRecruit = 1; + slave.devotion = jsRandom(-90,-60); + slave.trust = jsRandom(-45,-25); + slave.weight = jsRandom(-100,180); + slave.health = jsRandom(-50,50); + + WombInit(slave); + generateAge(); + generateIntelligence(); + generateCareer(); + generateNationality(); /* includes race selection */ + generateAccent(); + nationalityToName(slave); + generateRacialTraits(); + }; + + function postGenCleanup() { + generateBoobTweaks(); /* split this up for female vs. male? */ + generateSkills(); + generateDisabilities(); + generatePronouns(slave); + if (passage() == "Slave Markets" && V.slaveMarket == "corporate" && V.captureUpgradeRace != "unselected" && V.captureUpgradeRace != "none") { + slave.race = V.captureUpgradeRace; + } + }; + + function GenerateXXSlave() { + slave.ovaries = 1; + slave.pubertyXY = 0; + slave.energy = jsRandom(1,85); + /* Superfetation as rare genetic disorder 1 from 100, not active for now. + if (jsRandom(0,99) < 1) { + slave.superfetation = 1; + } + */ + + generateXXBodyProportions(); + generateVagina(); + generateXXPreferences(); + generateXXButt(); + generateXXBoobs(); + generateXXFace(); + generateXXPregAdaptation(); + generateXXVoice(); + generateXXTeeth(); + generateXXMods(); + generateXXBodyHair(); + generateXXPuberty(); + }; + + function GenerateXYSlave() { + slave.genes = "XY"; + slave.hLength = 10; + slave.prostate = 1; + slave.pubertyXX = 0; + slave.energy = jsRandom(15,90); + + generateXYBodyProportions(); + generateDick(); + generateCircumcision(); + generateXYPreferences(); /* must happen after genitalia generation */ + generateXYButt(); /* must happen after preferences */ + generateXYBoobs(); + generateXYFace(); + generateXYPregAdaptation(); + generateXYVoice(); + generateXYTeeth(); + generateXYMods(); + generateXYBodyHair(); + generateXYPuberty(); + }; + + function generateXXBodyProportions() { + slave.height = Math.round(Height.random(slave)); + if (slave.height >= Height.mean(slave) * 170/162.5) { + slave.hips = jsEither([-1, 0, 0, 1, 1, 2, 2]); + slave.shoulders = jsEither([-1, -1, 0, 0, 0, 1]); + } else { + slave.hips = jsEither([-1, 0, 0, 0, 1, 1, 2]); + slave.shoulders = jsEither([-2, -1, -1, 0, 0, 1]); + } + if (slave.physicalAge <= 11) { + slave.hips = jsEither([-2, -2, -1, -1, 0]); + } else if (slave.physicalAge <= 13) { + slave.hips = jsEither([-2, -1, -1, 0, 1]); + } + if (slave.weight < -30) { + slave.waist = jsRandom(-55,0); + } else if (slave.physicalAge < 13) { + slave.waist = jsRandom(-25,25); + } else if (slave.weight <= 30) { + slave.waist = jsRandom(-45,45); + } else if (slave.weight <= 160) { + slave.waist = jsRandom(0,55); + } else { + slave.waist = jsRandom(50,100); + } + }; + + function generateXYBodyProportions() { + slave.height = Math.round(Height.random(slave)); + if (slave.physicalAge <= 13) { + if (slave.height > Height.mean(slave) * 170/172.5) { + slave.hips = jsEither(-2, -1, -1, 0, 1); + slave.shoulders = jsEither(-1, -1, 0, 0, 0, 1); + } else { + slave.hips = jsEither(-2, -2, -1, -1, 0); + slave.shoulders = jsEither(-2, -1, -1, 0, 0, 1); + } + } else { + if (slave.height > Height.mean(slave) * 170/172.5) { + slave.hips = jsEither(-2, -1, -1, 0, 1); + slave.shoulders = jsEither(-1, 0, 1, 1, 2, 2); + } else { + slave.hips = jsEither(-2, -2, -1, -1, 0); + slave.shoulders = jsEither(-1, 0, 0, 1, 1, 2); + } + } + if (slave.physicalAge < 13) { + slave.waist = jsRandom(-15,25); + } else if (slave.weight < -30) { + slave.waist = jsRandom(-45,45); + } else if (slave.weight <= 30) { + slave.waist = jsRandom(-15,65); + } else if (slave.weight <= 160) { + slave.waist = jsRandom(5,100); + } else { + slave.waist = jsRandom(50,100); + } + }; + + function generateVagina() { + if (slave.physicalAge <= 13) { + slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 0, 1]); + } else if (slave.physicalAge <= 15) { + slave.vagina = jsEither([0, 0, 0, 0, 0, 0, 1, 1]); + } else if (slave.physicalAge <= 17) { + slave.vagina = jsEither([0, 0, 0, 0, 0, 1, 1, 1]); + } else if (slave.physicalAge < 20) { + slave.vagina = jsEither([0, 1]); + } else if (slave.physicalAge > 30) { + slave.vagina = jsEither([1, 1, 1, 1, 2]); + } else { + slave.vagina = jsEither([0, 0, 1, 1, 1]); + } + + if (slave.physicalAge <= 11) { + slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 0, 1]); + } else if (slave.physicalAge <= 13) { + slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]); + } else if (slave.physicalAge <= 15) { + slave.clit = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 2]); + } else { + slave.clit = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 2]); + } + + if (slave.physicalAge <= 11) { + slave.labia = jsEither([0, 0, 0, 0, 0, 0, 0, 1, 1]); + } else if (slave.physicalAge <= 12) { + slave.labia = jsEither([0, 0, 0, 0, 0, 0, 1, 1, 1]); + } else if (slave.physicalAge <= 13) { + slave.labia = jsEither([0, 0, 0, 0, 0, 1, 1, 1, 1]); + } else if (slave.physicalAge <= 14) { + slave.labia = jsEither([0, 0, 0, 0, 1, 1, 1, 1, 2]); + } else if (slave.physicalAge <= 15) { + slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2]); + } else { + slave.labia = jsEither([0, 0, 0, 1, 1, 1, 1, 2, 2, 3]); + } + + if (slave.energy < random(1,80)) { + slave.vaginaLube = 0; + } else if ( slave.physicalAge > random(35,60)) { + slave.vaginaLube = 0; + } else { + slave.vaginaLube = 1; + } + slave.foreskin = jsRandom(0,4); + }; + + function generateDick() { + slave.vagina = -1; + slave.clit = 0; + slave.preg = 0; + + if (slave.physicalAge <= 13) { + slave.dick = jsEither([1, 1, 1, 1, 2, 2, 2, 3]); + if (V.seeExtreme == 1) { + slave.balls = jsEither([0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3]); + } else { + slave.balls = jsEither([1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3]); + } + slave.scrotum = slave.balls; + } else if (slave.physicalAge <= 15) { + slave.dick = jsEither([1, 1, 1, 2, 2, 2, 3]); + if (V.seeExtreme == 1) { + slave.balls = jsEither([0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]); + } else { + slave.balls = jsEither([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 4]); + } + slave.scrotum = slave.balls; + } else if (slave.physicalAge <= 17) { + slave.dick = jsEither([1, 1, 2, 2, 3, 3]); + if (V.seeExtreme == 1) { + slave.balls = jsEither([0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]); + } else { + slave.balls = jsEither([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 5]); + } + slave.scrotum = slave.balls; + } else { + slave.dick = jsEither([1, 2, 2, 2, 3, 3, 3, 4, 4, 5]); + if (V.seeExtreme == 1) { + slave.balls = jsEither([0, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]); + } else { + slave.balls = jsEither([1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5]); + } + if (slave.balls != 0) { + slave.scrotum = slave.balls + jsEither([0, 0, 1]); + } else { + slave.scrotum = 0; + } + if (jsRandom(1,100) < 3) { + slave.vasectomy = 1; + } + } + }; + + function generateCircumcision() { + /* The default rate of 50* is wildly unrepresentative, and there is extreme regional variation. */ + /* + What we want is the prevalence among newborns, since this game + happens about 20 years in the future, but we'll use this lacking + something better. + https://pophealthmetrics.biomedcentral.com/articles/10.1186/s12963-016-0073-5 + Right now we mostly just break it down by country. + It would be better to break it down by both country + and race if statistics are available. + */ + if (V.seeCircumcision == 0) { + slave.foreskin = slave.dick + jsRandom(0,1); + } else { + /* Temporarily use activeSlave.foreskin to store the chance of circumcision. */ + switch (slave.nationality) { + case "Afghan": + case "Iranian": + case "Moroccan": + case "Palestinian": + case "Sahrawi": + case "Tunisian": + slave.foreskin = 100; + break; + case "Comorian": + case "Gabonese": + case "Iraqi": + case "Jordanian": + case "Kurdish": + case "Mauritanian": + case "Nigerian": + case "Tajik": + case "Turkish": + case "Yemeni": + slave.foreskin = 99; + break; + case "Algerian": + case "Azerbaijani": + case "Liberian": + case "Maldivian": + slave.foreskin = 98; + break; + case "Djiboutian": + case "Eritrean": + case "Ivorian": + case "Libyan": + case "Saudi": + case "Uzbek": + slave.foreskin = 97; + break; + case "Nigerien": + case "Pakistani": + case "Sierra Leonean": + case "Turkmen": + case "Zairian": + slave.foreskin = 96; + break; + case "a Cook Islander": + case "Egyptian": + case "Gambian": + case "Guamanian": + case "Malagasy": + case "Nauruan": + case "Ni-Vanuatu": + case "Niuean": + case "Palauan": + case "Samoan": + case "a Solomon Islander": + case "Togolese": + case "Tongan": + case "Tuvaluan": + slave.foreskin = 95; + break; + case "Cameroonian": + case "Senegalese": + case "Somali": + slave.foreskin = 94; + break; + case "Bangladeshi": + case "Beninese": + case "Bissau-Guinean": + case "Indonesian": + case "Syrian": + slave.foreskin = 93; + break; + case "Ethiopian": + case "Filipina": + case "Ghanan": + case "Israeli": + case "Kosovan": + slave.foreskin = 92; + break; + case "Kenyan": + case "Kyrgyz": + slave.foreskin = 91; + break; + case "Burkinabé": + case "Omani": + slave.foreskin = 88; + break; + case "Equatoguinean": + slave.foreskin = 87; + break; + case "Kuwaiti": + case "Malian": + slave.foreskin = 86; + break; + case "Guinean": + slave.foreskin = 84; + break; + case "Bahraini": + slave.foreskin = 81; + break; + case "French Polynesian": + slave.foreskin = 78; + break; + case "American": + case "Qatari": + slave.foreskin = 77; + break; + case "Emirati": + slave.foreskin = 76; + break; + case "Chadian": + slave.foreskin = 74; + break; + case "Tanzanian": + slave.foreskin = 72; + break; + case "Congolese": + slave.foreskin = 70; + break; + case "Central African": + slave.foreskin = 63; + break; + case "Burundian": + case "Malaysian": + slave.foreskin = 61; + break; + case "Lebanese": + slave.foreskin = 60; + break; + case "Angolan": + slave.foreskin = 58; + break; + case "Fijian": + case "Kazakh": + slave.foreskin = 56; + break; + case "Bruneian": + case "Korean": + case "Mosotho": + /* Population-weighted average of South Korea and North Korea. */ + slave.foreskin = 52; + break; + case "New Caledonian": + slave.foreskin = 50; + break; + case "Albanian": + slave.foreskin = 48; + break; + case "Mozambican": + slave.foreskin = 47; + break; + case "South African": + slave.foreskin = 45; + break; + case "Dominican": + slave.foreskin = 43; + break; + case "Bosnian": + slave.foreskin = 42; + break; + case "Sudanese": + slave.foreskin = 39; + break; + case "Mexican": + slave.foreskin = 38; + break; + case "Macedonian": + slave.foreskin = 34; + break; + case "a New Zealander": + slave.foreskin = 33; + break; + case "Canadian": + slave.foreskin = 32; + break; + case "Scottish": + slave.foreskin = 28; + break; + case "Australian": + case "Ugandan": + slave.foreskin = 27; + break; + case "Namibian": + slave.foreskin = 26; + break; + case "South Sudanese": + slave.foreskin = 24; + break; + case "Belgian": + case "Cypriot": + case "Thai": + slave.foreskin = 23; + break; + case "Malawian": + slave.foreskin = 22; + break; + case "British": + slave.foreskin = 21; + break; + case "Puerto Rican": + slave.foreskin = 20; + break; + case "Montenegrin": + slave.foreskin = 19; + break; + case "Mauritian": + slave.foreskin = 17; + break; + case "Motswana": + case "Singaporean": + case "Surinamese": + slave.foreskin = 15; + break; + case "Chinese": + case "French": + case "Indian": + case "Jamaican": + slave.foreskin = 14; + break; + case "Bulgarian": + case "Rwandan": + case "Zambian": + slave.foreskin = 13; + break; + case "French Guianan": + case "Guyanese": + case "Russian": + slave.foreskin = 12; + break; + case "German": + slave.foreskin = 11; + break; + case "Belarusian": + case "Georgian": + case "Papua New Guinean": + slave.foreskin = 10; + break; + case "Japanese": + case "Zimbabwean": + slave.foreskin = 9; + break; + case "Slovene": + case "Sri Lankan": + case "Swazi": + case "Taiwanese": + slave.foreskin = 8; + break; + case "Catalan": + case "Haitian": + case "Spanish": + slave.foreskin = 7; + break; + case "Austrian": + case "Dutch": + case "East Timorese": + case "Swiss": + case "Trinidadian": + slave.foreskin = 6; + break; + case "Danish": + case "Greek": + case "a Liechtensteiner": + case "Swedish": + slave.foreskin = 5; + break; + case "Burmese": + case "Cambodian": + case "Mongolian": + case "Nepalese": + case "Peruvian": + case "Serbian": + slave.foreskin = 4; + break; + case "Argentinian": + case "Italian": + case "Norwegian": + slave.foreskin = 3; + break; + case "Luxembourgian": + case "Tibetan": + case "Ukrainian": + case "Vincentian": + slave.foreskin = 2; + break; + case "Andorran": + case "Barbadian": + case "Bermudian": + case "Bhutanese": + case "Brazilian": + case "Croatian": + case "Finnish": + case "Hungarian": + case "Irish": + case "Moldovan": + case "Monégasque": + case "Panamanian": + case "Portuguese": + case "Seychellois": + case "Uruguayan": + slave.foreskin = 1; + break; + case "Antiguan": + case "Armenian": + case "Bahamian": + case "Belizean": + case "Bolivian": + case "Cape Verdean": + case "Chilean": + case "Colombian": + case "Costa Rican": + case "Cuban": + case "Czech": + case "Dominiquais": + case "Ecuadorian": + case "Estonian": + case "Greenlandic": + case "Grenadian": + case "Guatemalan": + case "Honduran": + case "I-Kiribati": + case "Icelandic": + case "Kittitian": + case "Laotian": + case "Latvian": + case "Lithuanian": + case "Maltese": + case "Marshallese": + case "Micronesian": + case "Nicaraguan": + case "Paraguayan": + case "Polish": + case "Romanian": + case "Saint Lucian": + case "Salvadoran": + case "Sammarinese": + case "São Toméan": + case "Slovak": + case "Vatican": + case "Venezuelan": + case "Vietnamese": + slave.foreskin = 0; + break; + default: + /* Some overlooked country, or possibly stateless. Use global average. */ + slave.foreskin = 38; + } + /* Second pass for minorities in other countries. */ + if (slave.race == "middle eastern" && slave.foreskin < 76) { + slave.foreskin = 76; + } + if (slave.race == "semitic" && slave.foreskin < 90) { + slave.foreskin = 90; + } + /* Chance activeSlave.foreskin back to the normal meaning. */ + if (jsRandom(0,99) < slave.foreskin) { + slave.foreskin = 0; + } else { + slave.foreskin = slave.dick + jsRandom(0,1); + } + } + }; + + function generateXXPreferences() { + randomizeAttraction(slave); + slave.fetishStrength = jsRandom(0,90); + slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "submissive", "cumslut", "humiliation", "humiliation", "buttslut", "boobs", "pregnancy", "dom", "sadist", "masochist"]); + slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates women", "hates women", "anorexic", "gluttonous", "devout", "liberated"]); + + if (slave.behavioralFlaw == "devout") { + slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]); + } else { + slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates penetration", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]); + } + if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) { + slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]); + } + if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) { + slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]); + } + }; + + function generateXYPreferences() { + randomizeAttraction(slave); + slave.fetishStrength = jsRandom(0,90); + slave.fetish = jsEither(["none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none", "submissive", "cumslut", "humiliation", "buttslut", "buttslut", "boobs", "dom", "sadist", "masochist"]); + slave.behavioralFlaw = jsEither(["none", "none", "none", "arrogant", "bitchy", "odd", "hates men", "hates men", "hates men", "hates women", "anorexic", "gluttonous", "devout", "liberated"]); + + if (slave.behavioralFlaw == "devout") { + slave.sexualFlaw = jsEither(["none", "repressed", "shamefast", "apathetic", "crude", "judgemental"]); + } else { + slave.sexualFlaw = jsEither(["none", "none", "none", "none", "hates oral", "hates anal", "hates anal", "repressed", "idealistic", "shamefast", "apathetic", "crude", "judgemental"]); + } + if (slave.behavioralFlaw == "none" && jsRandom(1,10) == 1) { + slave.behavioralQuirk = jsEither(["confident", "cutting", "funny", "adores women", "adores men", "fitness", "insecure", "sinful", "advocate"]); + } + if (slave.sexualFlaw == "none" && jsRandom(1,10) == 1) { + slave.sexualQuirk = jsEither(["gagfuck queen", "painal queen", "strugglefuck queen", "tease", "romantic", "perverted", "caring", "unflinching", "size queen"]); + } + }; + + function generateXXButt() { + if (slave.physicalAge <= 11) { + slave.butt = jsEither([1, 1, 1, 1, 1, 1, 1]); + } else if (slave.physicalAge <= 12) { + slave.butt = jsEither([1, 1, 1, 1, 1, 2, 2]); + } else if (slave.physicalAge <= 13) { + slave.butt = jsEither([1, 1, 1, 1, 2, 2, 2]); + } else if (slave.physicalAge <= 14) { + slave.butt = jsEither([1, 1, 1, 2, 2, 2, 3]); + } else if (slave.physicalAge <= 15) { + slave.butt = jsEither([1, 1, 2, 2, 2, 2, 3]); + } else { + switch (slave.race) { + case "black": + slave.butt = jsEither([1, 2, 2, 3, 3, 4, 4]); + break; + case "indo-aryan": + case "malay": + case "pacific islander": + case "amerindian": + case "asian": + case "middle eastern": + case "semitic": + case "southern european": + slave.butt = jsEither([1, 2, 2, 3, 3]); + break; + default: + slave.butt = jsEither([1, 2, 2, 3, 3, 4]); + } + } + if (V.weightAffectsAssets != 0) { + if (slave.weight < -10 && slave.butt > 1) { + slave.butt -= 1; + } else if (slave.weight > 100 && slave.butt < 6) { + slave.butt += jsRandom(1,2); + } else if (slave.weight > 10 && slave.butt < 4) { + slave.butt += 1; + } + } + slave.anus = jsEither([0, 0, 1, 1, 2]); + slave.analArea = slave.anus + jsEither([0, 0, 0, 1]); + }; + + function generateXYButt() { + if (slave.physicalAge <= 13) { + slave.butt = jsEither([1, 1, 1, 2, 2, 3, 3, 4]); + } else { + slave.butt = jsEither([1, 1, 2, 3]); + } + if (V.weightAffectsAssets != 0) { + if (slave.weight < -10 && slave.butt > 1) { + slave.butt -= 1; + } else if (slave.weight > 100 && slave.butt < 6) { + slave.butt += jsRandom(1,2); + } else if (slave.weight > 10 && slave.butt < 4) { + slave.butt += 1; + } + } + if (slave.attrXY > 0) { + slave.anus = jsEither([0, 1, 2]); + } else { + if (slave.physicalAge <= 13) { + slave.anus = jsEither([0, 0, 0, 0, 0, 1]); + } else if (slave.physicalAge <= 15) { + slave.anus = jsEither([0, 0, 0, 0, 1, 1, 1]); + } else if (slave.physicalAge <= 17) { + slave.anus = jsEither([0, 0, 0, 1, 1, 1]); + } else { + slave.anus = jsEither([0, 0, 1, 1, 2]); + } + } + slave.analArea = slave.anus + jsEither([0, 0, 0, 1]); + }; + + function generateXXBoobs() { + if (slave.physicalAge <= 10) { + slave.boobs = 100; + } else if (slave.physicalAge == 11) { + slave.boobs = jsEither([100, 100, 150, 150, 150, 300]); + } else if (slave.physicalAge == 12) { + slave.boobs = jsEither([100, 100, 150, 150, 150, 200, 200, 300]); + } else if (slave.physicalAge == 13) { + slave.boobs = jsEither([100, 150, 200, 200, 300, 300, 300, 400]); + } else if (slave.physicalAge == 14) { + slave.boobs = jsEither([100, 150, 200, 300, 300, 300, 350, 400, 400]); + } else if (slave.physicalAge == 15) { + slave.boobs = jsEither([150, 200, 300, 300, 300, 350, 350, 350, 400, 400, 450, 450]); + } else { + switch (slave.race) { + case "black": + slave.boobs = BoobGenerator.rollBreast(150); + break; + case "white": + slave.boobs = BoobGenerator.rollBreast(50); + break; + case "asian": + slave.boobs = BoobGenerator.rollBreast(-100); + break; + default: + slave.boobs = BoobGenerator.rollBreast(0); + } + } + }; + + function generateXYBoobs() { + slave.boobs = jsEither([100, 200, 200, 300, 300, 400, 500]); + }; + + function generateXXFace() { + slave.face = jsRandom(-60,60); + if (jsRandom(0,2) == 0) { + slave.face = jsRandom(-10,10); + } + if (slave.physicalAge > 40) { + slave.face -= jsRandom(0,20); + } else if (slave.physicalAge > 35) { + slave.face -= jsRandom(0,10); + } else if (slave.physicalAge <= 20) { + slave.face += jsRandom(0,20); + } else if (slave.physicalAge <= 25) { + slave.face += jsRandom(0,10); + } + if (slave.physicalAge > 10) { + slave.faceShape = jsEither(["androgynous", "cute", "sensual", "exotic", "normal", "normal"]); + } else { + slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]); + } + switch (slave.faceShape) { + case "sensual": + case "cute": + slave.face += jsRandom(0,20); + break; + case "exotic": + case "androgynous": + slave.face += jsRandom(-10,10); + break; + case "masculine": + slave.face += jsRandom(-10,0); + } + }; + + function generateXYFace() { + slave.face = jsRandom(-70,20); + if (jsRandom(0,2) == 0) { + slave.face = jsRandom(-40,-10); + } + if (slave.physicalAge > 40) { + slave.face -= jsRandom(0,20); + } else if (slave.physicalAge > 35) { + slave.face -= jsRandom(0,10); + } else if (slave.physicalAge <= 20) { + slave.face += jsRandom(0,20); + } else if (slave.physicalAge <= 25) { + slave.face += jsRandom(0,10); + } + if (slave.physicalAge >= 17) { + slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous"]); + } else if (slave.physicalAge >= 15) { + slave.faceShape = jsEither(["masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "masculine", "androgynous", "sensual", "exotic", "normal"]); + } else if (slave.physicalAge >= 13) { + slave.faceShape = jsEither(["masculine", "masculine", "masculine", "androgynous", "cute", "sensual", "exotic", "normal"]); + } else if (slave.physicalAge >= 11) { + slave.faceShape = jsEither(["masculine", "androgynous", "cute", "sensual", "exotic", "normal", "normal"]); + } else { + slave.faceShape = jsEither(["androgynous", "androgynous", "cute", "cute", "sensual", "exotic", "normal", "normal"]); + } + switch (slave.faceShape) { + case "sensual": + case "cute": + slave.face += jsRandom(0,20); + break; + case "exotic": + case "androgynous": + slave.face += jsRandom(-10,10); + break; + case "masculine": + slave.face += jsRandom(-10,0); + } + }; + + function generateXXPregAdaptation() { + if (slave.physicalAge <= 6) { + slave.pregAdaptation = 5; + } else if (slave.physicalAge <= 11) { + slave.pregAdaptation = slave.physicalAge - 1; + } else if (slave.physicalAge <= 14) { + slave.pregAdaptation = 4*(slave.physicalAge - 12) + 14; + } else if (slave.physicalAge <= 15) { + slave.pregAdaptation = 28; + } else if (slave.physicalAge <= 16) { + slave.pregAdaptation = 34; + } else if (slave.physicalAge <= 17) { + slave.pregAdaptation = 42; + } else { + slave.pregAdaptation = 50; + } + }; + + function generateXYPregAdaptation() { + if (slave.physicalAge <= 6) { + slave.pregAdaptation = 5; + } else if (slave.physicalAge <= 11) { + slave.pregAdaptation = slave.physicalAge - 1; + } else if (slave.physicalAge <= 15) { + slave.pregAdaptation = 2*(slave.physicalAge - 12) + 12; + } else { + slave.pregAdaptation = 20; + } + }; + + function generateXXVoice() { + if (slave.physicalAge <= 13) { + slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]); + } else if (slave.physicalAge <= 16) { + slave.voice = jsEither([2, 2, 2, 2, 2, 3, 3, 3, 3]); + } else { + slave.voice = jsEither([1, 2, 2, 2, 2, 2, 2, 3, 3, 3]); + } + }; + + function generateXYVoice() { + if (slave.physicalAge <= 11) { + slave.voice = jsEither([2, 2, 2, 3, 3, 3, 3, 3, 3]); + } else if (slave.physicalAge <= 13) { + slave.voice = jsEither([1, 1, 2, 2, 2, 2, 2, 3, 3]); + } else if (slave.physicalAge <= 16) { + slave.voice = jsEither([1, 1, 1, 2, 2, 2, 2, 2, 3]); + } else { + if (slave.balls > 2) { + slave.voice = 1; + } else if (slave.balls > 0) { + slave.voice = jsEither([1, 1, 2]); + } else { + slave.voice = jsEither([1, 2, 2]); + } + } + }; + + function generateXXTeeth() { + var femaleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant; + if ("American" == slave.nationality) { + femaleCrookedTeethGen += 20; + } else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) { + /* do nothing */ + } else { + femaleCrookedTeethGen -= 20; + } + + if (jsRandom(0, femaleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) { + slave.teeth = "crooked"; + } + + if (slave.physicalAge < 6) { + slave.teeth = "baby"; + } else if (slave.physicalAge < 12) { + slave.teeth = "mixed"; + } + }; + + function generateXYTeeth() { + var maleCrookedTeethGen = slave.intelligence+slave.intelligenceImplant; + if ("American" == slave.nationality) { + maleCrookedTeethGen += 22; + } else if (["Andorran", "Antiguan", "Argentinian", "Aruban", "Australian", "Austrian", "Bahamian", "Bahraini", "Barbadian", "Belarusian", "Belgian", "Bermudian", "Brazilian", "British", "Bruneian", "Bulgarian", "Canadian", "Catalan", "Chilean", "a Cook Islander", "Croatian", "Czech", "Cypriot", "Danish", "Dutch", "Emirati", "Estonian", "Finnish", "French", "German", "Greek", "Greenlandic", "Guamanian", "Hungarian", "Icelandic", "Irish", "Israeli", "Italian", "Japanese", "Kazakh", "Korean", "Kuwaiti", "Latvian", "a Liechtensteiner", "Lithuanian", "Luxembourgian", "Malaysian", "Maltese", "Mauritian", "Monégasque", "Montenegrin", "New Caledonian", "a New Zealander", "Niuean", "Norwegian", "Omani", "Palauan", "Panamanian", "Polish", "Portuguese", "Puerto Rican", "Qatari", "Romanian", "Russian", "Sammarinese", "Saudi", "Seychellois", "Singaporean", "Slovak", "Slovene", "Spanish", "Swedish", "Swiss", "Taiwanese", "Trinidadian", "Uruguayan", "Vatican"].includes(slave.nationality)) { + /* do nothing */ + } else { + maleCrookedTeethGen -= 20; + } + + if (jsRandom(0, maleCrookedTeethGen) <= 15 && slave.physicalAge >= 12) { + slave.teeth = "crooked"; + } + + if (slave.physicalAge < 6) { + slave.teeth = "baby"; + } else if (slave.physicalAge < 12) { + slave.teeth = "mixed"; + } + }; + + function generateXXMods() { + if (passage() != "Starting Girls") { + slave.earPiercing = jsEither([0,1]); + slave.nosePiercing = jsEither([0,0,0,1]); + slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]); + slave.clitPiercing = jsEither([0,0,0,0,0,1]); + slave.lipsPiercing = jsEither([0,0,0,0,0,1]); + slave.navelPiercing = jsEither([0,0,0,1]); + slave.nipplesPiercing = jsEither([0,0,0,0,1]); + } + if (slave.anus != 0 && Math.random() < 0.25) { + slave.anusTat = "bleached"; + } + }; + + function generateXYMods() { + if (passage() != "Starting Girls") { + slave.earPiercing = jsEither([0,0,0,1]); + slave.nosePiercing = jsEither([0,0,0,0,1]); + slave.eyebrowPiercing = jsEither([0,0,0,0,0,1]); + slave.clitPiercing = jsEither([0,0,0,0,0,1]); + slave.lipsPiercing = jsEither([0,0,0,0,0,1]); + slave.navelPiercing = jsEither([0,0,0,0,1]); + slave.nipplesPiercing = jsEither([0,0,0,0,1]); + } + if (slave.anus != 0 && Math.random() < 0.25) { + slave.anusTat = "bleached"; + } + }; + + function generateXXBodyHair() { + slave.pubicHColor = slave.hColor; + slave.underArmHColor = slave.hColor; + slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]); + slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy"]); + if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) { + slave.pubicHStyle = "hairless"; + slave.underArmHStyle = "hairless"; + } + if (slave.hColor == "blonde" && Math.random() > 0.85) { + slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]); + slave.override_Brow_H_Color = 1; + } else { + slave.eyebrowHColor = slave.hColor; + } + slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "rounded", "rounded", "rounded", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted inwards", "slanted outwards", "slanted outwards", "high-arched", "high-arched", "high-arched", "elongated", "elongated", "elongated", "shortened", "shortened", "shortened", "curved", "curved", "curved", "curved", "curved", "curved", "curved"]); + slave.eyebrowFullness = jsEither(["pencil-thin", "pencil-thin", "thin", "thin", "thin", "threaded", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "tapered", "thick", "thick", "thick", "bushy", "bushy"]); + }; + + function generateXYBodyHair() { + slave.pubicHColor = slave.hColor; + slave.underArmHColor = slave.hColor; + slave.pubicHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "waxed", "waxed", "in a strip", "in a strip", "in a strip", "neat", "neat", "neat", "neat", "neat", "neat", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy in the front and neat in the rear", "bushy", "bushy", "bushy", "bushy", "bushy", "bushy", "very bushy", "very bushy"]); + slave.underArmHStyle = jsEither(["hairless", "bald", "bald", "waxed", "waxed", "waxed", "waxed", "shaved", "shaved", "shaved", "shaved", "shaved", "neat", "neat", "neat", "neat", "neat", "neat", "neat", "bushy", "bushy", "bushy", "bushy", "bushy"]); + if ((slave.pubicHStyle == "hairless" || slave.underArmHStyle == "hairless") && Math.random() > 0.4) { + slave.pubicHStyle = "hairless"; + slave.underArmHStyle = "hairless"; + } + if (slave.hColor == "blonde" && Math.random() > 0.85) { + slave.eyebrowHColor = jsEither(["brown", "brown", "brown", "brown", "black"]); + slave.override_Brow_H_Color = 1; + } else { + slave.eyebrowHColor = slave.hColor; + } + slave.eyebrowHStyle = jsEither(["bald", "shaved", "shaved", "straight", "straight", "straight", "straight", "straight", "straight", "rounded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved", "curved", "curved", "curved", "curved"]); + slave.eyebrowFullness = jsEither(["pencil-thin", "thin", "thin", "threaded", "threaded", "threaded", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "natural", "tapered", "tapered", "tapered", "thick", "thick", "bushy"]); + }; + + function generateXXPuberty() { + if (slave.physicalAge >= slave.pubertyAgeXX) { + slave.pubertyXX = 1; + } else { + slave.pubertyXX = 0; + } + } + + function generateXYPuberty() { + if (slave.balls > 0) { + if (slave.physicalAge >= slave.pubertyAgeXY) { + slave.pubertyXY = 1; + } else { + slave.pubertyXY = 0; + } + } else { + slave.pubertyXY = 0; + } + }; + + function generateAge() { + if (V.activeSlaveOneTimeMaxAge > 998) { + V.activeSlaveOneTimeMaxAge = (V.pedo_mode === 1) ? 18 : 42; + } else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0 && V.activeSlaveOneTimeMaxAge > 18) { + V.activeSlaveOneTimeMaxAge = 18; + } + if (V.retirementAge < V.activeSlaveOneTimeMaxAge) { + V.activeSlaveOneTimeMaxAge = (V.retirementAge - 1); + } + if (V.activeSlaveOneTimeMinAge < V.minimumSlaveAge) { + V.activeSlaveOneTimeMinAge = V.minimumSlaveAge; + } else if (V.pedo_mode === 1 && V.one_time_age_overrides_pedo_mode === 0) { + V.activeSlaveOneTimeMinAge = V.minimumSlaveAge; + } + if (V.activeSlaveOneTimeMaxAge < V.activeSlaveOneTimeMinAge) { + V.activeSlaveOneTimeMaxAge = V.activeSlaveOneTimeMinAge; + } + if (V.activeSlaveOneTimeMaxAge >= 30 && V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.ageAdjustOverride !== 1) { + V.activeSlaveOneTimeMaxAge += 10; + } + slave.actualAge = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge); + const secondAgeRoll = jsRandom(V.activeSlaveOneTimeMinAge, V.activeSlaveOneTimeMaxAge); + if (V.arcologies[0].FSYouthPreferentialist !== "unset" && V.arcologies[0].FSYouthPreferentialist >= jsRandom(1, 100)) { + slave.actualAge = Math.min(slave.actualAge, secondAgeRoll); + } else if (V.arcologies[0].FSMaturityPreferentialist !== "unset" && V.arcologies[0].FSMaturityPreferentialist >= jsRandom(1, 100)) { + slave.actualAge = Math.max(slave.actualAge, secondAgeRoll); + } + if (slave.actualAge >= V.retirementAge) { + slave.actualAge = (V.retirementAge - 2); + } + V.activeSlaveOneTimeMinAge = 0; + V.activeSlaveOneTimeMaxAge = 999; + V.one_time_age_overrides_pedo_mode = 0; + V.ageAdjustOverride = 0; + slave.visualAge = slave.actualAge; + slave.physicalAge = slave.actualAge; + slave.ovaryAge = slave.actualAge; + slave.age = slave.actualAge; /*compatibility*/ + slave.pubertyAgeXX = V.fertilityAge; + slave.pubertyAgeXY = V.potencyAge; + }; + + function generateIntelligence() { + const gaussian = gaussianPair(); + slave.intelligence = Intelligence.random(); + if (V.AgePenalty == 1 && slave.actualAge <= 24) { + if (gaussian[0] < gaussian[1] + slave.intelligence/29 + (slave.actualAge - 24)/8 - 0.35) { + slave.intelligenceImplant = 15; + if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) { + slave.intelligenceImplant = 30; + } + } + } else { + if (gaussian[0] < gaussian[1] + slave.intelligence/29 - 0.35) { /* 40.23% chance if intelligence is 0, 99.26% chance if intelligence is 100 */ + slave.intelligenceImplant = 15; + if (slave.intelligenceImplant > 0 && jsRandom(15,150) < slave.intelligence) { + slave.intelligenceImplant = 30; + } + } + } + }; + + function generateCareer() { + if (V.AgePenalty == 1) { + if (slave.actualAge < 16) { + slave.career = setup.veryYoungCareers.random(); + } else if (slave.actualAge <= 24) { + slave.career = setup.youngCareers.random(); + } else if (slave.intelligenceImplant >= 15) { + slave.career = setup.educatedCareers.random(); + } else { + slave.career = setup.uneducatedCareers.random(); + } + } else { + if (slave.actualAge < 16) { + slave.career = setup.veryYoungCareers.random(); + } else if (slave.intelligenceImplant >= 15) { + slave.career = setup.educatedCareers.random(); + } else if (slave.actualAge <= 24) { + slave.career = setup.youngCareers.random(); + } else { + slave.career = setup.uneducatedCareers.random(); + } + } + }; + + function generateNationality() { + if (V.fixedRace == 0) { + if (V.fixedNationality == 0) { + slave.nationality = hashChoice(V.nationalities); + } else { + slave.nationality = V.fixedNationality; + V.fixedNationality = 0; + } + nationalityToRace(slave); + + if (passage() == "Corporate Market" && (V.captureUpgradeRace != "unselected") && (V.captureUpgradeRace != "none")) { + if (V.captureUpgradeRace == "mixed race") { + slave.race = "mixed race"; + } else { + const capUpgradeCheck = setup[V.captureUpgradeRace.toLowerCase().replace(/[ -]/g, '')+'Nationalities']; + const keys = Object.keys(capUpgradeCheck); + var capUpgradeNationalities = {}; + for (var i = 0; i < keys.length; i++) { + if (keys[i] in V.nationalities) { + capUpgradeNationalities[keys[i]] = capUpgradeCheck[keys[i]]; + } + } + if (Object.keys(capUpgradeNationalities).length > 0) { + slave.nationality = hashChoice(capUpgradeNationalities); + } else { + slave.nationality = hashChoice(capUpgradeCheck); + } + slave.race = V.captureUpgradeRace; + } + } + + } else { + switch (V.fixedRace) { + case "white": + slave.nationality = hashChoice(setup.whiteNationalities); + break; + case "asian": + slave.nationality = hashChoice(setup.asianNationalities); + break; + case "latina": + slave.nationality = hashChoice(setup.latinaNationalities); + break; + case "black": + slave.nationality = hashChoice(setup.blackNationalities); + break; + case "pacific islander": + slave.nationality = hashChoice(setup.pacificislanderNationalities); + break; + case "southern european": + slave.nationality = hashChoice(setup.southerneuropeanNationalities); + break; + case "amerindian": + slave.nationality = hashChoice(setup.amerindianNationalities); + break; + case "semitic": + slave.nationality = hashChoice(setup.semiticNationalities); + break; + case "middle eastern": + slave.nationality = hashChoice(setup.middleeasternNationalities); + break; + case "indo-aryan": + slave.nationality = hashChoice(setup.indoaryanNationalities); + break; + case "malay": + slave.nationality = hashChoice(setup.malayNationalities); + break; + default: + slave.nationality = hashChoice(V.nationalities); + } + slave.race = V.fixedRace; + V.fixedRace = 0; + } + }; + + function generateAccent() { + nationalityToAccent(slave); + if ((slave.intelligenceImplant >= 15 || slave.intelligence > 95) && slave.accent >= 3 && slave.intelligence > jsRandom(0,100)) { + slave.accent -= 1; + } + }; + + function generateRacialTraits() { + switch (slave.race) { + case "black": + slave.lips = jsRandom(5,30); + slave.skin = jsEither(["black", "dark brown", "brown"]); + slave.hColor = jsEither(["black", "black", "black", "brown"]); + slave.hStyle = jsEither(["neat", "crinkled"]); + break; + case "white": + slave.lips = jsRandom(5,25); + if (slave.nationality == "German") { + slave.skin = jsEither(["pale", "light", "fair"]); + slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]); + slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]); + } else if (slave.nationality == "Icelandic") { + slave.skin = jsEither(["pale", "pale", "light", "fair"]); + slave.eyeColor = jsEither(["blue", "blue", "blue", "brown", "green"]); + slave.hColor = jsEither(["black", "blonde", "blonde", "blonde", "red", "brown"]); + } else if (slave.nationality == "Irish") { + slave.skin = jsEither(["pale", "pale", "light", "fair"]); + slave.eyeColor = jsEither(["blue", "brown", "green", "green", "green"]); + slave.hColor = jsEither(["black", "blonde", "red", "red", "red", "brown"]); + } else if (slave.nationality == "Scottish") { + slave.skin = jsEither(["pale", "fair", "light", "fair"]); + slave.eyeColor = jsEither(["blue", "brown", "brown", "green", "green", "green"]); + slave.hColor = jsEither(["black", "black", "blonde", "red", "red", "red", "brown"]); + } else { + slave.skin = jsEither(["pale", "light", "fair"]); + slave.eyeColor = jsEither(["blue", "brown", "green"]); + slave.hColor = jsEither(["black", "blonde", "red", "brown"]); + } + slave.hStyle = "neat"; + break; + case "latina": + slave.lips = jsRandom(5,25); + slave.skin = jsEither(["light olive", "brown", "dark brown", "tanned", "dark olive"]); + slave.hColor = jsEither(["black", "brown"]); + slave.hStyle = "neat"; + break; + case "indo-aryan": + case "malay": + case "pacific islander": + case "amerindian": + slave.lips = jsRandom(5,25); + slave.skin = jsEither(["dark", "light"]); + slave.hColor = "black"; + slave.hStyle = "neat"; + break; + case "asian": + slave.lips = jsRandom(5,25); + slave.skin = jsEither(["light olive", "dark olive", "light"]); + slave.hColor = "black"; + slave.hStyle = "neat"; + break; + case "middle eastern": + case "semitic": + case "southern european": + slave.lips = jsRandom(5,25); + slave.skin = jsEither(["fair", "light olive", "tanned", "light"]); + slave.hColor = "black"; + slave.hStyle = "neat"; + break; + default: + slave.lips = jsRandom(5,25); + slave.skin = jsEither(["pale", "dark", "light"]); + slave.hColor = jsEither(["black", "black", "black", "black", "brown", "brown", "blonde", "red"]); + slave.hStyle = "neat"; + } + if (slave.skin == "pale" || slave.skin == "fair") { + if (jsRandom(1,4) == 1) { + slave.markings = jsEither(["freckles", "freckles", "freckles", "heavily freckled", "beauty mark", "beauty mark", "birthmark", "birthmark"]); + } + } else if (jsRandom(1,8) == 1) { + slave.markings = jsEither(["beauty mark", "birthmark"]); + } + }; + + function generateBoobTweaks() { + if (V.weightAffectsAssets != 0) { + if (slave.weight < -10 && slave.boobs > 200) { + slave.boobs -= 100; + } else if (slave.weight > 190 && slave.boobs < 3000) { + slave.boobs += (jsRandom(3,8)*100); + } else if (slave.weight > 160 && slave.boobs < 1500) { + slave.boobs += (jsRandom(2,6)*100); + } else if (slave.weight > 130 && slave.boobs < 1500) { + slave.boobs += (jsRandom(1,4)*100); + } else if (slave.weight > 95 && slave.boobs < 1200) { + slave.boobs += (jsRandom(1,3)*100); + } else if (slave.weight > 30 && slave.boobs < 1000) { + slave.boobs += 100; + } + } + + var BoobShapeGen = []; + if (slave.boobs > 250 && slave.boobs < 800) { + BoobShapeGen.push("perky"); + BoobShapeGen.push("downward-facing"); + } + if (slave.boobs > 400 && slave.boobs < 1200) { + BoobShapeGen.push("torpedo-shaped"); + BoobShapeGen.push("wide-set"); + } + if (slave.boobs > 800 && slave.physicalAge > jsRandom(10,50)) { + BoobShapeGen.push("saggy"); + } + if (BoobShapeGen.length == 1) { + if (Math.random() < 0.5) { + slave.boobShape = jsEither(BoobShapeGen); + } + } else if (BoobShapeGen.length > 1) { + if (jsRandom(1,3) != 1) { + slave.boobShape = jsEither(BoobShapeGen); + } + } + + if (slave.boobs < 250) { + slave.nipples = jsEither(["tiny", "tiny", "tiny", "tiny", "cute", "cute", "puffy", "partially inverted"]); + } else if (slave.boobs < 500) { + slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "partially inverted"]); + } else if (slave.boobs < 1000) { + slave.nipples = jsEither(["tiny", "cute", "cute", "cute", "puffy", "puffy", "partially inverted", "inverted"]); + } else { + slave.nipples = jsEither(["cute", "puffy", "partially inverted", "inverted", "huge"]); + } + }; + + function generateSkills() { + slave.vaginalSkill = (slave.vagina == 0 ? 0 : jsRandom(0,15)); + slave.analSkill = (slave.anus == 0 ? 0 : jsRandom(0,15)); + slave.oralSkill = jsRandom(0,15); + slave.entertainSkill = jsRandom(0,15); + slave.whoreSkill = jsRandom(0,15); + }; + + function generateDisabilities() { + if (slave.physicalAge >= jsRandom(0,100)) { + slave.eyes = -1; + } + if (slave.physicalAge >= jsRandom(30,100)) { + slave.hears = -1; + } + if (V.seeExtreme == 1) { + let disList = []; + disList.push("hearNot"); + disList.push("seeNot"); + disList.push("speakNot"); + let disableCount = 0; + if (V.oneTimeDisableDisability === 0) { + while (disList.length > 0) { + let rolled = jsEither(disList); + switch (rolled) { + case "hearNot": + if ((jsRandom(1,100)-(disableCount*2)) > 90) { + slave.hears = -2; + } + disList.delete("hearNot"); + disableCount++; + break; + case "seeNot": + if ((jsRandom(1,100)-(disableCount*2)) > 90) { + slave.eyes = -2; + } + disList.delete("seeNot"); + disableCount++; + break; + case "speakNot": + if ((jsRandom(1,100)-(disableCount*2)) > 90) { + slave.voice = 0; + } + disList.delete("speakNot"); + disableCount++; + break; + } + } + } + V.oneTimeDisableDisability = 0; + } + }; + + return GenerateNewSlave; +})();