diff --git a/src/js/modification.js b/src/js/modification.js index aaedaf67f8498577e15f90fa6c04ed815924f6e8..2a9358b08cdf07248ec5b33b88270aa6a3782fee 100644 --- a/src/js/modification.js +++ b/src/js/modification.js @@ -556,224 +556,3 @@ App.Medicine.Modification.setTattoo = function(slave, location, design) { slave[`${location}Tat`] = design; return r; }; - -/** - * @param {App.Entity.PlayerState|App.Entity.SlaveState} entity - * @param {boolean} player - * @returns {HTMLDivElement} - */ -App.Medicine.Modification.eyeSelector = function(entity, player = false) { - const {He, him, his} = getPronouns(entity); - - let selectedSide = "none"; - let selectedIris = "none"; - let selectedPupil = "none"; - let selectedSclera = "none"; - - let removeDiv = document.createElement("div"); - removeDiv.classList.add("choices"); - let applyDiv = document.createElement("div"); - - const container = document.createElement("div"); - container.append( - `${player ? "You have" : `${He} has`} ${App.Desc.eyesColorLong(entity)}, ${hasBothEyes( - entity) ? "they are" : "it is"} ${App.Desc.eyesType(entity)}.`, - removeDiv, "You have a number of contact lenses in various colors available. ", - App.UI.DOM.makeElement("span", `You can change what ${player ? "your" : his} eyes look like.`, "note"), - assembleLinks(), applyDiv - ); - updateRemoveDiv(); - updateApplyDiv(); - return container; - - function assembleLinks() { - const sides = ["left", "right", "both"]; - const irisColors = ["amber", "black", "blue", "brown", "green", "hazel", "orange", "pale-grey", "pink", "red", - "sky-blue", "turquoise", "white", "yellow"]; - const pupilShapes = ["none", "circular", "almond-shaped", "bright", "catlike", "demonic", "devilish", - "goat-like", "heart-shaped", "hypnotic", "serpent-like", "star-shaped", "teary", "vacant", "wide-eyed"]; - const scleraColors = ["none", "white", "amber", "black", "blue", "brown", "green", "hazel", "orange", - "pale-grey", "pink", "red", "sky-blue", "turquoise", "yellow"]; - const div = document.createDocumentFragment(); - div.append( - assembleList("Side: ", sides, value => selectedSide = value, selectedIris), - assembleList("Iris: ", irisColors, value => selectedIris = value, selectedSide), - assembleList("Pupil: ", pupilShapes, value => selectedPupil = value, selectedPupil), - assembleList("Sclera: ", scleraColors, value => selectedSclera = value, selectedSclera) - ); - return div; - } - - /** - * @param {string} name - * @param {Array<string>} list - * @param {Function}callback - * @param {string} selected - * @returns {HTMLDivElement} - */ - function assembleList(name, list, callback, selected) { - const links = []; - - for (let i = 0; i < list.length; i++) { - addToggle(list[i], callback, links, list[i] === selected); - } - - const div = document.createElement("div"); - div.classList.add("choices"); - div.append(name, App.UI.DOM.arrayToList(links, " | ", " | ")); - return div; - } - - /** - * @param {string} value - * @param {Function} callback - * @param {Array<HTMLAnchorElement>} links - * @param {boolean} [disabled] - */ - function addToggle(value, callback, links, disabled = false) { - const a = document.createElement("a"); - a.append(capFirstChar(value)); - if (disabled) { - a.classList.add("disabled"); - } - a.onclick = () => { - for (let link of links) { - link.classList.remove("disabled"); - } - a.classList.add("disabled"); - callback(value); - updateRemoveDiv(); - updateApplyDiv(); - }; - links.push(a); - } - - function updateApplyDiv() { - $(applyDiv).empty(); - if (selectedSide !== "none" && selectedIris !== "none") { - // make the following easier to read - let both = selectedSide === "both"; - let leftGlass = !hasLeftEye(entity) || getLeftEyeType(entity) === 2; - let rightGlass = !hasRightEye(entity) || getRightEyeType(entity) === 2; - - // base eye - let r = player ? "" : ` ${him}`; - if (both) { - if (leftGlass && rightGlass) { - r += ` ${selectedIris} glass eyes`; - } else if (leftGlass || rightGlass) { - r += ` a glass eye and a ${selectedIris} lens`; - } else { - r += ` ${selectedIris} lenses`; - } - } else { - r += " a"; - if ((selectedSide === "left" && leftGlass) || (selectedSide === "right" && rightGlass)) { - r += ` ${selectedIris} glass eye`; - } else { - r += ` ${selectedIris} lens`; - } - } - // pupil & sclera - if (selectedPupil !== "none" || selectedSclera !== "none") { - r += " with"; - if (selectedPupil !== "none") { - r += ` ${both ? selectedPupil : addA(selectedPupil)}`; - if (both) { - r += " pupils"; - } else { - r += " pupil"; - } - if (selectedSclera !== "none") { - r += " and"; - } - } - if (selectedSclera !== "none") { - r += ` ${selectedSclera}`; - if (both) { - r += " sclerae"; - } else { - r += " sclera"; - } - } - } - if (!both) { - r += ` for ${player ? "your" : his} ${selectedSide} eye`; - } - r += "?"; - - const a = document.createElement("a"); - a.append(player ? "Take" : "Give"); - a.onclick = applyLink; - applyDiv.append(a, r); - if (!player) { - applyDiv.append(" ", - App.UI.DOM.makeElement("span", "This is independent from eyewear choices.", "note")); - } - } - } - - function applyLink() { - // make sure the eye exists; give glass eye if there is none - if ((selectedSide === "left" || selectedSide === "both") && getLeftEyeType(entity) === 0) { - eyeSurgery(entity, "left", "glass"); - } - if ((selectedSide === "right" || selectedSide === "both") && getRightEyeType(entity) === 0) { - eyeSurgery(entity, "right", "glass"); - } - - // apply modifications - setEyeColorFull(entity, selectedIris, - selectedPupil === "none" ? "" : selectedPupil, - selectedSclera === "none" ? "" : selectedSclera, - selectedSide); - cashX(forceNeg(V.modCost), "slaveMod", entity); - - App.UI.reload(); - } - - - function updateRemoveDiv() { - $(removeDiv).empty(); - const links = []; - let _n = 0; - // remove lenses - if (hasLeftEye(entity) && getLeftEyeColor(entity) !== getGeneticEyeColor(entity, "left")) { - _n++; - links.push(removeLink("Remove left lens", () => resetEyeColor(entity, "left"))); - } - if (hasRightEye(entity) && getRightEyeColor(entity) !== getGeneticEyeColor(entity, "right")) { - _n++; - links.push(removeLink("Remove right lens", () => resetEyeColor(entity, "right"))); - } - if (_n === 2) { - links.push(removeLink("Remove both lenses", () => resetEyeColor(entity, "both"))); - } - // remove glass eyes - _n = 0; - if (getLeftEyeType(entity) === 2) { - _n++; - links.push(removeLink("Remove left glass eye", () => eyeSurgery(entity, "left", "remove"))); - } - if (getRightEyeType(entity) === 2) { - _n++; - links.push(removeLink("Remove right glass eye", () => eyeSurgery(entity, "right", "remove"))); - } - if (_n === 2) { - links.push(removeLink("Remove both glass eyes", () => eyeSurgery(entity, "both", "remove"))); - } - if (links.length > 0) { - removeDiv.append(App.UI.DOM.arrayToList(links, " | ", " | ")); - } - } - - function removeLink(text, callback) { - const a = document.createElement("a"); - a.append(text); - a.onclick = () => { - callback(); - App.UI.reload(); - }; - return a; - } -}; diff --git a/src/js/salon.js b/src/js/salon.js index 812dee1f258f663bbfcddef16011b2301b6ce023..0c8a2977891c3c2e38e4e7bf8e5ad8cc0f23c64d 100644 --- a/src/js/salon.js +++ b/src/js/salon.js @@ -1,3 +1,224 @@ +/** + * @param {App.Entity.PlayerState|App.Entity.SlaveState} entity + * @param {boolean} player + * @returns {HTMLDivElement} + */ +App.Medicine.Modification.eyeSelector = function(entity, player = false) { + const {He, him, his} = getPronouns(entity); + + let selectedSide = "none"; + let selectedIris = "none"; + let selectedPupil = "none"; + let selectedSclera = "none"; + + let removeDiv = document.createElement("div"); + removeDiv.classList.add("choices"); + let applyDiv = document.createElement("div"); + + const container = document.createElement("div"); + container.append( + `${player ? "You have" : `${He} has`} ${App.Desc.eyesColorLong(entity)}, ${hasBothEyes( + entity) ? "they are" : "it is"} ${App.Desc.eyesType(entity)}.`, + removeDiv, "You have a number of contact lenses in various colors available. ", + App.UI.DOM.makeElement("span", `You can change what ${player ? "your" : his} eyes look like.`, "note"), + assembleLinks(), applyDiv + ); + updateRemoveDiv(); + updateApplyDiv(); + return container; + + function assembleLinks() { + const sides = ["left", "right", "both"]; + const irisColors = ["amber", "black", "blue", "brown", "green", "hazel", "orange", "pale-grey", "pink", "red", + "sky-blue", "turquoise", "white", "yellow"]; + const pupilShapes = ["none", "circular", "almond-shaped", "bright", "catlike", "demonic", "devilish", + "goat-like", "heart-shaped", "hypnotic", "serpent-like", "star-shaped", "teary", "vacant", "wide-eyed"]; + const scleraColors = ["none", "white", "amber", "black", "blue", "brown", "green", "hazel", "orange", + "pale-grey", "pink", "red", "sky-blue", "turquoise", "yellow"]; + const div = document.createDocumentFragment(); + div.append( + assembleList("Side: ", sides, value => selectedSide = value, selectedIris), + assembleList("Iris: ", irisColors, value => selectedIris = value, selectedSide), + assembleList("Pupil: ", pupilShapes, value => selectedPupil = value, selectedPupil), + assembleList("Sclera: ", scleraColors, value => selectedSclera = value, selectedSclera) + ); + return div; + } + + /** + * @param {string} name + * @param {Array<string>} list + * @param {Function}callback + * @param {string} selected + * @returns {HTMLDivElement} + */ + function assembleList(name, list, callback, selected) { + const links = []; + + for (let i = 0; i < list.length; i++) { + addToggle(list[i], callback, links, list[i] === selected); + } + + const div = document.createElement("div"); + div.classList.add("choices"); + div.append(name, App.UI.DOM.arrayToList(links, " | ", " | ")); + return div; + } + + /** + * @param {string} value + * @param {Function} callback + * @param {Array<HTMLAnchorElement>} links + * @param {boolean} [disabled] + */ + function addToggle(value, callback, links, disabled = false) { + const a = document.createElement("a"); + a.append(capFirstChar(value)); + if (disabled) { + a.classList.add("disabled"); + } + a.onclick = () => { + for (let link of links) { + link.classList.remove("disabled"); + } + a.classList.add("disabled"); + callback(value); + updateRemoveDiv(); + updateApplyDiv(); + }; + links.push(a); + } + + function updateApplyDiv() { + $(applyDiv).empty(); + if (selectedSide !== "none" && selectedIris !== "none") { + // make the following easier to read + let both = selectedSide === "both"; + let leftGlass = !hasLeftEye(entity) || getLeftEyeType(entity) === 2; + let rightGlass = !hasRightEye(entity) || getRightEyeType(entity) === 2; + + // base eye + let r = player ? "" : ` ${him}`; + if (both) { + if (leftGlass && rightGlass) { + r += ` ${selectedIris} glass eyes`; + } else if (leftGlass || rightGlass) { + r += ` a glass eye and a ${selectedIris} lens`; + } else { + r += ` ${selectedIris} lenses`; + } + } else { + r += " a"; + if ((selectedSide === "left" && leftGlass) || (selectedSide === "right" && rightGlass)) { + r += ` ${selectedIris} glass eye`; + } else { + r += ` ${selectedIris} lens`; + } + } + // pupil & sclera + if (selectedPupil !== "none" || selectedSclera !== "none") { + r += " with"; + if (selectedPupil !== "none") { + r += ` ${both ? selectedPupil : addA(selectedPupil)}`; + if (both) { + r += " pupils"; + } else { + r += " pupil"; + } + if (selectedSclera !== "none") { + r += " and"; + } + } + if (selectedSclera !== "none") { + r += ` ${selectedSclera}`; + if (both) { + r += " sclerae"; + } else { + r += " sclera"; + } + } + } + if (!both) { + r += ` for ${player ? "your" : his} ${selectedSide} eye`; + } + r += "?"; + + const a = document.createElement("a"); + a.append(player ? "Take" : "Give"); + a.onclick = applyLink; + applyDiv.append(a, r); + if (!player) { + applyDiv.append(" ", + App.UI.DOM.makeElement("span", "This is independent from eyewear choices.", "note")); + } + } + } + + function applyLink() { + // make sure the eye exists; give glass eye if there is none + if ((selectedSide === "left" || selectedSide === "both") && getLeftEyeType(entity) === 0) { + eyeSurgery(entity, "left", "glass"); + } + if ((selectedSide === "right" || selectedSide === "both") && getRightEyeType(entity) === 0) { + eyeSurgery(entity, "right", "glass"); + } + + // apply modifications + setEyeColorFull(entity, selectedIris, + selectedPupil === "none" ? "" : selectedPupil, + selectedSclera === "none" ? "" : selectedSclera, + selectedSide); + cashX(forceNeg(V.modCost), "slaveMod", entity); + + App.UI.reload(); + } + + + function updateRemoveDiv() { + $(removeDiv).empty(); + const links = []; + let _n = 0; + // remove lenses + if (hasLeftEye(entity) && getLeftEyeColor(entity) !== getGeneticEyeColor(entity, "left")) { + _n++; + links.push(removeLink("Remove left lens", () => resetEyeColor(entity, "left"))); + } + if (hasRightEye(entity) && getRightEyeColor(entity) !== getGeneticEyeColor(entity, "right")) { + _n++; + links.push(removeLink("Remove right lens", () => resetEyeColor(entity, "right"))); + } + if (_n === 2) { + links.push(removeLink("Remove both lenses", () => resetEyeColor(entity, "both"))); + } + // remove glass eyes + _n = 0; + if (getLeftEyeType(entity) === 2) { + _n++; + links.push(removeLink("Remove left glass eye", () => eyeSurgery(entity, "left", "remove"))); + } + if (getRightEyeType(entity) === 2) { + _n++; + links.push(removeLink("Remove right glass eye", () => eyeSurgery(entity, "right", "remove"))); + } + if (_n === 2) { + links.push(removeLink("Remove both glass eyes", () => eyeSurgery(entity, "both", "remove"))); + } + if (links.length > 0) { + removeDiv.append(App.UI.DOM.arrayToList(links, " | ", " | ")); + } + } + + function removeLink(text, callback) { + const a = document.createElement("a"); + a.append(text); + a.onclick = () => { + callback(); + App.UI.reload(); + }; + return a; + } +}; + /** * Update ears in salon * @param {App.Entity.SlaveState} slave