diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index b78f34aecd986a313a2b0b7ad571d04d2ef83311..20b0aab88504918ea0b801d8e069723acbcce54c 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -276,24 +276,22 @@ App.UI.salon = function(slave, cheat = false) { function skin() { const el = new DocumentFragment(); let r; + let option; App.UI.DOM.appendNewElement("h3", el, "Skin"); const options = new App.UI.OptionsGroup(); let comment = []; if (cheat) { - options.addOption(`${His} natural skin color is`, "origSkin", slave).showTextBox() - .addValueList([["Pure White", "pure white"], ["Ivory", "ivory"], ["White", "white"], ["Extremely Pale", "extremely pale"], - ["Very Pale", "very pale"], ["Pale", "pale"], ["Extremely Fair", "extremely fair"], ["Very Fair", "very fair"], - ["Fair", "fair"], ["Light", "light"], ["Light Olive", "light olive"], ["Tan", "tan"], ["Olive", "olive"], ["Bronze", "bronze"], - ["Dark Olive", "dark olive"], ["Dark", "dark"], ["Light Beige", "light beige"], ["Beige", "beige"], - ["Dark Beige", "dark beige"], ["Light Brown", "light brown"], ["Brown", "brown"], ["Dark Brown", "dark brown"], - ["Black", "black"], ["Ebony", "ebony"], ["Pure Black", "pure black"]]).pulldown(); + option = options.addOption(`${His} natural skin color is`, "origSkin", slave).showTextBox().pulldown(); + for (const skin of App.Medicine.Modification.naturalSkins) { + option.addValue(capFirstChar(skin), skin, () => slave.skin = slave.origSkin); + } } - let option = options.addOption(`${His} skin is ${slave.skin}.`, "skin", slave); + option = options.addOption(`${His} skin is ${slave.skin}.`, "skin", slave); if (App.Medicine.Modification.dyedSkins.includes(slave.skin)) { option.addValue("Remove coloring", slave.origSkin, billMod); - } else if (((slave.skin === "sun tanned") || (slave.skin === "spray tanned"))) { + } else if ((slave.skin === "sun tanned") || (slave.skin === "spray tanned")) { option.addValue("Remove tanning", slave.origSkin, billMod); } diff --git a/src/gui/options/options.js b/src/gui/options/options.js index 12967cf2e552c9559016fb40caf4366002e479df..5ff496ffbfa9cedf0e9cc91094dd523f7753d98b 100644 --- a/src/gui/options/options.js +++ b/src/gui/options/options.js @@ -91,13 +91,17 @@ App.UI.OptionsGroup = (function() { /** * @param {string} [unit] + * @param {string} [length] * @returns {Option} */ - showTextBox(unit) { + showTextBox(unit, length) { this.textbox = true; if (unit) { this.unit = unit; } + if (length) { + this.textBoxLength = length; + } return this; } @@ -318,6 +322,11 @@ App.UI.OptionsGroup = (function() { if (this.unit) { buttonGroup.append(" ", this.unit); } + textbox.style.minWidth = "15em"; + textbox.style.width = currentValue.length + "ch"; + if (this.textBoxLength) { + textbox.style.width = this.textBoxLength; + } } if (this.comment) { const comment = document.createElement("span"); diff --git a/src/npc/startingGirls/startingGirls.js b/src/npc/startingGirls/startingGirls.js index 8a03b57faeb3de2c96e13845758dcdf4de0288b3..8839927356e6e22df4f2fd5e7c54ffc6e690bf6a 100644 --- a/src/npc/startingGirls/startingGirls.js +++ b/src/npc/startingGirls/startingGirls.js @@ -247,73 +247,6 @@ App.StartingGirls.uncommittedFamilyTree = function(slave) { renderFamilyTree(tSlaves, slave.ID); }; -App.StartingGirls.career = function(slave) { - let el = new DocumentFragment(); - let text; - let pullDown; - - if (V.AgePenalty === 1) { - if (slave.actualAge < 16) { - text = "Very young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.veryYoung)); - } else if (slave.actualAge <= 24) { - text = "Young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.young)); - } else if (slave.intelligenceImplant >= 15) { - text = "Educated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.educated)); - } else { - text = "Uneducated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated)); - } - } else { - if (slave.actualAge < 16) { - text = "Very young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.veryYoung)); - } else if (slave.intelligenceImplant >= 15) { - text = "Educated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.educated)); - } else if (slave.actualAge <= 24) { - text = "Young careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.young)); - } else { - text = "Uneducated careers: "; - pullDown = render(App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated)); - } - } - function render(options) { - let select = document.createElement("select"); - select.classList.add("rajs-list"); - - for (const opt of options) { - let el = document.createElement("option"); - el.textContent = capFirstChar(opt); - el.value = opt; - if (slave.career === opt) { - el.selected = true; - } - select.appendChild(el); - } - select.onchange = () => { - slave.career = select.options[select.selectedIndex].value; - jQuery("#career-textbox").empty().append( - App.UI.DOM.makeTextBox( - slave.career, - v => { - slave.career = v; - }, - false, - ) - ); - }; - - return select; - } - el.append(text); - el.append(pullDown); - return el; -}; - App.StartingGirls.applyPlayerOrigin = function(slave) { switch (V.PC.career) { case "wealth": @@ -683,3 +616,736 @@ App.StartingGirls.applyPlayerOrigin = function(slave) { } } }; + +App.StartingGirls.physical = function(slave) { + const el = new DocumentFragment(); + const {he} = getPronouns(slave); + const options = new App.UI.OptionsGroup(); + let option; + + options.addOption("Condition", "condition", slave.health) + .addValueList([["Unhealthy", -40], ["Healthy", 0], ["Very healthy", 40], ["Extremely healthy", 80]]); + + options.addOption(`Height: ${heightToEitherUnit(slave.height)}`, "height", slave).showTextBox("cm") + .addRange(145, 150, "<", "Petite") + .addRange(155, 160, "<", "Short") + .addRange(165, 170, "<", "Average") + .addRange(180, 185, "<", "Tall") + .addRange(190, 185, ">=", "Very tall"); + option = options.addOption(`Average height for a ${slave.actualAge} year old """is ${heightToEitherUnit(Math.round(Height.mean(slave)))}"""`) + .customButton( + "Make average", + () => resyncSlaveHight(slave), + "" + ); + if (V.cheatMode === 1) { + option.customButton( + "Make dwarf", + () => slave.height = Height.random(slave, {limitMult: [-4, -1], spread: 0.15}), + "" + ) + .customButton( + "Make giant", + () => slave.height = Height.random(slave, {limitMult: [3, 10], spread: 0.15}), + "" + ); + } + + options.addOption("Weight", "weight", slave) + .addRange(-100, -95, "<", "Emaciated") + .addRange(-50, -30, "<", "Skinny") + .addRange(-20, -10, "<", "Thin") + .addRange(0, 10, "<", "Average") + .addRange(20, 30, "<", "Plush") + .addRange(50, 95, "<", "Chubby") + .addRange(100, 130, "<", "Fat") + .addRange(140, 160, "<", "Obese") + .addRange(180, 190, "<", "Super obese") + .addRange(200, 190, ">=", "Dangerously obese"); + + options.addOption("Muscles", "muscles", slave) + .addRange(-100, -96, "<", "Frail") + .addRange(-66, -51, "<", "Very weak") + .addRange(-41, -6, "<", "Weak") + .addRange(0, 5, "<", "Normal") + .addRange(20, 30, "<", "Toned") + .addRange(40, 50, "<", "Well built") + .addRange(65, 95, "<", "Quite muscular") + .addRange(100, 95, ">=", "Ripped"); + + options.addOption("Waist", "waist", slave) + .addRange(-100, -95, "<", " Absurd") + .addRange(-55, -40, "<", "Hourglass") + .addRange(-25, -15, "<", "Feminine") + .addRange(0, 10, "<", "Average") + .addRange(15, 40, "<", "Unattractive") + .addRange(55, 95, "<", "Ugly") + .addRange(100, 10, ">=", "Masculine"); + + option = options.addOption("Facial appearance", "faceShape", slave) + .addValue("Normal", "normal"); + if (V.seeDicks !== 0) { + option.addValue("Masculine", "masculine"); + } + option.addValueList([["Androgynous", "androgynous"], ["Cute", "cute"], ["Sensual", "sensual"], ["Exotic", "exotic"]]); + + options.addOption("Facial attractiveness", "face", slave) + .addRange(-100, -95, "<", "Very ugly") + .addRange(-55, -40, "<", "Ugly") + .addRange(-15, -10, "<", "Unattractive") + .addRange(0, 10, "<", "Average") + .addRange(15, 40, "<", "Attractive") + .addRange(55, 95, "<", "Beautiful") + .addRange(100, 95, ">=", "Very beautiful"); + + option = options.addOption("Lips", "lips", slave) + .addRange(5, 10, "<", "Thin") + .addRange(15, 20, "<", "Normal") + .addRange(25, 40, "<", "Pretty") + .addRange(55, 70, "<", "Plush"); + if (V.seeExtreme === 1) { + option.addRange(85, 95, "<", "Huge") + .addRange(100, 95, ">=", "Facepussy"); + } else { + option.addRange(85, 70, ">=", "Huge"); + } + + options.addOption("Voice", "voice", slave) + .addValueList([["Mute", 0], ["Deep", 1], ["Normal", 2], ["High", 3]]); + + if (slave.voice !== 0) { + options.addOption(V.language, "accent", slave) + .addValueList([ + ["Unaccented", 0], + [`Pretty ${aNational(slave.nationality)} accent`, 1], + [`Thick ${aNational(slave.nationality)} accent`, 2], + ["Not fluent", 3] + ]); + } + + option = options.addOption("Teeth", "teeth", slave) + .addValueList([ + ["Crooked", "crooked"], + ["Gapped", "gapped"], + ["Braces", "straightening braces"] + ]); + if (slave.physicalAge >= 12) { + if (slave.teeth === "baby" || slave.teeth === "mixed") { + slave.teeth = "normal"; + } + option.addValue("Straight", "normal"); + } else if (slave.physicalAge >= 6) { + if (slave.teeth === "baby" || slave.teeth === "normal" || slave.teeth === "") { + slave.teeth = "mixed"; + } + option.addValue("Mixed adult & child", "mixed"); + } else { + if (slave.teeth === "mixed" || slave.teeth === "normal" || slave.teeth === "") { + slave.teeth = "mixed"; + } + option.addValue("Baby", "baby"); + } + + options.addOption("Breasts", "boobs", slave).showTextBox("CCs") + .addRange(200, 200, "<=", "Flat (AA-cup)") + .addRange(300, 300, "<=", "Small (A-cup)") + .addRange(400, 400, "<=", "Medium (B-cup)") + .addRange(500, 500, "<=", "Healthy (C-cup)") + .addRange(800, 800, "<=", "Large (DD-cup)") + .addRange(1200, 1200, "<=", "Very Large (G-cup)") + .addRange(2050, 2050, "<=", "Huge (K-cup)") + .addRange(3950, 3950, "<=", "Massive (Q-cup)") + .addRange(6000, 6000, "<=", "Monstrous") + .addRange(8000, 6000, ">", "Science Experiment"); + + options.addOption("Natural shape", "boobShape", slave) + .addValueList([ + ["Normal", "normal"], + ["Perky", "perky"], + ["Torpedo-shaped", "torpedo-shaped"], + ["Wide-set", "wide-set"], + ["Downward-facing", "downward-facing"], + ["Saggy", "saggy"] + ]); + + options.addOption("Lactation", "lactation", slave) + .addValue("Artificial", 2, () => slave.lactationDuration = 2) + .addValue("Natural", 1, () => slave.lactationDuration = 2) + .addValue("None", 0); + + options.addOption("Nipples", "nipples", slave) + .addValueList([["Tiny", "tiny"], ["Cute", "cute"], ["Puffy", "puffy"], ["Partially Inverted", "partially inverted"], ["Inverted", "inverted"], ["Huge", "huge"]]); + + options.addOption("Areolae", "areolae", slave) + .addValueList([["Normal", 0], ["Large", 1], ["Wide", 2], ["Huge", 3], ["Massive", 4]]); + + options.addOption("Shoulders", "shoulders", slave) + .addValueList([["Very narrow", -2], ["Narrow", -1], ["Feminine", 0], ["Broad", 1], ["Very broad", 2]]); + + options.addOption("Hips", "hips", slave) + .addValueList([["Very narrow", -2], ["Narrow", -1], ["Normal", 0], ["Broad", 1], ["Very broad", 2]]); + + options.addOption("Butt", "butt", slave) + .addValueList([["Flat", 0], ["Small", 1], ["Plump", 2], ["Big", 3], ["Huge", 4], ["Enormous", 5], ["Gigantic", 6], ["Massive", 7]]); + + options.addOption("Anus", "anus", slave) + .addValueList([["Virgin", 0], ["Normal", 1], ["Veteran", 2], ["Gaping", 3]]); + + if (slave.anus > 0) { + let comment; + if (slave.analArea <= slave.anus) { + comment = "Recently stretched to current size."; + } else if (slave.analArea - slave.anus === 1) { + comment = "Used to current size."; + } else { + comment = "Very broad."; + } + options.addOption("External anus appearance", "anus", slave) + .addValueList([ + ["Recently stretched", slave.analArea = slave.anus], + ["Used to current size", slave.analArea = slave.anus+1], + ["Very broad", slave.analArea = slave.anus+2], + ]).addComment(comment); + } + + options.addOption("Vagina", "vagina", slave) + .addValue("No vagina", -1, () => { + slave.preg = 0; + WombFlush(slave); + slave.belly = 0; + slave.bellyPreg = 0; + slave.pubertyXX = 0; + slave.pubertyAgeXX = V.fertilityAge; + slave.ovaries= 0; + }) + .addValue("Virgin", 0, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }) + .addValue("Normal", 1, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }) + .addValue("Veteran", 2, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }) + .addValue("Gaping", 3, () => { + slave.preg = -1; + slave.belly = 0; + slave.bellyPreg = 0; + slave.ovaries = 1; + }); + + if (slave.vagina > -1) { + if (slave.dick === 0) { + options.addOption("Clit", "clit", slave) + .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]]); + } + + options.addOption("Labia", "labia", slave) + .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2], ["Huge Dangling", 3]]); + + options.addOption("Vaginal wetness", "vaginaLube", slave) + .addValueList([["Dry", 0], ["Normal", 1], ["Excessive", 2]]); + + if (V.seePreg !== 0) { + /* This is only shown if slave has vagina */ + options.addOption("Puberty", "pubertyXX", slave) + .addValue("Prepubescent", 0, () => { + slave.pubertyAgeXX = V.fertilityAge; + slave.belly = 0; + slave.bellyPreg = 0; + WombFlush(slave); + }).addValue("Postpubescent", 1); + + options.addOption("Age of puberty", "pubertyAgeXX", slave).showTextBox(); + + if (slave.pubertyXX === 1) { + option = options.addOption("Pregnancy", "preg", slave); + if (V.seeHyperPreg === 1 && V.cheatMode === 1) { + option.addValue("Bursting at the seams", 43, () => { + slave.pregType = 150; + slave.pregWeek = 43; + slave.pregKnown = 1; + slave.belly = 2700000; + slave.bellyPreg = 2700000; + slave.pubertyXX = 1; + }); + if (slave.preg === 43) { + option.addComment("Extreme hyper pregnancy!"); + } + } + option.addValue("Completely Filled", 42, () => { + slave.pregType = 8; + slave.pregWeek = 42; + slave.pregKnown = 1; + slave.belly = 120000; + slave.bellyPreg = 120000; + slave.pubertyXX = 1; + }).addValue("Ready to drop", 40, () => { + slave.pregType = 1; + slave.pregWeek = 40; + slave.pregKnown = 1; + slave.belly = 15000; + slave.bellyPreg = 15000; + slave.pubertyXX = 1; + }).addValue("Advanced", 34, () => { + slave.pregType = 1; + slave.pregWeek = 34; + slave.pregKnown = 1; + slave.belly = 10000; + slave.bellyPreg = 10000; + slave.pubertyXX = 1; + }).addValue("Showing", 27, () => { + slave.pregType = 1; + slave.pregWeek = 27; + slave.pregKnown = 1; + slave.belly = 5000; + slave.bellyPreg = 5000; + slave.pubertyXX = 1; + }).addValue("Early", 12, () => { + slave.pregType = 1; + slave.pregWeek = 12; + slave.pregKnown = 1; + slave.belly = 100; + slave.bellyPreg = 100; + slave.pubertyXX = 1; + }).addValue("None", 0, () => { + slave.pregType = 0; + slave.belly = 0; + slave.bellyPreg = 0; + slave.pregSource = 0; + slave.pregWeek = 0; + slave.pregKnown = 0; + }).addValue("Contraceptives", -1, () => { + slave.pregType = 0; + slave.belly = 0; + slave.bellyPreg = 0; + slave.pregSource = 0; + slave.pregWeek = 0; + slave.pregKnown = 0; + }).addValue("Barren", -2, () => { + slave.pregType = 0; + slave.belly = 0; + slave.bellyPreg = 0; + slave.pregSource = 0; + slave.pregWeek = 0; + slave.pregKnown = 0; + }); + options.addOption("Births", "birthsTotal", slave.counter).showTextBox().addComment(`How many times ${he} has already given birth, not necessarily while owned by you.`); + } + + if (V.PC.dick > 0 && slave.preg > 0) { + options.addOption("Father of child", "pregSource", slave) + .addValueList([["My child", -1], ["Not me", 0]]); + } + } + } + + if (V.seeDicks !== 0 || V.makeDicks === 1) { + options.addOption("Penis", "dick", slave) + .addValue("None", 0, () => { + slave.balls = 0; + slave.pubertyXY = 0; + slave.pubertyAgeXY = V.potencyAge; + }) + .addValue("Tiny", 1, () => slave.clit = 0) + .addValue("Small", 2, () => slave.clit = 0) + .addValue("Normal", 3, () => slave.clit = 0) + .addValue("Large", 4, () => slave.clit = 0) + .addValue("Massive", 5, () => slave.clit = 0); + + if (slave.dick > 0) { + option = options.addOption("Foreskin", "foreskin", slave); + if (V.seeCircumcision === 1) { + option.addValue("Circumcised", 0); + } else if (slave.foreskin === 0) { + slave.foreskin = 3; + } + option.addValueList([["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]]); + } + + options.addOption("Testicles", "balls", slave) + .addValue("None", 0, () => { + slave.pubertyXY = 0; + slave.pubertyAgeXY = V.potencyAge; + slave.scrotum = 0; + }).addValueList([["Vestigial", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]]); + + options.addOption("Age of Male Puberty", "pubertyAgeXY", slave).showTextBox(); + + if (slave.balls > 0) { + options.addOption("Ballsack", "scrotum", slave) + .addValueList([["None", 0], ["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]]); + + options.addOption("Male Puberty", "pubertyXY", slave) + .addValue("Prepubescent", 0, () => slave.pubertyAgeXY = V.potencyAge) + .addValue("Postpubescent", 1); + } + } + + options.addOption("Prostate", "prostate", slave) + .addValueList([ + ["No prostate", 0], + ["Has a prostate", 1] + ]); + + const optionLeft = options.addOption("Left eye", "vision", slave.eye.left); + const optionRight = options.addOption("Right eye", "vision", slave.eye.right); + optionLeft.addValueList([["Normal", 2], ["Nearsighted", 1]]); + optionRight.addValueList([["Normal", 2], ["Nearsighted", 1]]); + if (V.seeExtreme === 1) { + optionLeft.addValue("Blind", 0); + optionRight.addValue("Blind", 0); + } else { + if (slave.eye.left.vision === 0) { + slave.eye.left.vision = 2; + } + if (slave.eye.right.vision === 0) { + slave.eye.right.vision = 2; + } + } + option = options.addOption("Natural eye color", "origColor", slave.eye); + for (const color of App.Medicine.Modification.eyeColor.map(color => color.value)) { + option.addValue(capFirstChar(color), color); + } + option.pulldown(); + + option = options.addOption("Hearing", "hears", slave); + option.addValueList([["Normal", 0], ["Hard of hearing", -1]]); + if (V.seeExtreme === 1) { + option.addValue("Deaf", -2); + } else if (slave.hears === 0) { + slave.hears = 2; + } + + if (V.seeExtreme === 1) { + options.addOption("Smell ability", "smells", slave) + .addValueList([["Normal", 0], ["None", -1]]); + + options.addOption("Taste ability", "tastes", slave) + .addValueList([["Normal", 0], ["None", -1]]); + + State.temporary.LA = hasLeftArm(slave); + options.addOption("Left arm", "LA", State.temporary) + .addValue("Healthy", true, () => slave.arm.left = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.arm.left = null); + + State.temporary.RA = hasRightArm(slave); + options.addOption("Right arm", "RA", State.temporary) + .addValue("Healthy", true, () => slave.arm.right = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.arm.right = null); + + State.temporary.LL = hasLeftLeg(slave); + options.addOption("Left leg", "LL", State.temporary) + .addValue("Healthy", true, () => slave.leg.left = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.leg.left = null); + + State.temporary.RL = hasRightLeg(slave); + options.addOption("Right leg", "RL", State.temporary) + .addValue("Healthy", true, () => slave.leg.right = new App.Entity.LimbState()) + .addValue("Amputated", false, () => slave.leg.right = null); + } + + el.append(options.render()); + return el; +}; + +App.StartingGirls.profile = function(slave) { + const el = new DocumentFragment(); + let options = new App.UI.OptionsGroup(); + let r; + let option; + const {His} = getPronouns(slave); + + options.addOption("Birth name", "birthName", slave).showTextBox(); + options.addOption("Slave name", "slaveName", slave).showTextBox(); + options.addOption("Birth surname", "birthSurname", slave).showTextBox(); + options.addOption("Slave surname", "slaveSurname", slave).showTextBox(); + + option = options.addOption("Career", "career", slave).showTextBox(); + let careers; + let text; + if (V.AgePenalty === 1) { + if (slave.actualAge < 16) { + text = "Very young careers"; + careers = App.Data.Careers.General.veryYoung; + } else if (slave.actualAge <= 24) { + text = "Young careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.young); + } else if (slave.intelligenceImplant >= 15) { + text = "Educated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.educated); + } else { + text = "Uneducated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated); + } + } else { + if (slave.actualAge < 16) { + text = "Very young careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.veryYoung); + } else if (slave.intelligenceImplant >= 15) { + text = "Educated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.educated); + } else if (slave.actualAge <= 24) { + text = "Young careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.young); + } else { + text = "Uneducated careers"; + careers = App.Utils.alphabetizeIterable(App.Data.Careers.General.uneducated); + } + } + for (const career of careers) { + option.addValue(capFirstChar(career), career); + } + option.addComment(text).pulldown(); + + options.addOption("Legal status", "indenture", slave) + .addValue("Slave", -1, () => slave.indentureRestrictions = 0) + .addRange(52, 0, ">=", "Indentured Servant"); + if (slave.indenture > -1) { + options.addOption("Remaining weeks", "indenture", slave).showTextBox(); + + options.addOption("Indenture restrictions", "indentureRestrictions", slave) + .addValueList([["None", 0], ["Protective", 1], ["Restrictive", 2]]); + } + + options.addOption("Age", "actualAge", slave).showTextBox() + .customButton("Resync characteristics to age", () => resyncSlaveToAge(slave), "") + .customButton("Resync only height to age", () => slave.height = Height.random(slave), "") + .addComment("It is recommended to resync if you change age significantly"); + + options.addOption("Birth week", "birthWeek", slave).showTextBox(); + + options.addOption("Genes", "genes", slave) + .addValue("XX (Female)", "XX", () => { + slave.dick = 0; + slave.balls = 0; + slave.clit = 0; + slave.pubertyXY = 0; + slave.pubertyAgeXY = V.potencyAge; + slave.pubertyXX = (slave.pubertyAgeXX < slave.actualAge ? 1 : 0); + slave.vagina = Math.max(0, slave.vagina); + slave.boobs = Math.max(500, slave.boobs); + slave.balls = 0; + slave.scrotum = 0; + slave.prostate = 0; + slave.shoulders = either(-2, -1, 0); + slave.hips = either(-2, -1, 0); + }).addValue("XY (Male)", "XY", () => { + slave.dick = 3; + slave.vagina = -1; + WombFlush(slave); + slave.belly = 0; + slave.bellyPreg = 0; + slave.pubertyXY = (slave.pubertyAgeXY < slave.actualAge ? 1 : 0); + slave.pubertyXX = 0; + slave.pubertyAgeXX = V.fertilityAge; + slave.ovaries = 0; + slave.boobs = 0; + slave.balls = 3; + slave.scrotum = 3; + slave.prostate = 1; + slave.shoulders = either(0, 1, 2); + slave.hips = either(0, 1, 2); + }); + + option = options.addOption("Prestige", "prestige", slave) + .addValueList([["None", 0], ["Locally known", 1], ["Regionally famous", 2], ["World renowned", 3]]); + if (slave.prestige > 0) { + r = []; + r.push("Starting slaves incur an extreme cost penalty for prestige. This slave's"); + if (slave.actualAge >= 25) { + if (slave.actualAge > 35) { + r.push(" advanced"); + } + r.push(" age decreases the penalty."); + } else { + r.push(" young age requires paying the full penalty."); + } + option.addComment(`<span class=warning>${r.join(" ")}</span>`); + } + + options.addOption(`${His} nationality is`, "nationality", slave).showTextBox() + .addValueList(Object.keys(App.Data.SlaveSummary.short.nationality)) + .pulldown(); + + + if (V.seeRace === 1) { + options.addOption(`${His} ethnicity is`, "race", slave).showTextBox().pulldown() + .addValueList([["White", "white"], ["Asian", "asian"], ["Latina", "latina"], ["Middle Eastern", "middle eastern"], + ["Black", "black"], ["Semitic", "semitic"], ["Southern European", "southern european"], ["Indo-Aryan", "indo-aryan"], + ["Amerindian", "amerindian"], ["Pacific Islander", "pacific islander"], ["Malay", "malay"], ["Mixed Race", "mixed race"]]); + } + + el.append(options.render()); + App.UI.DOM.appendNewElement("h3", el, "Optional customizations"); + options = new App.UI.OptionsGroup(); + + options.addOption("Origin story", "origin", slave).showTextBox("", "100em").addComment("Use complete, capitalized and punctuated sentences."); + + options.addOption("Origin override", "originOverride", V) + .addValue("Enable", 1).on() + .addValue("Disable", 0).off() + .addComment("Prevent Starting Girls from overwriting custom origin and tattoo with its defaults."); + + if (slave.prestige) { + options.addOption("Prestige description", "prestigeDesc", V).showTextBox().addComment("Use complete, capitalized and punctuated sentences."); + } + options.addOption("Description", "desc", slave.custom).showTextBox().addComment("Use complete, capitalized and punctuated sentences."); + options.addOption("Label", "label", slave.custom).showTextBox().addComment("Use a short phrase"); + + + el.append(options.render()); + return el; +}; + +App.StartingGirls.mental = function(slave) { + const el = new DocumentFragment(); + const options = new App.UI.OptionsGroup(); + let option; + let r; + + options.addOption("Intelligence", "intelligence", slave) + .addValueList([["Moronic", -100], ["Very stupid", -60], ["Stupid", -30], ["Average", 0], ["Smart", 30], ["Very smart", 60], ["Brilliant", 100]]); + + options.addOption("Education", "intelligenceImplant", slave) + .addValueList([["Uneducated", 0], ["Educated", 15], ["Well educated", 30]]); + + option = options.addOption("Devotion", "devotion", slave).showTextBox() + .addRange(-100, -95, "<", "Utterly hateful") + .addRange(-70, -50, "<", "Hateful") + .addRange(-35, -20, "<", "Resistant") + .addRange(0, 20, "<", "Ambivalent") + .addRange(35, 50, "<", "Accepting") + .addRange(70, 95, "<", "Devoted") + .addRange(100, 95, ">=", "Worshipful"); + if (slave.devotion > 20) { + r = []; + r.push("Starting slaves incur"); + if (slave.devotion > 50) { + r.push("severe cost penalty at very high"); + } else { + r.push("an additional cost penalty at high"); + } + r.push("levels of devotion. This slave's"); + if (slave.actualAge >= 25) { + if (slave.actualAge > 35) { + r.push("advanced"); + } + r.push("age decreases the penalty."); + } else { + r.push("young age requires paying the full penalty."); + } + option.addComment(`<span class=warning>${r.join(" ")}</span>`); + } + + options.addOption("Trust", "trust", slave).showTextBox() + .addRange(-100, -95, "<", "Abjectly terrified") + .addRange(-70, -50, "<", "Terrified") + .addRange(-35, -20, "<", "Frightened") + .addRange(0, 20, "<", "Fearful") + .addRange(35, 50, "<", "Careful") + .addRange(70, 95, "<", "Trusting") + .addRange(100, 95, ">=", "Absolute trust"); + + + + if (slave.fetishKnown === 0) { + options.addOption("Fetish", "fetishKnown", slave) + .addValueList([["Unknown", 0], ["Known", 1]]); + } else { + option = options.addOption("Fetish", "fetish", slave) + .addValue("Unknown", "", () => { + slave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", + "submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none"); + slave.fetishKnown = 0; + }).addValueList([["None", "none"], ["Sub", "submissive"], ["Dom", "dom"], ["Cumslut", "cumslut"], ["Humiliation", "humiliation"], + ["Buttslut", "buttslut"], ["Breasts", "boobs"], ["Pregnancy", "pregnancy"], ["Sadism", "sadist"], ["Masochism", "masochist"]]); + if (V.seeExtreme === 1) { + option.addValue("Mindbroken", "mindbroken", () => { + slave.fetishStrength = 10; + slave.sexualFlaw = "none"; + slave.sexualQuirk = "none"; + slave.behavioralFlaw = "none"; + slave.behavioralQuirk = "none"; + }); + } + + if (slave.fetish !== "none" && slave.fetish !== "mindbroken") { + options.addOption("Fetish strength", "fetishStrength", slave) + .addRange(15, 30, "<=", "Very Low") + .addRange(45, 60, "<=", "Low") + .addRange(75, 85, "<=", "Normal") + .addRange(90, 95, "<=", "High") + .addRange(100, 95, ">", "Extremely High"); + } + } + + options.addOption("Sexuality", "attrKnown", slave) + .addValue("Known", 1, () => { + slave.attrXX = random(0, 100); + slave.attrXY = random(0, 100); + slave.energy = random(1, 90); + }).on() + .addValue("Unknown", 0).off(); + if (slave.attrKnown === 1) { + options.addOption("Attraction to men", "attrXY", slave) + .addRange(0, 5, "<=", "Disgusted").off() + .addRange(10, 15, "<=", "Turned off").off() + .addRange(25, 35, "<=", "Not attracted").off() + .addRange(50, 65, "<=", "Indifferent").neutral() + .addRange(75, 85, "<=", "Attracted").on() + .addRange(90, 95, "<=", "Aroused").on() + .addRange(100, 95, ">", "Passionate").on(); + options.addOption("Attraction to women", "attrXX", slave) + .addRange(0, 5, "<=", "Disgusted").off() + .addRange(10, 15, "<=", "Turned off").off() + .addRange(25, 35, "<=", "Not attracted").off() + .addRange(50, 65, "<=", "Indifferent").neutral() + .addRange(75, 85, "<=", "Attracted").on() + .addRange(90, 95, "<=", "Aroused").on() + .addRange(100, 95, ">", "Passionate").on(); + + options.addOption("Sex drive", "energy", slave) + .addRange(5, 10, "<=", "Frigid").off() + .addRange(25, 40, "<=", "Poor").off() + .addRange(45, 60, "<=", "Average").neutral() + .addRange(65, 80, "<=", "Powerful").on() + .addRange(85, 99, "<=", "Sex addict").on() + .addRange(100, 99, ">", "Nympho").on(); + } + + if (slave.fetish !== "mindbroken") { + options.addOption("Behavioral Flaw", "behavioralFlaw", slave) + .addValueList([["None", "none"], ["Arrogant", "arrogant"], ["Bitchy", "bitchy"], ["Odd", "odd"], ["Hates Men", "hates men"], + ["Hates Women", "hates women"], ["Anorexic", "anorexic"], ["Gluttonous", "gluttonous"], ["Devout", "devout"], + ["Liberated", "liberated"]]); + + options.addOption("Behavioral Quirk", "behavioralQuirk", slave) + .addValueList([["None", "none"], ["Confident", "confident"], ["Cutting", "cutting"], ["Funny", "funny"], + ["Adores Men", "adores men"], ["Adores Women", "adores women"], ["Insecure", "insecure"], ["Fitness", "fitness"], + ["Sinful", "sinful"], ["Advocate", "advocate"]]); + + options.addOption("Sexual Flaw", "sexualFlaw", slave) + .addValueList([["None", "none"], ["Hates Oral", "hates oral"], ["Hates Anal", "hates anal"], + ["Hates Penetration", "hates penetration"], ["Repressed", "repressed"], ["Shamefast", "shamefast"], ["Apathetic", "apathetic"], + ["Crude", "crude"], ["Judgemental", "judgemental"], ["Sexually idealistic", "idealistic"]]); + + options.addOption("Sexual Quirk", "sexualQuirk", slave) + .addValueList([["None", "none"], ["Oral", "gagfuck queen"], ["Anal", "painal queen"], ["Penetration", "strugglefuck queen"], + ["Perverted", "perverted"], ["Tease", "tease"], ["Caring", "caring"], ["Unflinching", "unflinching"], ["Size queen", "size queen"], + ["Romantic", "romantic"]]); + } + + el.append(options.render()); + + return el; +}; diff --git a/src/npc/startingGirls/startingGirls.tw b/src/npc/startingGirls/startingGirls.tw index eb8a930e046c3575c14da7388c7e367ae4a7892d..6dc4e30a17bbc6c267dfbcebb163fd38ab8faefa 100644 --- a/src/npc/startingGirls/startingGirls.tw +++ b/src/npc/startingGirls/startingGirls.tw @@ -200,14 +200,13 @@ <h2>You are customizing this slave:</h2> <<includeDOM App.Desc.longSlave(V.activeSlave, {market: "generic"})>> <div class="tab-bar"> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Overview')" id="tab Overview">Overview</button> + <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'profile')" id="tab profile">Profile</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Physical')" id="tab Physical">Physical</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Mental')" id="tab Mental">Mental</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Skills')" id="tab Skills">Skills</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Family', App.StartingGirls.uncommittedFamilyTree(V.activeSlave))" id="tab Family">Family</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'body-mods')" id="tab body-mods">Body Mods</button> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'salon')" id="tab salon">Salon</button> - <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'Customization')" id="tab Customization">Customization</button> <<if $cash >= _slaveCost>> <button class="tab-links" onclick="App.UI.tabBar.openTab(event, 'assignRemove')" id="tab assignRemove">Finalize</button> <<else>> @@ -217,627 +216,21 @@ <<run App.Utils.setLocalPronouns($activeSlave)>> -<div id="Overview" class="tab-content"> +<div id="profile" class="tab-content"> <div class="content"> - - <<set _options = new App.UI.OptionsGroup()>> - - <<set _option = _options.addOption("Devotion", "devotion", $activeSlave).showTextBox() - .addRange(-100, -95, "<", "Utterly hateful") - .addRange(-70, -50, "<", "Hateful") - .addRange(-35, -20, "<", "Resistant") - .addRange(0, 20, "<", "Ambivalent") - .addRange(35, 50, "<", "Accepting") - .addRange(70, 95, "<", "Devoted") - .addRange(100, 95, ">=", "Worshipful")>> - <<if $activeSlave.devotion > 20>> - <<set _comment = "Starting slaves incur">> - <<if $activeSlave.devotion > 50>> - <<run _comment += " severe cost penalty at very high">> - <<else>> - <<run _comment += " an additional cost penalty at high">> - <</if>> - <<run _comment += " levels of devotion. This slave's">> - <<if $activeSlave.actualAge >= 25>> - <<if $activeSlave.actualAge > 35>>advanced <</if>> - <<run _comment += " age decreases the penalty.">> - <<else>> - <<run _comment += " young age requires paying the full penalty.">> - <</if>> - <<run _option.addComment(`<span class=warning>${_comment}</span>`)>> - <</if>> - - <<run _options.addOption("Trust", "trust", $activeSlave).showTextBox() - .addRange(-100, -95, "<", "Abjectly terrified") - .addRange(-70, -50, "<", "Terrified") - .addRange(-35, -20, "<", "Frightened") - .addRange(0, 20, "<", "Fearful") - .addRange(35, 50, "<", "Careful") - .addRange(70, 95, "<", "Trusting") - .addRange(100, 95, ">=", "Absolute trust")>> - - <<run _options.addOption("Legal status", "indenture", $activeSlave) - .addValue("Slave", -1, () => V.activeSlave.indentureRestrictions = 0) - .addRange(52, 0, ">=", "Indentured Servant")>> - <<if $activeSlave.indenture > -1>> - <<run _options.addOption("Remaining weeks", "indenture", $activeSlave).showTextBox()>> - - <<run _options.addOption("Indenture restrictions", "indentureRestrictions", $activeSlave) - .addValueList([["None", 0], ["Protective", 1], ["Restrictive", 2]])>> - <</if>> - - <<run _options.addOption("Age", "actualAge", $activeSlave).showTextBox() - .customButton("Resync characteristics to age", () => resyncSlaveToAge(V.activeSlave)) - .customButton("Resync only height to age", () => V.activeSlave.height = Height.random(V.activeSlave)) - .addComment("It is recommended to resync if you change age significantly")>> - - <<run _options.addOption("Birth week", "birthWeek", $activeSlave).showTextBox()>> - - <<run _options.addOption("Genes", "genes", $activeSlave) - .addValue("XX (Female)", "XX", () => { - V.activeSlave.dick = 0; - V.activeSlave.balls = 0; - V.activeSlave.clit = 0; - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = V.potencyAge; - V.activeSlave.pubertyXX = (V.activeSlave.pubertyAgeXX < V.activeSlave.actualAge ? 1 : 0); - V.activeSlave.vagina = Math.max(0, V.activeSlave.vagina); - V.activeSlave.boobs = Math.max(500, V.activeSlave.boobs); - V.activeSlave.balls = 0; - V.activeSlave.scrotum = 0; - V.activeSlave.prostate = 0; - V.activeSlave.shoulders = either(-2,-1,0); - V.activeSlave.hips = either(-2,-1,0); - }).addValue("XY (Male)", "XY", () => { - V.activeSlave.dick = 3; - V.activeSlave.vagina = -1; - WombFlush(V.activeSlave); - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pubertyXY = (V.activeSlave.pubertyAgeXY < V.activeSlave.actualAge ? 1 : 0); - V.activeSlave.pubertyXX = 0; - V.activeSlave.pubertyAgeXX = V.fertilityAge; - V.activeSlave.ovaries = 0; - V.activeSlave.boobs = 0; - V.activeSlave.balls = 3; - V.activeSlave.scrotum = 3; - V.activeSlave.prostate = 1; - V.activeSlave.shoulders = either(0,1,2); - V.activeSlave.hips = either(0,1,2); - })>> - - <<run _options.addOption("Condition", "condition", $activeSlave.health) - .addValueList([["Unhealthy", -40], ["Healthy", 0], ["Very healthy", 40], ["Extremely healthy", 80]])>> - - <<set _option = _options.addOption("Prestige", "prestige", $activeSlave) - .addValueList([["None", 0], ["Locally known", 1], ["Regionally famous", 2], ["World renowned", 3]])>> - <<if $activeSlave.prestige > 0>> - <<set _comment = "Starting slaves incur an extreme cost penalty for prestige. This slave's">> - <<if $activeSlave.actualAge >= 25>> - <<if $activeSlave.actualAge > 35>> - <<set _comment += " advanced">> - <</if>> - <<set _comment += " age decreases the penalty.">> - <<else>> - <<set _comment += " young age requires paying the full penalty.">> - <</if>> - <<run _option.addComment(`<span class=warning>${_comment}</span>`)>> - <</if>> - - <<run _options.addOption("$His nationality is", "nationality", $activeSlave).showTextBox() - .addValueList(Object.keys(App.Data.SlaveSummary.short.nationality)) - .pulldown() - >> - - <<if $seeRace == 1>> - <<run _options.addOption("$His ethnicity is", "race", $activeSlave).showTextBox() - .addValueList([["White", "white"], ["Asian", "asian"], ["Latina", "latina"], ["Middle Eastern", "middle eastern"], - ["Black", "black"], ["Semitic", "semitic"], ["Southern European", "southern european"], ["Indo-Aryan", "indo-aryan"], - ["Amerindian", "amerindian"], ["Pacific Islander", "pacific islander"], ["Malay", "malay"], ["Mixed Race", "mixed race"]])>> - <</if>> - - <<run _options.addOption("Intelligence", "intelligence", $activeSlave) - .addValueList([["Moronic", -100], ["Very stupid", -60], ["Stupid", -30], ["Average", 0], ["Smart", 30], ["Very smart", 60], ["Brilliant", 100]])>> - - <<run _options.addOption("Education", "intelligenceImplant", $activeSlave) - .addValueList([["Uneducated", 0], ["Educated", 15], ["Well educated", 30]])>> - - <<includeDOM _options.render()>> + <<includeDOM App.StartingGirls.profile($activeSlave)>> </div> </div> <div id="Physical" class="tab-content"> <div class="content"> - - <<set _options = new App.UI.OptionsGroup()>> - - <<run _options.addOption(`Height: ${heightToEitherUnit($activeSlave.height)}`, "height", $activeSlave).showTextBox("cm") - .addRange(145, 150, "<", "Petite") - .addRange(155, 160, "<", "Short") - .addRange(165, 170, "<", "Average") - .addRange(180, 185, "<", "Tall") - .addRange(190, 185, ">=", "Very tall")>> - <<set _option = _options.addOption(`Average height for a ${$activeSlave.actualAge} year old """is ${heightToEitherUnit(Math.round(Height.mean(V.activeSlave)))}"""`) - .customButton("Make average", () => resyncSlaveHight($activeSlave))>> - <<if $cheatMode === 1>> - <<run _option.customButton("Make dwarf", () => V.activeSlave.height = Height.random(V.activeSlave, {limitMult: [-4, -1], spread: 0.15})) - .customButton("Make giant", () => V.activeSlave.height = Height.random(V.activeSlave, {limitMult: [3, 10], spread: 0.15}))>> - <</if>> - - <<run _options.addOption("Weight", "weight", $activeSlave) - .addRange(-100, -95, "<", "Emaciated") - .addRange(-50, -30, "<", "Skinny") - .addRange(-20, -10, "<", "Thin") - .addRange(0, 10, "<", "Average") - .addRange(20, 30, "<", "Plush") - .addRange(50, 95, "<", "Chubby") - .addRange(100, 130, "<", "Fat") - .addRange(140, 160, "<", "Obese") - .addRange(180, 190, "<", "Super obese") - .addRange(200, 190, ">=", "Dangerously obese")>> - - <<run _options.addOption("Muscles", "muscles", $activeSlave) - .addRange(-100, -96, "<", "Frail") - .addRange(-66, -51, "<", "Very weak") - .addRange(-41, -6, "<", "Weak") - .addRange(0, 5, "<", "Normal") - .addRange(20, 30, "<", "Toned") - .addRange(40, 50, "<", "Well built") - .addRange(65, 95, "<", "Quite muscular") - .addRange(100, 95, ">=", "Ripped")>> - - <<run _options.addOption("Waist", "waist", $activeSlave) - .addRange(-100, -95, "<", " Absurd") - .addRange(-55, -40, "<", "Hourglass") - .addRange(-25, -15, "<", "Feminine") - .addRange(0, 10, "<", "Average") - .addRange(15, 40, "<", "Unattractive") - .addRange(55, 95, "<", "Ugly") - .addRange(100, 10, ">=", "Masculine")>> - - <<set _option = _options.addOption("Facial appearance", "faceShape", $activeSlave) - .addValue("Normal", "normal")>> - <<if $seeDicks !== 0>> - <<run _option.addValue("Masculine", "masculine")>> - <</if>> - <<run _option.addValueList([["Androgynous", "androgynous"], ["Cute", "cute"], ["Sensual", "sensual"], ["Exotic", "exotic"]])>> - - <<run _options.addOption("Facial attractiveness", "face", $activeSlave) - .addRange(-100, -95, "<", "Very ugly") - .addRange(-55, -40, "<", "Ugly") - .addRange(-15, -10, "<", "Unattractive") - .addRange(0, 10, "<", "Average") - .addRange(15, 40, "<", "Attractive") - .addRange(55, 95, "<", "Beautiful") - .addRange(100, 95, ">=", "Very beautiful")>> - - <<set _option = _options.addOption("Lips", "lips", $activeSlave) - .addRange(5, 10, "<", "Thin") - .addRange(15, 20, "<", "Normal") - .addRange(25, 40, "<", "Pretty") - .addRange(55, 70, "<", "Plush")>> - <<if $seeExtreme == 1>> - <<run _option.addRange(85, 95, "<", "Huge") - .addRange(100, 95, ">=", "Facepussy")>> - <<else>> - <<run _option.addRange(85, 70, ">=", "Huge")>> - <</if>> - - <<run _options.addOption("Voice", "voice", $activeSlave) - .addValueList([["Mute", 0], ["Deep", 1], ["Normal", 2], ["High", 3]])>> - - <<if $activeSlave.voice !== 0>> - <<run _options.addOption("$language", "accent", $activeSlave) - .addValueList([["Unaccented", 0], [`Pretty ${aNational($activeSlave.nationality)} accent`, 1], - [`Thick ${aNational($activeSlave.nationality)} accent`, 2], ["Not fluent", 3]])>> - <</if>> - - <<set _option = _options.addOption("Teeth", "teeth", $activeSlave) - .addValueList([["Crooked", "crooked"], ["Gapped", "gapped"], ["Braces", "straightening braces"]])>> - <<if $activeSlave.physicalAge >= 12>> - <<if $activeSlave.teeth == "baby" || $activeSlave.teeth == "mixed">> - <<set $activeSlave.teeth = "normal">> - <</if>> - <<run _option.addValue("Straight", "normal")>> - <<elseif $activeSlave.physicalAge >= 6>> - <<if $activeSlave.teeth == "baby" || $activeSlave.teeth == "normal" || $activeSlave.teeth == "">> - <<set $activeSlave.teeth = "mixed">> - <</if>> - <<run _option.addValue("Mixed adult & child", "mixed")>> - <<else>> - <<if $activeSlave.teeth == "mixed" || $activeSlave.teeth == "normal" || $activeSlave.teeth == "">> - <<set $activeSlave.teeth = "mixed">> - <</if>> - <<run _option.addValue("Baby", "baby")>> - <</if>> - - <<run _options.addOption("Breasts", "boobs", $activeSlave).showTextBox("CCs") - .addRange(200, 200, "<=", "Flat (AA-cup)") - .addRange(300, 300, "<=", "Small (A-cup)") - .addRange(400, 400, "<=", "Medium (B-cup)") - .addRange(500, 500, "<=", "Healthy (C-cup)") - .addRange(800, 800, "<=", "Large (DD-cup)") - .addRange(1200, 1200, "<=", "Very Large (G-cup)") - .addRange(2050, 2050, "<=", "Huge (K-cup)") - .addRange(3950, 3950, "<=", "Massive (Q-cup)") - .addRange(6000, 6000, "<=", "Monstrous") - .addRange(8000, 6000, ">", "Science Experiment")>> - - <<run _options.addOption("Natural shape", "boobShape", $activeSlave) - .addValueList([ - ["Normal", "normal"], - ["Perky", "perky"], - ["Torpedo-shaped", "torpedo-shaped"], - ["Wide-set", "wide-set"], - ["Downward-facing", "downward-facing"], - ["Saggy", "saggy"] - ])>> - - <<run _options.addOption("Lactation", "lactation", $activeSlave) - .addValue("Artificial", 2, () => V.activeSlave.lactationDuration = 2) - .addValue("Natural", 1, () => V.activeSlave.lactationDuration = 2) - .addValue("None", 0)>> - - <<run _options.addOption("Nipples", "nipples", $activeSlave) - .addValueList([["Tiny", "tiny"], ["Cute", "cute"], ["Puffy", "puffy"], ["Partially Inverted", "partially inverted"], ["Inverted", "inverted"], ["Huge", "huge"]])>> - - <<run _options.addOption("Areolae", "areolae", $activeSlave) - .addValueList([["Normal", 0], ["Large", 1], ["Wide", 2], ["Huge", 3], ["Massive", 4]])>> - - <<run _options.addOption("Shoulders", "shoulders", $activeSlave) - .addValueList([["Very narrow", -2], ["Narrow", -1], ["Feminine", 0], ["Broad", 1], ["Very broad", 2]])>> - - <<run _options.addOption("Hips", "hips", $activeSlave) - .addValueList([["Very narrow", -2], ["Narrow", -1], ["Normal", 0], ["Broad", 1], ["Very broad", 2]])>> - - <<run _options.addOption("Butt", "butt", $activeSlave) - .addValueList([["Flat", 0], ["Small", 1], ["Plump", 2], ["Big", 3], ["Huge", 4], ["Enormous", 5], ["Gigantic", 6], ["Massive", 7]])>> - - <<run _options.addOption("Anus", "anus", $activeSlave) - .addValueList([["Virgin", 0], ["Normal", 1], ["Veteran", 2], ["Gaping", 3]])>> - - <<if $activeSlave.anus > 0>> - <<if $activeSlave.analArea <= $activeSlave.anus>> - <<set _comment = "Recently stretched to current size.">>" - <<elseif $activeSlave.analArea - $activeSlave.anus == 1>> - <<set _comment = "Used to current size."">> - <<else>> - <<set _comment = "Very broad."">> - <</if>> - <<run _options.addOption("External anus appearance", "anus", $activeSlave) - .addValueList([ - ["Recently stretched", $activeSlave.analArea = $activeSlave.anus], - ["Used to current size", $activeSlave.analArea = $activeSlave.anus+1], - ["Very broad", $activeSlave.analArea = $activeSlave.anus+2], - ]).addComment(_comment)>> - <</if>> - - <<run _options.addOption("Vagina", "vagina", $activeSlave) - .addValue("No vagina", -1, () => { - V.activeSlave.preg = 0; - WombFlush(V.activeSlave); - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pubertyXX = 0; - V.activeSlave.pubertyAgeXX = V.fertilityAge; - V.activeSlave.ovaries = 0; - }).addValue("Virgin", 0, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - }).addValue("Normal", 1, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - }).addValue("Veteran", 2, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - }).addValue("Gaping", 3, () => { - V.activeSlave.preg = -1; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.ovaries = 1 - })>> - - <<if $activeSlave.vagina > -1>> - <<if $activeSlave.dick === 0>> - <<run _options.addOption("Clit", "clit", $activeSlave) - .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2]])>> - <</if>> - - <<run _options.addOption("Labia", "labia", $activeSlave) - .addValueList([["Normal", 0], ["Large", 1], ["Huge", 2], ["Huge Dangling", 3]])>> - - <<run _options.addOption("Vaginal wetness", "vaginaLube", $activeSlave) - .addValueList([["Dry", 0], ["Normal", 1], ["Excessive", 2]])>> - - <<if $seePreg !== 0>> - /* This is only shown if slave has vagina */ - <<run _options.addOption("Puberty", "pubertyXX", $activeSlave) - .addValue("Prepubescent", 0, () => { - V.activeSlave.pubertyAgeXX = V.fertilityAge; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - WombFlush(V.activeSlave) - }).addValue("Postpubescent", 1)>> - - <<run _options.addOption("Age of puberty", "pubertyAgeXX", $activeSlave).showTextBox()>> - - <<if $activeSlave.pubertyXX === 1>> - <<set _option = _options.addOption("Pregnancy", "preg", $activeSlave)>> - <<if $seeHyperPreg === 1 && $cheatMode === 1>> - <<run _option.addValue("Bursting at the seams", 43, () => { - V.activeSlave.pregType = 150; - V.activeSlave.pregWeek = 43; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 2700000; - V.activeSlave.bellyPreg = 2700000; - V.activeSlave.pubertyXX = 1; - })>> - <<if $activeSlave.preg === 43>> - <<run _option.addComment("Extreme hyper pregnancy!")>> - <</if>> - <</if>> - <<run _option.addValue("Completely Filled", 42, () => { - V.activeSlave.pregType = 8; - V.activeSlave.pregWeek = 42; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 120000; - V.activeSlave.bellyPreg = 120000; - V.activeSlave.pubertyXX = 1; - }).addValue("Ready to drop", 40, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 40; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 15000; - V.activeSlave.bellyPreg = 15000; - V.activeSlave.pubertyXX = 1; - }).addValue("Advanced", 34, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 34; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 10000; - V.activeSlave.bellyPreg = 10000; - V.activeSlave.pubertyXX = 1; - }).addValue("Showing", 27, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 27; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 5000; - V.activeSlave.bellyPreg = 5000; - V.activeSlave.pubertyXX = 1; - }).addValue("Early", 12, () => { - V.activeSlave.pregType = 1; - V.activeSlave.pregWeek = 12; - V.activeSlave.pregKnown = 1; - V.activeSlave.belly = 100; - V.activeSlave.bellyPreg = 100; - V.activeSlave.pubertyXX = 1; - }).addValue("None", 0, () => { - V.activeSlave.pregType = 0; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pregSource = 0; - V.activeSlave.pregWeek = 0; - V.activeSlave.pregKnown = 0; - }).addValue("Contraceptives", -1, () => { - V.activeSlave.pregType = 0; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pregSource = 0; - V.activeSlave.pregWeek = 0; - V.activeSlave.pregKnown = 0; - }).addValue("Barren", -2, () => { - V.activeSlave.pregType = 0; - V.activeSlave.belly = 0; - V.activeSlave.bellyPreg = 0; - V.activeSlave.pregSource = 0; - V.activeSlave.pregWeek = 0; - V.activeSlave.pregKnown = 0; - })>> - <</if>> - - <<if $PC.dick > 0 && $activeSlave.preg > 0>> - <<run _options.addOption("Father of child", "pregSource", $activeSlave) - .addValueList([["My child", -1], ["Not me", 0]])>> - <</if>> - <</if>> - <</if>> - - <<if $seeDicks !== 0 || $makeDicks === 1>> - <<run _options.addOption("Penis", "dick", $activeSlave) - .addValue("None", 0, () => { - V.activeSlave.balls = 0; - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = V.potencyAge; - }).addValue("Tiny", 1, () => {V.activeSlave.clit = 0}) - .addValue("Small", 2, () => {V.activeSlave.clit = 0}) - .addValue("Normal", 3, () => {V.activeSlave.clit = 0}) - .addValue("Large", 4, () => {V.activeSlave.clit = 0}) - .addValue("Massive", 5, () => {V.activeSlave.clit = 0})>> - - <<if $activeSlave.dick > 0>> - <<set _option = _options.addOption("Foreskin", "foreskin", $activeSlave)>> - <<if $seeCircumcision === 1>> - <<run _option.addValue("Circumcised", 0)>> - <<elseif $activeSlave.foreskin === 0>> - <<set $activeSlave.foreskin = 3>> - <</if>> - <<run _option.addValueList([["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>> - <</if>> - - <<run _options.addOption("Testicles", "balls", $activeSlave) - .addValue("None", 0, () => { - V.activeSlave.pubertyXY = 0; - V.activeSlave.pubertyAgeXY = V.potencyAge; - V.activeSlave.scrotum = 0; - }).addValueList([["Vestigial", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>> - - <<run _options.addOption("Age of Male Puberty", "pubertyAgeXY", $activeSlave).showTextBox()>> - - <<if $activeSlave.balls > 0>> - <<run _options.addOption("Ballsack", "scrotum", $activeSlave) - .addValueList([["None", 0], ["Tiny", 1], ["Small", 2], ["Normal", 3], ["Large", 4], ["Massive", 5]])>> - - <<run _options.addOption("Male Puberty", "pubertyXY", $activeSlave) - .addValue("Prepubescent", 0, () => {V.activeSlave.pubertyAgeXY = V.potencyAge}) - .addValue("Postpubescent", 1)>> - <</if>> - <</if>> - - <<run _options.addOption("Prostate", "prostate", $activeSlave) - .addValueList([["No prostate", 0], ["Has a prostate", 1]])>> - - <<set _optionLeft = _options.addOption("Left eye", "vision", $activeSlave.eye.left)>> - <<set _optionRight = _options.addOption("Right eye", "vision", $activeSlave.eye.right)>> - <<run _optionLeft.addValueList([["Normal", 2], ["Nearsighted", 1]]), _optionRight.addValueList([["Normal", 2], ["Nearsighted", 1]])>> - <<if $seeExtreme === 1>> - <<run _optionLeft.addValue("Blind", 0), _optionRight.addValue("Blind", 0)>> - <<else>> - <<if $activeSlave.eye.left.vision === 0>> - <<set $activeSlave.eye.left.vision = 2>> - <</if>> - <<if $activeSlave.eye.right.vision === 0>> - <<set $activeSlave.eye.right.vision = 2>> - <</if>> - <</if>> - - <<set _option = _options.addOption("Hearing", "hears", $activeSlave)>> - <<run _option.addValueList([["Normal", 0], ["Hard of hearing", -1]])>> - <<if $seeExtreme == 1>> - <<run _option.addValue("Deaf", -2)>> - <<elseif $activeSlave.hears === 0>> - <<set $activeSlave.hears = 2>> - <</if>> - - - <<if $seeExtreme == 1>> - <<run _options.addOption("Smell ability", "smells", $activeSlave) - .addValueList([["Normal", 0], ["None", -1]])>> - - <<run _options.addOption("Taste ability", "tastes", $activeSlave) - .addValueList([["Normal", 0], ["None", -1]])>> - - <<set _LA = hasLeftArm($activeSlave)>> - <<run _options.addOption("Left arm", "LA", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.arm.left = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.arm.left = null)>> - - <<set _RA = hasRightArm($activeSlave)>> - <<run _options.addOption("Right arm", "RA", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.arm.right = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.arm.right = null)>> - - <<set _LL = hasLeftLeg($activeSlave)>> - <<run _options.addOption("Left leg", "LL", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.leg.left = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.leg.left = null)>> - - <<set _RL = hasRightLeg($activeSlave)>> - <<run _options.addOption("Right leg", "RL", State.temporary) - .addValue("Healthy", true, () => V.activeSlave.leg.right = new App.Entity.LimbState()) - .addValue("Amputated", false, () => V.activeSlave.leg.right = null)>> - <</if>> - - <<includeDOM _options.render()>> + <<includeDOM App.StartingGirls.physical($activeSlave)>> </div> </div> <div id="Mental" class="tab-content"> <div class="content"> - - <<set _options = new App.UI.OptionsGroup()>> - <<if $activeSlave.fetishKnown === 0>> - <<run _options.addOption("Fetish", "fetishKnown", $activeSlave) - .addValueList([["Unknown", 0], ["Known", 1]])>> - <<else>> - <<set _option = _options.addOption("Fetish", "fetish", $activeSlave) - .addValue("Unknown", "", () => { - V.activeSlave.fetish = either("boobs", "buttslut", "cumslut", "dom", "humiliation", "masochist", "pregnancy", "sadist", - "submissive", "none", "none", "none", "none", "none", "none", "none", "none", "none", "none"); - V.activeSlave.fetishKnown = 0 - }).addValueList([["None", "none"], ["Sub", "submissive"], ["Dom", "dom"], ["Cumslut", "cumslut"], ["Humiliation", "humiliation"], - ["Buttslut", "buttslut"], ["Breasts", "boobs"], ["Pregnancy", "pregnancy"], ["Sadism", "sadist"], ["Masochism", "masochist"]])>> - <<if $seeExtreme === 1>> - <<run _option.addValue("Mindbroken", "mindbroken", () => { - V.activeSlave.fetishStrength = 10; - V.activeSlave.sexualFlaw = "none"; - V.activeSlave.sexualQuirk = "none"; - V.activeSlave.behavioralFlaw = "none"; - V.activeSlave.behavioralQuirk = "none"; - })>> - <</if>> - - <<if $activeSlave.fetish !== "none" && $activeSlave.fetish !== "mindbroken">> - <<run _options.addOption("Fetish strength", "fetishStrength", $activeSlave) - .addRange(15, 30, "<=", "Very Low") - .addRange(45, 60, "<=", "Low") - .addRange(75, 85, "<=", "Normal") - .addRange(90, 95, "<=", "High") - .addRange(100, 95, ">", "Extremely High")>> - <</if>> - <</if>> - - <<run _options.addOption("Sexuality", "attrKnown", $activeSlave) - .addValue("Unknown", 0).addValue("Known", 1, () => { - V.activeSlave.attrXX = random(0, 100); - V.activeSlave.attrXY = random(0, 100); - V.activeSlave.energy = random(1, 90); - })>> - <<if $activeSlave.attrKnown === 1>> - <<run _options.addOption("Attraction to men", "attrXY", $activeSlave) - .addRange(0, 5, "<=", "Disgusted").off() - .addRange(10, 15, "<=", "Turned off").off() - .addRange(25, 35, "<=", "Not attracted").off() - .addRange(50, 65, "<=", "Indifferent").neutral() - .addRange(75, 85, "<=", "Attracted").on() - .addRange(90, 95, "<=", "Aroused").on() - .addRange(100, 95, ">", "Passionate").on()>> - <<run _options.addOption("Attraction to women", "attrXX", $activeSlave) - .addRange(0, 5, "<=", "Disgusted").off() - .addRange(10, 15, "<=", "Turned off").off() - .addRange(25, 35, "<=", "Not attracted").off() - .addRange(50, 65, "<=", "Indifferent").neutral() - .addRange(75, 85, "<=", "Attracted").on() - .addRange(90, 95, "<=", "Aroused").on() - .addRange(100, 95, ">", "Passionate").on()>> - - <<run _options.addOption("Sex drive", "energy", $activeSlave) - .addRange(5, 10, "<=", "Frigid").off() - .addRange(25, 40, "<=", "Poor").off() - .addRange(45, 60, "<=", "Average").neutral() - .addRange(65, 80, "<=", "Powerful").on() - .addRange(85, 99, "<=", "Sex addict").on() - .addRange(100, 99, ">", "Nympho").on()>> - <</if>> - - <<if $activeSlave.fetish !== "mindbroken">> - <<run _options.addOption("Behavioral Flaw", "behavioralFlaw", $activeSlave) - .addValueList([["None", "none"], ["Arrogant", "arrogant"], ["Bitchy", "bitchy"], ["Odd", "odd"], ["Hates Men", "hates men"], - ["Hates Women", "hates women"], ["Anorexic", "anorexic"], ["Gluttonous", "gluttonous"], ["Devout", "devout"], - ["Liberated", "liberated"]])>> - - <<run _options.addOption("Behavioral Quirk", "behavioralQuirk", $activeSlave) - .addValueList([["None", "none"], ["Confident", "confident"], ["Cutting", "cutting"], ["Funny", "funny"], - ["Adores Men", "adores men"], ["Adores Women", "adores women"], ["Insecure", "insecure"], ["Fitness", "fitness"], - ["Sinful", "sinful"], ["Advocate", "advocate"]])>> - - <<run _options.addOption("Sexual Flaw", "sexualFlaw", $activeSlave) - .addValueList([["None", "none"], ["Hates Oral", "hates oral"], ["Hates Anal", "hates anal"], - ["Hates Penetration", "hates penetration"], ["Repressed", "repressed"], ["Shamefast", "shamefast"], ["Apathetic", "apathetic"], - ["Crude", "crude"], ["Judgemental", "judgemental"], ["Sexually idealistic", "idealistic"]])>> - - <<run _options.addOption("Sexual Quirk", "sexualQuirk", $activeSlave) - .addValueList([["None", "none"], ["Oral", "gagfuck queen"], ["Anal", "painal queen"], ["Penetration", "strugglefuck queen"], - ["Perverted", "perverted"], ["Tease", "tease"], ["Caring", "caring"], ["Unflinching", "unflinching"], ["Size queen", "size queen"], - ["Romantic", "romantic"]])>> - <</if>> - - <<includeDOM _options.render()>> + <<includeDOM App.StartingGirls.mental($activeSlave)>> </div> </div> @@ -931,44 +324,6 @@ </div> </div> -<div id="Customization" class="tab-content"> - <div class="content"> - - ''Birth name:'' <<textbox "$activeSlave.birthName" $activeSlave.birthName "Starting Girls">> - | ''Slave name:'' <<textbox "$activeSlave.slaveName" $activeSlave.slaveName "Starting Girls">> - <br>''Birth surname:'' <<textbox "$activeSlave.birthSurname" $activeSlave.birthSurname "Starting Girls">> - | ''Slave surname:'' <<textbox "$activeSlave.slaveSurname" $activeSlave.slaveSurname "Starting Girls">> - <br>''Career:'' <span id="career-textbox"><<textbox "$activeSlave.career" $activeSlave.career "Starting Girls">></span> - <span id="careers"></span> - <script>jQuery('#careers').empty().append(App.StartingGirls.career(V.activeSlave));</script> - <br>''Eye color:'' <<textbox "$activeSlave.eye.origColor" $activeSlave.eye.origColor "Starting Girls">> - <<if def $pupil_temp>> - <<set $activeSlave.eye.left.pupil = $pupil_temp, $activeSlave.eye.right.pupil = $pupil_temp, delete $pupil_temp>> - <</if>> - <br>''Pupil shape:'' <<textbox "$pupil_temp" $activeSlave.eye.left.pupil "Starting Girls">> - <<if def $sclerae_temp>> - <<set $activeSlave.eye.left.sclera = $sclerae_temp, $activeSlave.eye.right.sclera = $sclerae_temp, delete $sclerae_temp>> - <</if>> - <br>''Sclera color:'' <<textbox "$sclerae_temp" $activeSlave.eye.left.sclera "Starting Girls">> - <br>Custom origin story: <<textbox "$activeSlave.origin" $activeSlave.origin "Starting Girls">> //Use complete, capitalized and punctuated sentences.// - <br>Origin override: - <<if $originOverride == 1>> - @@.green;Enabled@@ [[Disable|Starting Girls][$originOverride = 0]] //Disabling will allow Starting Girls to overwrite origins and tattoos with its defaults.// - <<else>> - @@.red;Disabled@@ [[Enable|Starting Girls][$originOverride = 1]] //Enabling will keep your custom origin and tattoo from being overwritten by Starting Girls.// - <</if>> - <<if $activeSlave.prestige>> - <br>Reason for prestigiousness: <<textbox "$activeSlave.prestigeDesc" $activeSlave.prestigeDesc>> //Use complete, capitalized and punctuated sentences.// - <</if>> - <br>Custom description: <<textbox "$activeSlave.custom.desc" $activeSlave.custom.desc "Starting Girls">> //Use complete, capitalized and punctuated sentences.// - <br>Custom label: <<textbox "$activeSlave.custom.label" $activeSlave.custom.label "Starting Girls">> //Use a short phrase.// - - <br><br> - ''Births:'' <<textbox "$activeSlave.counter.birthsTotal" $activeSlave.counter.birthsTotal "Starting Girls">> //How many times $he has already given birth, not necessarily while owned by you.// - - </div> -</div> - <div id="assignRemove" class="tab-content"> <div class="content">