diff --git a/js/003-data/miscData.js b/js/003-data/miscData.js index 07531193cf1c37f3161d8cd45255d94b663cc9fe..8b2dc789b7002700b16b38a071dc888d22956560 100644 --- a/js/003-data/miscData.js +++ b/js/003-data/miscData.js @@ -266,6 +266,8 @@ App.Data.misc = { naturalNippleColors: ["black", "brown", "dark brown", "ebony", "ivory", "light brown", "pale pink", "pink"], eyebrowStyles: new Set(["shaved", "straight", "rounded", "natural", "slanted inwards", "slanted outwards", "high-arched", "elongated", "shortened", "curved"]), eyebrowFullness: new Set(["pencil-thin", "thin", "threaded", "natural", "tapered", "thick", "bushy"]), + pubicStyles: new Set(["waxed", "in a strip", "neat", "bushy", "bushy in the front and neat in the rear", "very bushy"]), + armpitStyles: new Set(["waxed", "shaved", "neat", "bushy"]), /* START Custom Nationalities region filter */ /* Not currently weighted, but will accept weights */ diff --git a/src/facilities/salon/salon.tw b/src/facilities/salon/salon.tw index 4a25caef669034cd8cd1104d7514ce4d7b251b9b..7f45daea54c9c041544a9ebe80535e05ee64f246 100644 --- a/src/facilities/salon/salon.tw +++ b/src/facilities/salon/salon.tw @@ -17,18 +17,6 @@ <<= getSlave($AS).slaveName>> is seated in the auto salon. $He is awaiting your artistic pleasure. </span> -/* 000-250-006 */ -<span id="art-frame"> - <<if $seeImages == 1>> - <<if $imageChoice == 1>> - <div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt(getSlave($AS), 3, 0)>></div> - <<else>> - <div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt(getSlave($AS), 3, 0)>></div> - <</if>> - <</if>> -</span> -/* 000-250-006 */ - /* EYES */ <h3>Eyewear</h3> diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index 67da357ba99433096bfa5b3f5c632b8fa1e6bddf..dc506f4096d49219cf8d075e2f5bbdca7be0c6c9 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -8,11 +8,9 @@ App.UI.salon = function(slave, cheat = false) { container.id = "salon"; const { He, His, - he, his, him, himself + he, his, him } = getPronouns(slave); Enunciate(slave); - const _oldHLength = (V.showInches === 2) ? Math.round(slave.hLength / 2.54) : slave.hLength; - let _newHLength = 0; container.append(createPage()); return container; @@ -21,7 +19,7 @@ App.UI.salon = function(slave, cheat = false) { const el = new DocumentFragment(); if (!cheat) { if (V.seeImages > 0) { - //App.Events.drawEventArt(el, slave); + App.Events.drawEventArt(el, slave); } el.append(intro()); } @@ -150,7 +148,7 @@ App.UI.salon = function(slave, cheat = false) { const el = new DocumentFragment(); App.UI.DOM.appendNewElement("h2", el, "Hair"); - el.append(App.Medicine.Salon.hair(slave, { cheat: cheat })); + el.append(App.Medicine.Salon.hair(slave, {cheat: cheat})); return el; } @@ -195,7 +193,7 @@ App.UI.salon = function(slave, cheat = false) { } } if (slave.skin !== "spray tanned") { - option.addValue("Spray tan", "sun tanned", billMod) + option.addValue("Spray tan", "sun tanned", billMod); } option.addComment(comment.join(" ")); } @@ -242,16 +240,11 @@ App.UI.salon = function(slave, cheat = false) { let option; let r = []; App.UI.DOM.appendNewElement("h2", el, "Body hair"); + + // Eyebrows if (slave.eyebrowHStyle !== "bald") { // Describe and change color - r.push(`${His}`); - if (slave.eyebrowFullness !== "natural") { - r.push(slave.eyebrowFullness); - } - if (slave.eyebrowHStyle !== "natural") { - r.push(r.pop(), `, ${slave.eyebrowHStyle}`); - } - r.push(`eyebrows`); + r.push(`${His} eyebrows`); if (slave.eyebrowHStyle === "shaved") { r.push(`would be ${slave.eyebrowHColor} if present.`); } else { @@ -260,7 +253,7 @@ App.UI.salon = function(slave, cheat = false) { option = options.addOption(r.join(" "), "eyebrowHColor", slave); if (slave.eyebrowHColor !== slave.hColor) { - option.addValue("Match the hair", slave.hColor); + option.addValue("Match the hair", slave.hColor); } option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value))); option.addCallbackToEach(billMod); @@ -282,6 +275,80 @@ App.UI.salon = function(slave, cheat = false) { } else { options.addComment(`${His} eyebrows are completely hairless.`); } + + // Pubic hair + const _pubertyAge = Math.min(slave.pubertyAgeXX, slave.pubertyAgeXY); + r = []; + const hasPubes = (slave.pubicHStyle !== "bald" && slave.pubicHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1); + if (hasPubes) { + r.push(`${His}`); + if (slave.physicalAge < _pubertyAge) { + r.push(`wispy pubic hair, which is just starting to grow in,`); + } else if (slave.pubicHStyle === "in a strip") { + r.push(`pubic hair, which is shaved into a strip,`); + } else { + r.push(`${slave.pubicHStyle} pubic hair`); + } + if (slave.pubicHStyle === "waxed") { + r.push(`would be ${slave.pubicHColor} if present.`); + } else { + r.push(`is ${slave.pubicHColor}.`); + } + } else { + r.push(`${His} groin is completely hairless.`); + } + option = options.addOption(r.join(" "), "pubicHColor", slave); + if (hasPubes) { + if (slave.pubicHColor !== slave.hColor) { + option.addValue("Match the curtains", slave.pubicHColor); + } + option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value))) + .addCallbackToEach(billMod) + .pulldown(); + + // Style + option = options.addOption(`Style ${his} pubic hair`, "pubicHStyle", slave); + for (const fullness of App.Data.misc.pubicStyles) { + option.addValue(capFirstChar(fullness), fullness, billMod); + } + option.pulldown(); + } + + // Armpit hair + r = []; + const hasPitHair = (slave.underArmHStyle !== "bald" && slave.underArmHStyle !== "hairless" && slave.physicalAge >= _pubertyAge - 1); + if (hasPitHair) { + r.push(`${His}`); + if (slave.physicalAge < _pubertyAge) { + r.push(`wispy underarm hair`); + } else { + r.push(`${slave.underArmHStyle} underarm hair`); + } + if (slave.underArmHStyle === "waxed") { + r.push(`would be ${slave.underArmHColor} if present.`); + } else { + r.push(`is ${slave.underArmHColor}.`); + } + } else { + r.push(`${His} underarms are completely hairless.`); + } + option = options.addOption(r.join(" "), "underArmHColor", slave); + if (hasPitHair) { + if (slave.underArmHColor !== slave.hColor) { + option.addValue("Match the hair", slave.hColor); + } + option.addValueList(makeAList(App.Medicine.Modification.Color.Primary.map(color => color.value))) + .addCallbackToEach(billMod) + .pulldown(); + + // Style + option = options.addOption(`Style ${his} armpit hair`, "underArmHStyle", slave); + for (const fullness of App.Data.misc.armpitStyles) { + option.addValue(capFirstChar(fullness), fullness, billMod); + } + option.pulldown(); + } + el.append(options.render()); return el; } diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 330e60e70df712c8e8e539831c2c0681942d3bdc..c176fb9f72c73a4e7bfe7743e67fad785e29a3ff 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -3121,14 +3121,7 @@ globalThis.rulesAssistantOptions = (function() { class PubicHairStyleList extends ListSelector { constructor() { - const pairs = [ - ["waxed"], - ["in a strip"], - ["neat"], - ["bushy"], - ["bushy in the front and neat in the rear"], - ["very bushy"] - ]; + const pairs = Array.from(App.Data.misc.pubicStyles, style => [capFirstChar(style), style]); super("Pubic hairstyle", pairs); this.setValue(current_rule.set.pubicHStyle); this.onchange = (value) => current_rule.set.pubicHStyle = value; @@ -3146,12 +3139,7 @@ globalThis.rulesAssistantOptions = (function() { class ArmpitHairStyleList extends ListSelector { constructor() { - const pairs = [ - ["waxed"], - ["shaved"], - ["neat"], - ["bushy"] - ]; + const pairs = Array.from(App.Data.misc.armpitStyles, style => [capFirstChar(style), style]); super("Underarm hair style", pairs); this.setValue(current_rule.set.underArmHStyle); this.onchange = (value) => current_rule.set.underArmHStyle = value;