diff --git a/devTools/types/FC/Salon.d.ts b/devTools/types/FC/Salon.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..17f89b415bbb698015fc69814f09db8e91e33eae --- /dev/null +++ b/devTools/types/FC/Salon.d.ts @@ -0,0 +1,29 @@ +declare namespace FC { + + type ColorHex = { + amaranth: "#E52B50"; + amethyst: "#9966CC"; + aquamarine: "#7FFFD4"; + azure: "#007FFF"; + citrine: "#e4d00a"; + crimson: "#DC143C"; + emerald: "#50C878"; + gold: "#ffd700"; + ivory: "#fffff0"; + jade: "#00a86b"; + platinum: "#e5e4e2"; + onyx: "#0f0f0f"; + ruby: "#cc1057"; + sapphire: "#0f52ba"; + silver: "#c0c0c0"; + } + + type PatternColor = "black" | "blue" | "brown" | "green" | "grey" | "orange" | "pink" | "purple" | "red" | "white" | "yellow" + type PatternedEars = "leopard" | "tiger" | "jaguar" + type PatternedTails = "leopard" | "tiger" | "jaguar" | "tanuki" | "raccoon" | "gazelle" + type PatternedAppendages = "moth" + + +} + + diff --git a/devTools/types/FC/human.d.ts b/devTools/types/FC/human.d.ts index e87e00cad4a434540e89ec6f1c0a6684420490ae..79eeb580829ef54555422a56973bafa7c3e6ea31 100644 --- a/devTools/types/FC/human.d.ts +++ b/devTools/types/FC/human.d.ts @@ -284,7 +284,7 @@ declare global { type TailType = WithNone<"mod" | "combat" | "sex"| "stinger">; type AppendagesType = WithNone<"mod" | "flight" | "sex" | "falcon" | "arachnid" | "kraken">; type Markings = WithNone<"beauty mark" | "birthmark" | "freckles" | "heavily freckled">; - type TailShape = WithNone<"cat" | "leopard" | "tiger" | "jaguar" | "lion" | "dog" | "wolf" | "jackal" | "fox" | "kitsune" | "raccoon" | "rabbit" | "squirrel" | "horse" | "bird" | "phoenix" | "peacock" | "raven" | "swan" | "sheep" | "cow" | "gazelle" | "deer" | "succubus" | "dragon" >; + type TailShape = WithNone<"cat" | "leopard" | "tiger" | "jaguar" | "lion" | "dog" | "wolf" | "jackal" | "fox" | "kitsune" | "tanuki" | "raccoon" | "rabbit" | "squirrel" | "horse" | "bird" | "phoenix" | "peacock" | "raven" | "swan" | "sheep" | "cow" | "gazelle" | "deer" | "succubus" | "dragon" >; type WingsShape = WithNone<"angel" | "seraph" | "demon"| "dragon" | "phoenix" | "bird"| "fairy" | "butterfly" | "moth" | "insect" | "evil" >; type ToyHole = "all her holes" | "mouth" | "boobs" | "pussy" | "ass" | "dick"; type OvaryImplantType = 0 | "fertility" | "sympathy" | "asexual"; diff --git a/devTools/types/FC/medicine.d.ts b/devTools/types/FC/medicine.d.ts index 8a92a8bf3587b6459c433d99038a9f856794d080..8c2bae4ca46436193bafe16eb5993f1b9a904a35 100644 --- a/devTools/types/FC/medicine.d.ts +++ b/devTools/types/FC/medicine.d.ts @@ -39,16 +39,6 @@ declare namespace FC { hired: number; menials: number; } - - type ColorHex = { - amaranth: "#E52B50"; - amethyst: "#9966CC"; - aquamarine: "#7FFFD4"; - azure: "#007FFF"; - crimson: "#DC143C" - emerald: "#50C878"; - ruby: "#cc1057"; - } } diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index e8d2ddd80abc685be787e9ccbeb45899058e2e84..68621ee1598a38a284b1c99e568779de2a387a8b 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -1256,6 +1256,7 @@ App.Data.resetOnNGPlus = { hired: 0, menials: 0, }, + /* prosthetics: {research: int, amount: int} */ prosthetics: {}, merchantFSWares: App.Data.FSWares, diff --git a/js/003-data/slaveMods.js b/js/003-data/slaveMods.js index cff074747b3c85887844387848239a753f57c634..eb4ed4371ac8efc480979bf93cab975cc163152c 100644 --- a/js/003-data/slaveMods.js +++ b/js/003-data/slaveMods.js @@ -228,60 +228,36 @@ App.Medicine.Modification.Color = { {value: "pink"}, {value: "platinum blonde"}, {value: "purple"}, + {value: "rainbow"}, {value: "red"}, {value: "sea green"}, {value: "silver"}, {value: "strawberry-blonde"}, {value: "white"}, ], - Secondary: [ - { - title: "None", - value: "" - }, - { - title: "Black", - value: " with black highlights" - }, - { - title: "Blazing red", - value: " with blazing red highlights" - }, - { - title: "Blonde", - value: " with blonde highlights" - }, - { - title: "Grey", - value: " with grey highlights" - }, - { - title: "Neon blue", - value: " with neon blue highlights" - }, - { - title: "Neon green", - value: " with neon green highlights" - }, - { - title: "Neon pink", - value: " with neon pink highlights" - }, - { - title: "Rainbow", - value: " with rainbow highlights" - }, - { - title: "Silver", - value: " with silver highlights" - }, - { - title: "White", - value: " with white highlights" - }, - ] + Pattern: [ + {value: "blue"}, + {value: "brown"}, + {value: "green"}, + {value: "grey"}, + {value: "orange"}, + {value: "pink"}, + {value: "purple"}, + {value: "red"}, + {value: "white"}, + {value: "yellow"}, + ], + Effect: [ + {value: "fading"}, + {value: "camouflage"}, + {value: "speckles"}, + {value: "blotches"}, + {value: "stripes"}, + {value: "veins"}, + {value: "highlights"}, + {value: "undercoloring"}, + ], }; - /** * @typedef {Object} hairStyle * @property {string} title @@ -417,17 +393,35 @@ App.Medicine.Modification.hLength = [ }, ]; +/** the Hex codes for the added colors can be found in + * @param {FC.ColorHex} codes + */ App.Medicine.Modification.eyeColor = [ {value: "amber"}, + {value: "amaranth"}, + {value: "amethyst"}, + {value: "aquamarine"}, + {value: "azure"}, {value: "black"}, {value: "blue"}, {value: "brown"}, + {value: "citrine"}, + {value: "crimson"}, + {value: "emerald"}, + {value: "gold"}, {value: "green"}, {value: "hazel"}, + {value: "ivory"}, + {value: "jade"}, {value: "orange"}, {value: "pale-grey"}, {value: "pink"}, + {value: "platinum"}, + {value: "onyx"}, {value: "red"}, + {value: "ruby"}, + {value: "sapphire"}, + {value: "silver"}, {value: "sky-blue"}, {value: "turquoise"}, {value: "white"}, diff --git a/rdCenter.tw b/rdCenter.tw new file mode 100644 index 0000000000000000000000000000000000000000..d0bba8f47ac9bf20f8c792cd69d149521a41f2fb --- /dev/null +++ b/rdCenter.tw @@ -0,0 +1,106 @@ +:: rdCenter [nobr] + +<<set $nextButton = "Back", $nextLink = "Main">> + +<strong>The Institute</strong> <hr> +This is one of the most prominent and prestigious research and development institutions in the world. Scientists, inventors, innovators and students from all over the world aspire to become a member of the institute and gain funding for their projects. + +<<if $SecExp.buildings.rdCenter.airport == 1>> + The Institute's computing power is fairly standard. +<<elseif $SecExp.buildings.rdCenter.airport == 2>> + The Institute's computing power is high tech. +<<elseif $SecExp.buildings.rdCenter.airport == 3>> + The Institute's computing power is cutting-edge. +<<elseif $SecExp.buildings.rdCenter.airport == 4>> + The Institute's computing power is cutting-edge, additionally its facilities and departments have Virtual assistants. +<<else>> + The Institute's computing power is cutting-edge, additionally its facilities and departments have the finest Virtual assistants there are. +<</if>> + + + <<if $SecExp.buildings.rdCenter.surfaceTransport == 1>> + It posesses standard equipment and facilities. + <<elseif $SecExp.buildings.rdCenter.surfaceTransport == 2>> + It has high-end equipment and facilities. + <<elseif $SecExp.buildings.rdCenter.surfaceTransport == 3>> + It has a good amount of large high-end facilities. + <<else>> + It has an excellent amount of optimized facilities, equiped with cutting-edge equipment. + <</if>> + + + +<<if $SecExp.buildings.rdCenter.security == 1>> + Currently its security is limited to a few cameras and the occasional guard. +<<elseif $SecExp.buildings.rdCenter.security == 2>> + Its security is guaranteed by a powerful camera surveillance system. +<<elseif $SecExp.buildings.rdCenter.security == 3>> + Its security is guaranteed by a powerful camera surveillance system and highly trained guards constantly patrolling the structure. +<<else>> + Its security is guaranteed by a powerful camera surveillance system, highly trained guards constantly patrolling the building and additional security drones making the rounds around the exterior. +<</if>> + +<<if $SecExp.buildings.rdCenter.airport == 1>> + <br><br> <<link "Improve the Institute's computing power" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(5000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.airport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(5000*$upgradeMultiplierArcology))>> and increase research and development rate// +<<elseif $SecExp.buildings.rdCenter.airport == 2>> + <br><br> <<link "Upgrade the Institute's computing power further" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(15000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.airport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(15000*$upgradeMultiplierArcology))>> and further increase research and development rate// +<<elseif $SecExp.buildings.rdCenter.airport == 3>> + <br><br> <<link "Give each facility and department its own virtual assistant" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(45000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.airport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(45000*$upgradeMultiplierArcology))>> and further increase research and development rate// +<<elseif $SecExp.buildings.rdCenter.airport == 4>> + <br><br> <<link "Upgrade the Virtual assistants" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(85000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.airport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(85000*$upgradeMultiplierArcology))>> and further increase research and development rate// +<<else>> + <br><br>The Institute's tech is fully upgraded. +<</if>> + + + <<if $SecExp.buildings.rdCenter.surfaceTransport == 1>> + <br> <<link "Modernize the equipment and facilities" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.surfaceTransport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology))>>, and increase research and development rate// + <<elseif $SecExp.buildings.rdCenter.surfaceTransport == 2>> + <br> <<link "Enlarge and increase the facilities" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(25000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.surfaceTransport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(25000*$upgradeMultiplierArcology))>>, and further increase research and development rate// + <<elseif $SecExp.buildings.rdCenter.surfaceTransport == 3>> + <br> <<link "Further modernize and enlarge the equipment and facilities to cutting-edge" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(65000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.surfaceTransport++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(65000*$upgradeMultiplierArcology))>>, and further increase research and development rate// + <<else>> + <br>The equipment and facilities are the cream of the crop. + <</if>> + + +<<if $SecExp.buildings.rdCenter.security == 1>> /* security */ + <br> <<link "Expand and modernize the surveillance system" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(15000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.security++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(15000*$upgradeMultiplierArcology))>> and increase Institute security// +<<elseif $SecExp.buildings.rdCenter.security == 2>> + <br> <<link "Establish a highly trained guard corps and adjecent barracks" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(35000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.security++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(35000*$upgradeMultiplierArcology))>> and further increase Institute security// +<<elseif $SecExp.buildings.rdCenter.security == 3>> + <br> <<link "Add additional security drones to the structure" "rdCenter">> + <<run cashX(forceNeg(Math.trunc(55000*$upgradeMultiplierArcology)), "capEx")>> + <<set $SecExp.buildings.rdCenter.security++>> + <</link>> //Will cost <<print cashFormat(Math.trunc(55000*$upgradeMultiplierArcology))>> and further increase Institute security// +<<else>> + <br>Security is fully upgraded +<</if>> +<br><br>[[Return this sector to standard markets|Main][delete $SecExp.buildings.rdCenter, cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "capEx"), App.Arcology.cellUpgrade($building, App.Arcology.Cell.Market, "Transport Hub", "Markets")]] //Costs <<print cashFormat(Math.trunc(10000*$upgradeMultiplierArcology))>>// diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js index ece1f97e2e1cf35b996683fda367b283ff27f2e7..3dc6adf2a5c60ce54b0d374a17d7e20c7ecc1bd6 100644 --- a/src/002-config/fc-version.js +++ b/src/002-config/fc-version.js @@ -2,5 +2,5 @@ App.Version = { base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed. pmod: "4.0.0-alpha.10", commitHash: null, - release: 1145 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. + release: 1146 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. }; diff --git a/src/data/backwardsCompatibility/backwardsCompatibility.js b/src/data/backwardsCompatibility/backwardsCompatibility.js index bf401dfd06cdcaa391c06d33c6e5560a20365ce1..944d11e73a0e4e2f803d973d379444d1be9ad014 100644 --- a/src/data/backwardsCompatibility/backwardsCompatibility.js +++ b/src/data/backwardsCompatibility/backwardsCompatibility.js @@ -2206,7 +2206,6 @@ App.Update.oldVersions = function(node) { if (V.releaseID <= 1123) { V.plotEventWeek = App.Events.effectiveWeek(); } - node.append(`Done!`); }; diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js index 615a1f1c56d3fcd6fe6b07014d183e60176754f0..bc68fd8cdde8352da0cac519637cf2bb77ea6c85 100644 --- a/src/data/backwardsCompatibility/updateSlaveObject.js +++ b/src/data/backwardsCompatibility/updateSlaveObject.js @@ -14,6 +14,12 @@ App.Update.Slave = function(slave, genepool = false) { if (slave.appendages === undefined) { slave.appendages = "none"; } if (slave.wingsShape === undefined) { slave.wingsShape = "none"; } if (slave.appendagesColor === undefined) { slave.appendagesColor = "none"; } + if (slave.hEffect === undefined) { slave.hEffect = "none"; } + if (slave.hEffectColor === undefined) { slave.hEffectColor = "none"; } + if (slave.tailEffect === undefined) { slave.tailEffect = "none"; } + if (slave.tailEffectColor === undefined) { slave.tailEffectColor = "none"; } + if (slave.appendagesEffect === undefined) { slave.appendagesEffect = "none"; } + if (slave.appendagesEffectColor === undefined) { slave.appendagesEffectColor = "none"; } if (slave.prostateImplant !== undefined) { if (slave.prostateImplant === 1) { slave.prostate = 3; @@ -187,6 +193,15 @@ App.Update.Slave = function(slave, genepool = false) { if (slave.hStyle === "Salon") { slave.hStyle = "trimmed"; } + + if (!App.Medicine.Modification.Color.Primary.find(c => c.value === slave.hColor)) { + const colorExtract = (/with (.*?) highlights/g).exec(slave.hColor); + slave.hEffectColor = colorExtract ? colorExtract[1] : "none"; + slave.hEffect = `${slave.hEffectColor} highlights`; + slave.hColor = slave.hColor.replace(/ with.*/g, ""); + } + + if (V.releaseID < 1052) { const prosthetics = slave.readyProsthetics; slave.readyProsthetics = []; diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index d3e87143beb432230929f06a364a740664404ac0..9f34b93fc25ce4064c062fdff531d1e44683d392 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -21,6 +21,13 @@ App.UI.salon = function(slave, cheat = false) { el.append(intro()); } el.append(eyewear()); + if ( + (["leopard", "tiger", "jaguar"].includes(slave.earT) && slave.earTColor !== "hairless") + || ["leopard", "tiger", "jaguar", "gazelle", "tanuki", "raccoon"].includes(slave.tailShape) + || slave.wingsShape === "moth" + ) { + el.append(pattern()); + } el.append(ears()); if (slave.horn !== "none") { el.append(horns()); @@ -30,6 +37,12 @@ App.UI.salon = function(slave, cheat = false) { el.append(nails()); el.append(skin()); el.append(bodyHair()); + if (slave.tail !== "none") { + el.append(tail()); + } + if (slave.appendages !== "none") { + el.append(appendages()); + } return el; } @@ -77,6 +90,15 @@ App.UI.salon = function(slave, cheat = false) { return el; } + function pattern() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Pattern"); + + el.append(App.Medicine.Salon.pattern(slave, cheat)); + + return el; + } + function ears() { const el = new DocumentFragment(); App.UI.DOM.appendNewElement("h3", el, "Ears"); @@ -103,9 +125,64 @@ App.UI.salon = function(slave, cheat = false) { option.addValue("Muffling ear plugs", "muffling ear plugs", billMod); option.addValue("Deafening ear plugs", "deafening ear plugs", billMod); } - el.append(options.render()); - el.append(App.Medicine.Salon.ears(slave, cheat)); + // Top ear Color + if (slave.earT !== "none" && slave.earTColor !== "hairless") { + let title; + let option; + let showChoices = true; + const filtered = App.Medicine.Modification.Color.Primary.filter(c => ![slave.earTColor].includes(c.value)); + + title = `${His} ears are ${slave.earTColor}${slave.earTEffect === "none" ? `.` : ` and have ${slave.earTEffect}.`}`; + App.UI.DOM.appendNewElement("div", el, title); + + if (showChoices) { + if (cheat) { + if (slave.tail !== "none" && (slave.earTColor !== slave.tailColor || slave.earTEffect !== slave.tailEffect)) { + options.addCustomOption("") + .addButton("Match tail", () => { + slave.earTColor = slave.tailColor; + slave.earTEffect = slave.tailEffect; + App.UI.reload(); + }); + } else if (slave.earTColor !== slave.hColor) { + options.addCustomOption("") + .addButton("Match current hair", () =>{ + slave.earTColor = slave.hColor; + App.UI.reload(); + }); + } + } + + if (slave.earTEffect !== "none" || slave.earTEffectColor !== "none") { + options.addCustomOption("") + .addButton("Remove effect", () => { + slave.earTEffect = "none"; + slave.earTEffectColor = "none"; + App.UI.reload(); + }); + } + + option = options.addOption("Fur Color", "earTColor", slave); + for (const color of App.Medicine.Modification.Color.Primary) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect color", "earTEffectColor", slave); + for (const color of filtered) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect", "earTEffect", slave); + for (const color of App.Medicine.Modification.Color.Effect) { + option.addValue(capFirstChar(color.value), `${slave.earTEffectColor} ${color.value}`, billMod); + } + option.pulldown(); + } + } + el.append(options.render()); return el; } @@ -184,16 +261,17 @@ App.UI.salon = function(slave, cheat = false) { let title; let showChoices = true; const hasWig = (slave.bald === 1 && slave.hStyle !== "bald"); + const filtered = App.Medicine.Modification.Color.Primary.filter(c => ![slave.hColor].includes(c.value)); if (slave.bald === 1) { if (slave.hStyle === "bald") { title = `${He} is completely bald.`; showChoices = false; } else { - title = `${His} wig is ${slave.hColor}.`; + title = `${His} wig is ${slave.hColor}${slave.hEffect === "none" ? `` : ` with ${slave.hEffect}`}.`; } } else { - title = `${His} hair is ${slave.hColor}.`; + title = `${His} hair is ${slave.hColor}${slave.hEffect === "none" ? `` : ` with ${slave.hEffect}`}.`; } App.UI.DOM.appendNewElement("div", el, title); @@ -223,6 +301,14 @@ App.UI.salon = function(slave, cheat = false) { }); } // Color + if (slave.hEffectColor !== "none" || slave.hEffect !== "none") { + options.addCustomOption("") + .addButton("Remove effects", () => { + slave.hEffectColor = "none"; + slave.hEffect = "none"; + App.UI.reload(); + }); + } option = options.addOption("Primary color", "hColor", slave); if (slave.origHColor !== slave.hColor) { option.addValue("Restore natural color", slave.origHColor, billMod); @@ -232,9 +318,15 @@ App.UI.salon = function(slave, cheat = false) { } option.pulldown(); - option = options.addOption("Secondary color", "hColor", slave); - for (const color of App.Medicine.Modification.Color.Secondary) { - option.addValue(color.title, (slave.hColor + color.value), billMod); + option = options.addOption("Effect color", "hEffectColor", slave); + for (const color of filtered) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect", "hEffect", slave); + for (const color of App.Medicine.Modification.Color.Effect) { + option.addValue(capFirstChar(color.value), `${slave.hEffectColor} ${color.value}`, billMod); } option.pulldown(); } @@ -520,9 +612,115 @@ App.UI.salon = function(slave, cheat = false) { option.pulldown(); } + el.append(options.render()); + return el; + } + + function tail() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Tail"); + const options = new App.UI.OptionsGroup(); + let title; + let option; + let showChoices = true; + const filtered = App.Medicine.Modification.Color.Primary.filter(c => ![slave.tailColor].includes(c.value)); + + title = `${He} has a tail that is ${slave.tailColor}${slave.tailEffect === "none" ? `` : ` and ${slave.tailEffect}`}.`; + App.UI.DOM.appendNewElement("div", el, title); + + if (showChoices) { + if (cheat) { + if (slave.earT !== "none" && (slave.earTColor !== slave.tailColor || slave.earTEffect !== slave.tailEffect)) { + options.addCustomOption("") + .addButton("Match ears", () => { + slave.tailColor = slave.earTColor; + slave.tailEffect = slave.earTEffect; + App.UI.reload(); + }); + } else if (slave.tailColor !== slave.hColor) { + options.addCustomOption("") + .addButton("Match current hair", () => { + slave.tailColor = slave.hColor; + slave.tailEffect = slave.hEffect; + App.UI.reload(); + }); + } + } + + if (slave.tailEffect !== "none" || slave.tailEffectColor !== "none") { + options.addCustomOption("") + .addButton("Remove effect", () => { + slave.tailEffect = "none"; + slave.tailEffectColor = "none"; + App.UI.reload(); + }); + } + + option = options.addOption("Fur Color", "tailColor", slave); + for (const color of App.Medicine.Modification.Color.Primary) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect color", "tailEffectColor", slave); + for (const color of filtered) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect", "tailEffect", slave); + for (const color of App.Medicine.Modification.Color.Effect) { + option.addValue(capFirstChar(color.value), `${slave.tailEffectColor} ${color.value}`, billMod); + } + option.pulldown(); + } + el.append(options.render()); + + return el; + } + + function appendages() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Appendages"); + const options = new App.UI.OptionsGroup(); + let title; + let option; + let showChoices = true; + const filtered = App.Medicine.Modification.Color.Primary.filter(c => ![slave.appendagesColor].includes(c.value)); + + title = `${He} has ${slave.appendagesColor} appendages${slave.appendagesEffect === "none" ? `` : ` ${slave.appendagesEffect}`}.`; + App.UI.DOM.appendNewElement("div", el, title); + + if (showChoices) { + if (slave.appendagesEffect !== "none" || slave.appendagesEffectColor !== "none") { + options.addCustomOption("") + .addButton("Remove effect", () => { + slave.appendagesEffect = "none"; + slave.appendagesEffectColor = "none"; + App.UI.reload(); + }); + } + + option = options.addOption("Fur Color", "appendagesColor", slave); + for (const color of App.Medicine.Modification.Color.Primary) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect color", "appendagesEffectColor", slave); + for (const color of filtered) { + option.addValue(capFirstChar(color.value), color.value, billMod); + } + option.pulldown(); + + option = options.addOption("Effect", "appendagesEffect", slave); + for (const color of App.Medicine.Modification.Color.Effect) { + option.addValue(capFirstChar(color.value), `${slave.appendagesEffectColor} ${color.value}`, billMod); + } + option.pulldown(); + } el.append(options.render()); - el.append(App.Medicine.Salon.tail(slave, cheat)); return el; } diff --git a/src/js/SlaveState.js b/src/js/SlaveState.js index 1c08c3d68b4baf56db7924a76d04ac1dd2d7715d..8e379561c2a5d6fe63559f50ed1e1505af5578da 100644 --- a/src/js/SlaveState.js +++ b/src/js/SlaveState.js @@ -811,6 +811,10 @@ App.Entity.SlaveState = class SlaveState { /** top ear color * "hairless" */ this.earTColor = "hairless"; + /** top ear effect color */ + this.earTEffectColor = "none"; + /** top ear effect */ + this.earTEffect = "none"; /** sense of smell 0 - yes, -1 - no */ this.smells = 0; @@ -838,6 +842,10 @@ App.Entity.SlaveState = class SlaveState { this.tailShape = "none"; /** tail color */ this.tailColor = "none"; + /** tail effect color */ + this.tailEffectColor = "none"; + /** tail effect */ + this.tailEffect = "none"; /** type of dorsal appendages installed * @type {FC.AppendagesType}*/ this.appendages = "none"; @@ -853,10 +861,26 @@ App.Entity.SlaveState = class SlaveState { this.wingsShape = "none"; /** tail color */ this.appendagesColor = "none"; + /** appendages effect color */ + this.appendagesEffectColor = "none"; + /** appendages effect */ + this.appendagesEffect = "none"; + /** The color of their pattern + * @type {FC.PatternColor} + * applies to: + * @param {FC.PatternedEars} ears + * @param {FC.PatternedTails} tails + * @param {FC.PatternedAppendages} appendages + */ + this.patternColor = "black"; /** slave's original hair color, defaults to their initial hair color. */ this.origHColor = "brown"; /** hair color */ this.hColor = "brown"; + /** hair effect color */ + this.hEffectColor = "none"; + /** hair effect */ + this.hEffect = "none"; /** pubic hair color */ this.pubicHColor = "brown"; /** armpit hair style */ diff --git a/src/js/salon.js b/src/js/salon.js index 820b14c5d09782b88ca3af7f9a49e1e9efc8f5c4..127a647bc8a4ec9c53f620c8f96a8b12698754ea 100644 --- a/src/js/salon.js +++ b/src/js/salon.js @@ -247,183 +247,72 @@ App.Medicine.Modification.eyeSelector = function(entity, cheat = false) { }; /** - * Update ears in salon + * Update patternColor in salon * @param {App.Entity.SlaveState} slave * @param {boolean} [cheat=false] * @returns {HTMLElement} */ -App.Medicine.Salon.ears = function(slave, cheat = false) { - let primaryEarColor = 0; - let secondaryEarColor = ""; - let updatePrimary = (newVal) => { - primaryEarColor = newVal; - apply(); - }; - let updateSecondary = (newVal) => { - secondaryEarColor = newVal; +App.Medicine.Salon.pattern = function(slave, cheat = false) { + let patternColor = 0; + let updatePatternColor = (newVal) => { + patternColor = newVal; apply(); }; const container = document.createElement("div"); - container.append(content()); + container.append(pattern()); return container; - function content() { + function pattern() { const frag = new DocumentFragment(); - if (slave.earT !== "none" && slave.earTColor !== "hairless") { - const {His, his} = getPronouns(slave); - let div; - let p; - frag.append(`${His} fluffy ears are ${slave.earTColor}.`); - - div = document.createElement("div"); - div.classList.add("choices"); - if (slave.earTColor !== slave.hColor) { - div.append( - App.UI.DOM.link( - "Match current hair", - () => { - slave.earTColor = slave.hColor; - App.Events.refreshEventArt(slave); - apply(); - } - ) - ); - div.append(" or "); - App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note"); - } else { - App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} ears:`, "note"); - } - frag.append(div); - - div = document.createElement("div"); - div.classList.add("choices"); - div.append(`Colors:`); - div.append(createList(App.Medicine.Modification.Color.Primary, updatePrimary)); - frag.append(div); - - div = document.createElement("div"); - div.classList.add("choices"); - div.append(`Highlights:`); - div.append(createList(App.Medicine.Modification.Color.Secondary, updateSecondary)); - frag.append(div); - - if (primaryEarColor !== 0) { - p = document.createElement("p"); - p.classList.add("choices"); - p.append( - App.UI.DOM.link( - `Color ${his} ears`, - () => { - slave.earTColor = (primaryEarColor + secondaryEarColor); - if (!cheat) { - cashX(forceNeg(V.modCost), "slaveMod", slave); - } - App.UI.reload(); - } - ) - ); - p.append(` ${primaryEarColor}${secondaryEarColor} now?`); - frag.append(p); - } - } - return frag; - } - - function createList(array, method) { - const links = []; - for (const item of array) { - const title = item.title || capFirstChar(item.value); - links.push( - App.UI.DOM.link( - title, - () => method(item.value) - ) - ); - } - return App.UI.DOM.generateLinksStrip(links); - } - - function apply() { - App.Events.refreshEventArt(slave); - jQuery(container).empty().append(content()); - } -}; + const {His, his} = getPronouns(slave); + let div; + let p; + frag.append(`${His} pattern color is ${slave.patternColor}.`); -/** - * Update hair in salon - * @param {App.Entity.SlaveState} slave - * @param {boolean} [cheat] - * @returns {HTMLElement} - */ -App.Medicine.Salon.tail = function(slave, cheat = false) { - const container = document.createElement("div"); - let primaryTailColor = 0; - let secondaryTailColor = ""; - let updatePrimary = (newVal) => { - primaryTailColor = newVal.value; - apply(); - }; - let updateSecondary = (newVal) => { - secondaryTailColor = newVal.value; - apply(); - }; - const {His, his} = getPronouns(slave); - - if (slave.tail !== "none") { - container.append(tailDye()); - } - - return container; - - function tailDye() { - const frag = new DocumentFragment(); - let r = []; - frag.append(`${His} tail is ${slave.tailColor}.`); - - if (slave.origHColor !== slave.hColor) { - r.push( + div = document.createElement("div"); + div.classList.add("choices"); + if (slave.patternColor !== "black") { + div.append( App.UI.DOM.link( - "Match current hair", + "Return them to their natural color", () => { - slave.tailColor = slave.hColor; - if (!cheat) { - cashX(forceNeg(V.modCost), "slaveMod", slave); - } - App.UI.reload(); + slave.patternColor = "black"; + App.Events.refreshEventArt(slave); + apply(); } - ), - "or", - App.UI.DOM.makeElement("span", "choose a new one: ", "note") + ) ); + div.append(" or "); + App.UI.DOM.appendNewElement("span", div, "choose a new one: ", "note"); } else { - r.push(App.UI.DOM.makeElement("span", `Choose a dye color before dyeing ${his} tail:`, "note")); + App.UI.DOM.appendNewElement("span", div, `Choose a dye color before dyeing ${his} pattern:`, "note"); } - App.Events.addNode(frag, r, "div", "choices"); - - App.Events.addNode(frag, [ - `Colors:`, - createList(App.Medicine.Modification.Color.Primary, updatePrimary) - ], "div", "choices"); - - App.Events.addNode(frag, [ - `Highlights:`, - createList(App.Medicine.Modification.Color.Secondary, updateSecondary) - ], "div", "choices"); + frag.append(div); - if (primaryTailColor !== 0) { - App.Events.addNode(frag, [ + div = document.createElement("div"); + div.classList.add("choices"); + div.append(`Colors:`); + div.append(createList(App.Medicine.Modification.Color.Pattern, updatePatternColor)); + frag.append(div); + + if (patternColor !== 0) { + p = document.createElement("p"); + p.classList.add("choices"); + p.append( App.UI.DOM.link( - `Color ${his} tail`, + `Color ${his} pattern`, () => { - slave.tailColor = (primaryTailColor + secondaryTailColor); + // @ts-ignore + slave.patternColor = (patternColor); if (!cheat) { cashX(forceNeg(V.modCost), "slaveMod", slave); } - App.UI.reload(); // discard selections after locking them in. + App.UI.reload(); } - ), - `${primaryTailColor}${secondaryTailColor} now?` - ], "p", "choices"); + ) + ); + p.append(` ${patternColor} now?`); + frag.append(p); } return frag; } @@ -431,16 +320,11 @@ App.Medicine.Salon.tail = function(slave, cheat = false) { function createList(array, method) { const links = []; for (const item of array) { - if (item.hasOwnProperty("requirements")) { - if (item.requirements(slave) === false) { - continue; - } - } const title = item.title || capFirstChar(item.value); links.push( App.UI.DOM.link( title, - () => method(item) + () => method(item.value) ) ); } @@ -449,6 +333,7 @@ App.Medicine.Salon.tail = function(slave, cheat = false) { function apply() { App.Events.refreshEventArt(slave); - jQuery(container).empty().append(tailDye()); + jQuery(container).empty().append(pattern()); } }; + diff --git a/src/npc/descriptions/butt/butt.js b/src/npc/descriptions/butt/butt.js index 5590783afb0825063575f8de5979305b650f83c9..c6b52a954d4dde578852248a0e938db06687892d 100644 --- a/src/npc/descriptions/butt/butt.js +++ b/src/npc/descriptions/butt/butt.js @@ -1266,63 +1266,63 @@ App.Desc.butt = function(slave, descType = DescType.NORMAL) { } if (slave.tailShape === "cat") { - r.push(`${He} has a long, slender, ${slave.tailColor} ${App.Utils.translate("cat")} tail which tends to sway side to side when ${he} is focused on a task.`); + r.push(`${He} has a long and slender, ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("cat")} tail` : `${slave.tailColor} colored ${App.Utils.translate("cat")} tail with ${slave.tailEffect},`} that tends to sway side to side when ${he} is focused on a task.`); } else if (slave.tailShape === "leopard") { - r.push(`${He} has a long, white-tipped, ${slave.tailColor} leopard tail. It's white underneath and covered in black spots that form incomplete bands toward the tail's end. The tail tends to sway side to side when ${he} is focused on a task.`); + r.push(`${He} has a long, white-tipped and ${slave.tailEffect === "none" ? `${slave.tailColor} leopard tail` : `${slave.tailColor} colored leopard tail with ${slave.tailEffect}`}. It's white underneath and covered in ${slave.patternColor} spots that form incomplete bands toward the tails end. The tail tends to sway side to side when ${he} is focused on a task.`); } else if (slave.tailShape === "tiger") { - r.push(`${He} has a long ${slave.tailColor} tiger tail, that's about half the length of ${his} body and covered in distinct vertical stripes unique to ${him}. The tail tends to sway side to side when ${he} is focused on a task.`); + r.push(`${He} has a long ${slave.tailEffect === "none" ? `${slave.tailColor} tiger tail` : `${slave.tailColor} colored tiger tail with ${slave.tailEffect}`}, that's about half the length of ${his} body and covered in distinct ${slave.patternColor} vertical stripes. The tail tends to sway side to side when ${he} is focused on a task.`); } else if (slave.tailShape === "jaguar") { - r.push(`${He} has a long, black-tipped, ${slave.tailColor} jaguar tail covered in black rosettes with central dots. ${He} tends to sway it from side to side when ${he} is focused on a task.`); + r.push(`${He} has a long, black-tipped and ${slave.tailEffect === "none" ? `${slave.tailColor} jaguar tail` : `${slave.tailColor} colored jaguar tail with ${slave.tailEffect}, that's`} covered in ${slave.patternColor} rosettes. ${He} tends to sway it from side to side when ${he} is focused on a task.`); } else if (slave.tailShape === "lion") { - r.push(`${He} has a long ${slave.tailColor} lion tail that ends in a ${slave.hColor} tuft of hair. It can be seen swaying from side to side when ${he} is focusing on a task.`); + r.push(`${He} has a long ${slave.tailEffect === "none" ? `${slave.tailColor} lion tail that ends` : `${slave.tailColor} colored lion tail with ${slave.tailEffect}, ending`} in a ${slave.hColor} tuft of hair. It can be seen swaying from side to side when ${he} is focusing on a task.`); } else if (slave.tailShape === "dog") { - r.push(`${He} has a bushy, ${slave.tailColor} ${App.Utils.translate("dog")} tail which tends to wag energetically when ${he} gets exited.`); + r.push(`${He} has a bushy, ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("dog")} tail` : `${slave.tailColor} colored ${App.Utils.translate("dog")} tail with ${slave.tailEffect}`}. ${He} tends to wag it energetically when ${he} gets exited.`); } else if (slave.tailShape === "wolf") { - r.push(`${He} has a long and fluffy wolf tail, that's covered in dense ${slave.tailColor} fur. It tends to wag energetically when ${he} gets exited.`); + r.push(`${He} has a long and fluffy wolf tail, that's covered in dense ${slave.tailEffect === "none" ? `${slave.tailColor} fur` : `${slave.tailColor} colored fur with ${slave.tailEffect}`}. It tends to wag energetically when ${he} gets exited.`); } else if (slave.tailShape === "jackal") { - r.push(`${He} has a bushy and black-tipped, ${slave.tailColor} jackal tail which tends to wag energetically when ${he} gets exited.`); + r.push(`${He} has a bushy, black-tipped and ${slave.tailEffect === "none" ? `${slave.tailColor} jackal tail` : `${slave.tailColor} colored jackal tail with ${slave.tailEffect}`}. It tends to wag energetically when ${he} gets exited.`); } else if (slave.tailShape === "fox") { - r.push(`${He} has a soft, fluffy, ${slave.tailColor} ${App.Utils.translate("fox")} tail.`); + r.push(`${He} has a soft and fluffy, ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("fox")} tail` : `${slave.tailColor} colored ${App.Utils.translate("fox")} tail with ${slave.tailEffect}`}.`); } else if (slave.tailShape === "kitsune") { - r.push(`${He} has nine incredibly soft, fluffy, ${slave.tailColor} ${App.Utils.translate("fox")} tails; they feel heavenly to the touch.`); + r.push(`${He} has nine incredibly soft and fluffy, ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("fox")} tails` : `${slave.tailColor} colored ${App.Utils.translate("fox")} tails with ${slave.tailEffect}`}; they feel heavenly to the touch.`); } else if (slave.tailShape === "tanuki") { - r.push(`${He} has a long, fluffy, ${slave.tailColor} tanuki tail with a dark stripe running down the middle.`); + r.push(`${He} has a long and fluffy, ${slave.tailEffect === "none" ? `${slave.tailColor} tanuki tail with` : `${slave.tailColor} colored tanuki tail with ${slave.tailEffect} and`} a ${slave.patternColor} stripe running down the middle.`); } else if (slave.tailShape === "raccoon") { - r.push(`${He} has a long, fluffy, ${slave.tailColor} raccoon tail with a dark rings running along its length.`); + r.push(`${He} has a long and fluffy, ${slave.tailEffect === "none" ? `${slave.tailColor} raccoon tail with` : `${slave.tailColor} colored raccoon tail with ${slave.tailEffect} and`} ${slave.patternColor} rings running along its length.`); } else if (slave.tailShape === "rabbit") { - r.push(`${He} has a short and fluffy ${slave.tailColor} ${App.Utils.translate("rabbit")} tail.`); + r.push(`${He} has a short and fluffy, ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("rabbit")} tail` : `${slave.tailColor} colored ${App.Utils.translate("rabbit")} tail with ${slave.tailEffect}`}.`); } else if (slave.tailShape === "squirrel") { - r.push(`${He} has a big and bushy ${slave.tailColor} ${App.Utils.translate("squirrel")} tail.`); + r.push(`${He} has a big and bushy, ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("squirrel")} tail` : `${slave.tailColor} colored ${App.Utils.translate("squirrel")} tail with ${slave.tailEffect}`}.`); } else if (slave.tailShape === "horse") { - r.push(`${He} has a long ${App.Utils.translate("horse")} tail consisting of ${slave.tailColor} hair.`); + r.push(`${He} has a long ${App.Utils.translate("horse")} tail consisting of ${slave.hColor} hair.`); } else if (slave.tailShape === "bird") { - r.push(`${He} has a bundle of soft, ${slave.tailColor} tail feathers. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); + r.push(`${He} has a bundle of soft, ${slave.tailEffect === "none" ? `${slave.tailColor} tail feathers` : `${slave.tailColor} colored tail feathers with ${slave.tailEffect}`}. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); } else if (slave.tailShape === "phoenix") { - r.push(`${He} has a bundle of magnificent, ${slave.tailColor} tail feathers that give off a luminescent glow when in the dark. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); + r.push(`${He} has a bundle of magnificent, ${slave.tailEffect === "none" ? `${slave.tailColor} tail feathers that` : `${slave.tailColor} colored tail feathers with ${slave.tailEffect}. They`} give off a luminescent glow when in the dark. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); } else if (slave.tailShape === "peacock") { - r.push(`${He} has a bundle of ${slave.tailColor} peacock tail feathers; ${his} tail can fan out to proudly display ${his} pretty feathers.`); + r.push(`${He} has a bundle of iridescent, ${slave.tailEffect === "none" ? `${slave.tailColor} peacock tail feathers` : `${slave.tailColor} colored peacock tail feathers with ${slave.tailEffect}`}; ${his} tail can fan out to proudly display ${his} pretty feathers.`); } else if (slave.tailShape === "raven") { - r.push(`${He} has a bundle of ${slave.tailColor} raven tail feathers. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); + r.push(`${He} has a bundle of ${slave.tailEffect === "none" ? `${slave.tailColor} raven tail feathers` : `${slave.tailColor} colored raven tail feathers with ${slave.tailEffect}`}. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); } else if (slave.tailShape === "swan") { - r.push(`${He} has a small bundle of short ${slave.tailColor} swan tail feathers that have a slight upwards curve to them. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); + r.push(`${He} has a small bundle of short ${slave.tailEffect === "none" ? `${slave.tailColor} swan tail feathers that` : `${slave.tailColor} colored swan tail feathers with ${slave.tailEffect}, they`} have a slight upwards curve to them. The tail is graduated, meaning that the feathers are longest in the middle and decrease in length the further away they go from the middle.`); } else if (slave.tailShape === "sheep") { - r.push(`${He} has a short and soft ${slave.tailColor} sheep tail.`); + r.push(`${He} has a short and soft ${slave.tailEffect === "none" ? `${slave.tailColor} sheep tail` : `${slave.tailColor} colored sheep tail with ${slave.tailEffect}`}.`); } else if (slave.tailShape === "cow") { - r.push(`${He} has a long ${slave.tailColor} ${App.Utils.translate("cow")} tail with a small tuft of ${slave.hColor} hair at its end; ${he} tends to swat at things absentmindedly.`); + r.push(`${He} has a long ${slave.tailEffect === "none" ? `${slave.tailColor} ${App.Utils.translate("cow")} tail with` : `${slave.tailColor} colored ${App.Utils.translate("cow")} tail with ${slave.tailEffect} and`} a small tuft of ${slave.hColor} hair at its end; ${he} tends to swat at things absentmindedly.`); } else if (slave.tailShape === "gazelle") { - r.push(`${He} has a short, silky ${slave.tailColor} gazelle tail with a dark stripe running down its middle.`); + r.push(`${He} has a short and silky, ${slave.tailEffect === "none" ? `${slave.tailColor} gazelle tail with` : `${slave.tailColor} colored gazelle tail with ${slave.tailEffect} and`} a ${slave.patternColor} stripe running down its middle.`); } else if (slave.tailShape === "deer") { - r.push(`${He} has a short and soft ${slave.tailColor} deer tail that tends to wiggle when ${he} gets exited.`); + r.push(`${He} has a short and soft, ${slave.tailEffect === "none" ? `${slave.tailColor} deer tail` : `${slave.tailColor} colored deer tail with ${slave.tailEffect},`} that tends to wiggle when ${he} gets exited.`); } else if (slave.tailShape === "succubus") { - r.push(`${He} has a long, slim succubus tail; ${his} tail ends in a soft ${slave.tailColor} heart shape.`); + r.push(`${He} has a long and slim, ${slave.skin} succubus tail; the tail ends in a soft ${slave.tailEffect === "none" ? `${slave.tailColor} heart shape` : `${slave.tailColor} colored heart shape with ${slave.tailEffect}`}.`); } else if (slave.tailShape === "dragon") { - r.push(`${He} has a long and thick draconic tail; ${his} tail is covered in ${slave.tailColor} scales.`); + r.push(`${He} has a long and thick draconic tail; the tail is covered in ${slave.tailEffect === "none" ? `${slave.tailColor} scales` : `${slave.tailColor} colored scales with ${slave.tailEffect}`}.`); } else if (slave.tail === "stinger") { - r.push(`${He} has a long, segmented ${slave.tailColor} colored scorpion tail made of advanced synthetic alloys. The tail ends in a sharp stinger that can fire projectiles. Its projectiles can kill or incapacitate.`); + r.push(`${He} has a long and segmented, ${slave.tailEffect === "none" ? `${slave.tailColor} scorpion tail` : `${slave.tailColor} colored scorpion tail with ${slave.tailEffect}`} made of advanced synthetic alloys. The tail ends in a sharp stinger that can fire projectiles. Its projectiles can kill or incapacitate.`); } else if (slave.tail === "combat") { - r.push(`${He} has a very long ${slave.tailColor} metallic tail that can lash out, constrict, and deploy razor sharp spikes on command.`); + r.push(`${He} has a very long, ${slave.tailEffect === "none" ? `${slave.tailColor} metallic tail that` : `${slave.tailColor} colored metallic tail with ${slave.tailEffect}. It`} can lash out, constrict, and deploy razor sharp spikes on command.`); } else if (slave.tail === "sex") { - r.push(`${He} has a long, slender, ${slave.tailColor} tail. While not strong, it is very dexterous and has a small fleshy spade-shaped tip that can vibrate and dispense lube on command.`); + r.push(`${He} has a long and slender, ${slave.tailEffect === "none" ? `${slave.tailColor} tail` : `${slave.tailColor} colored colored tail with ${slave.tailEffect}`}. While not strong, it is very dexterous and has a small fleshy spade-shaped tip that can vibrate and dispense lube on command.`); } r.push(App.Desc.mods(slave, "buttock")); diff --git a/src/npc/descriptions/ears.js b/src/npc/descriptions/ears.js index 7445ae512565ffeb4d646b7ecabe074f476c6314..4f1e81a58f92c22c5229d4267af3f12056296349 100644 --- a/src/npc/descriptions/ears.js +++ b/src/npc/descriptions/ears.js @@ -55,7 +55,12 @@ App.Desc.ears = function(slave) { } if (slave.earT === "cat") { - r.push(`${He} has cute, ${slave.earTColor} ${App.Utils.translate("cat")} ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of cute,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("cat")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("cat")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 20) { @@ -66,7 +71,16 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "leopard") { - r.push(`${He} has cute leopard ears, they are ${slave.earTColor === "hairless" ? `hairless.` : `covered in soft ${slave.earTColor} fur and have black leopard spots`}; they`); + r.push(`On top of ${his} head ${he} has a pair of cute leopard ears. the ears are`); + if (slave.earTColor === "hairless") { + r.push(`hairless.`); + } else { + r.push(`covered in soft, ${slave.earTColor} colored fur that has`); + if (slave.earTEffect !== "none") { + r.push(`${slave.earTEffect} and`); + } + r.push(`${slave.patternColor} leopard spots; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 20) { @@ -77,7 +91,16 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "tiger") { - r.push(`${He} has pretty tiger ears on top of ${his} head; the ears are ${slave.earTColor === "hairless" ? "hairless but" : `covered in dense ${slave.earTColor} fur and`} have distinct vertical stripes unique to ${him}. They`); + r.push(`On top of ${his} head ${he} has a pair of pretty tiger ears; the ears are`); + if (slave.earTColor === "hairless") { + r.push(`hairless but`); + } else { + r.push(`covered in dense, ${slave.earTColor} colored fur that has`); + if (slave.earTEffect !== "none") { + r.push(`${slave.earTEffect} and`); + } + r.push(`distinct ${slave.patternColor} vertical stripes. They`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 20) { @@ -88,7 +111,16 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "jaguar") { - r.push(`${He} has adorable jaguar ears on top of ${his} head; the ears are ${slave.earTColor === "hairless" ? `hairless` : `covered in ${slave.earTColor} fur and packed with black rosettes with central dots`}. They`); + r.push(`On top of ${his} head ${he} has a pair of adorable jaguar ears; they are`); + if (slave.earTColor === "hairless") { + r.push(`hairless`); + } else { + r.push(`covered in ${slave.earTColor} colored fur that`); + if (slave.earTEffect !== "none") { + r.push(`has ${slave.earTEffect} and`); + } + r.push(`is packed with ${slave.patternColor} rosettes that have dots in their center. They`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 20) { @@ -99,7 +131,16 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "lion") { - r.push(`${He} has charming lion ears on ${his} head; the ears are ${slave.earTColor === "hairless" ? `hairless` : `covered in ${slave.earTColor} fur and have tufts of ${slave.hColor} fur at their base`}. They`); + r.push(`On top of ${his} head ${he} has a pair of charming lion ears; they are`); + if (slave.earTColor === "hairless") { + r.push(`hairless.`); + } else { + r.push(`covered in ${slave.earTColor} colored fur.`); + if (slave.earTEffect !== "none") { + r.push(`that has ${slave.earTEffect}.`); + } + r.push(`The ears have tufts of ${slave.hColor} hair sprouting from their base and`) + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 20) { @@ -110,7 +151,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "dog") { - r.push(`${He} has cute, ${slave.earTColor} ${App.Utils.translate("dog")} ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of cute,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("dog")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("dog")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -121,7 +167,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "wolf") { - r.push(`${He} has lovable, small and triangular ${slave.earTColor} wolf ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of lovable, small and triangular`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored wolf ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} wolf ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -132,7 +183,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "jackal") { - r.push(`${He} has long and pointy ${slave.earTColor} jackal ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of long and pointy,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored jackal ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} jackal ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -143,7 +199,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "fox") { - r.push(`${He} has elegant, ${slave.earTColor} ${App.Utils.translate("fox")} ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of elegant,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("fox")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("fox")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -154,7 +215,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "raccoon") { - r.push(`${He} has adorable, ${slave.earTColor}, round ${App.Utils.translate("raccoon")} ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of adorable and round,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("raccoon")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("raccoon")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -165,7 +231,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "rabbit") { - r.push(`${He} has long, ${slave.earTColor}, fluffy ${App.Utils.translate("rabbit")} ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of long and fluffy,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("rabbit")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("rabbit")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -175,8 +246,13 @@ App.Desc.ears = function(slave) { } } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); - } else if (slave.earT === "squirrel") { - r.push(`${He} has small and pointy ${slave.earTColor} ${App.Utils.translate("squirrel")} ears on ${his} head; they`); + }else if (slave.earT === "squirrel") { + r.push(`On top of ${his} head ${he} has a pair of small and pointy,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("squirrel")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("squirrel")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -187,7 +263,12 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "horse") { - r.push(`${He} has long, ${slave.earTColor} ${App.Utils.translate("horse")} ears on ${his} head; they`); + r.push(`On top of ${his} head ${he} has a pair of long,`); + if (slave.earTColor !== "hairless" && slave.earTEffect !== "none") { + r.push(`${slave.earTColor} colored ${App.Utils.translate("horse")} ears that have ${slave.earTEffect} on them; they`); + } else { + r.push(`${slave.earTColor} ${App.Utils.translate("horse")} ears; they`); + } if (slave.earImplant === 1) { r.push(`perk up at`); if (slave.devotion > 50) { @@ -198,7 +279,7 @@ App.Desc.ears = function(slave) { } r.push(`${either(`tend to droop when ${he} is relaxed or sad`, `twitch at the slightest touch`)}.`); } else if (slave.earT === "normal") { - r.push(`${He} has`); + r.push(`On top of ${his} head ${he} has`); if (slave.earShape !== "none") { r.push(`a second set`); } else { diff --git a/src/npc/descriptions/style/hair.js b/src/npc/descriptions/style/hair.js index 612804037bf14d9392358a8c594f1b715d0e55ac..4415fedbc135ce89d403837c68bd5e0fd5fedc49 100644 --- a/src/npc/descriptions/style/hair.js +++ b/src/npc/descriptions/style/hair.js @@ -20,13 +20,13 @@ App.Desc.hair = function(slave) { r.push(`hair has been shaved. If ${his} hair were visible, it would be ${slave.hColor}.`); break; case "buzzcut": - r.push(`${slave.hColor} hair is in a short buzzcut.`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is in a short buzzcut.`); break; case "trimmed": - r.push(`${slave.hColor} hair is trimmed short.`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is trimmed short.`); break; case "afro": - r.push(`${slave.hColor} hair is in a`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is in a`); if (slave.hLength > 100) { r.push(`gigantic puffed-up afro and looks ridiculous.`); } else if (slave.hLength > 30) { @@ -36,7 +36,7 @@ App.Desc.hair = function(slave) { } break; case "cornrows": - r.push(`${slave.hColor} hair is formed tightly into cornrows in a decorative pattern on ${his} head, dangling`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is formed tightly into cornrows in a decorative pattern on ${his} head, dangling`); if (slave.hLength >= 150) { r.push(`down calf-length,`); } else if (slave.hLength >= 100) { @@ -51,7 +51,7 @@ App.Desc.hair = function(slave) { r.push(`with colorful beads interspersed in them.`); break; case "bun": - r.push(`${slave.hColor} hair is`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is`); if (slave.hLength >= 100) { r.push(`packed tightly into a huge puffy`); } else if (slave.hLength >= 30) { @@ -64,7 +64,7 @@ App.Desc.hair = function(slave) { r.push(`bun.`); break; case "messy bun": - r.push(`${slave.hColor} hair is`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is`); if (slave.hLength >= 100) { r.push(`packed tightly into a huge messy`); } else if (slave.hLength >= 30) { @@ -107,11 +107,11 @@ App.Desc.hair = function(slave) { } else { r.push(`short,`); } - r.push(`${slave.hColor} hair`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : ` that has ${slave.hEffect} to it,`}`); r.push(App.Desc.hairClothing(slave)); break; default: - r.push(`${slave.hColor} hair is ${slave.hStyle} and`); + r.push(`${slave.hColor} hair${slave.hEffect === "none" ? `` : `, that is stylized with ${slave.hEffect},`} is ${slave.hStyle} and`); if (hairLength > 0.9) { r.push(`floor-length.`); } else if (hairLength > 0.8) { diff --git a/src/npc/descriptions/upperBack.js b/src/npc/descriptions/upperBack.js index 9301bdb8e875bc3ed37f2b8649d87f61e459ec47..50a801f8f78857aec6912af0c56fc9dee41ab7f5 100644 --- a/src/npc/descriptions/upperBack.js +++ b/src/npc/descriptions/upperBack.js @@ -9,40 +9,40 @@ App.Desc.upperBack = function(slave) { } = getPronouns(slave); - r.push(`On ${his} back, `); + r.push(`On ${his} back,`); if (slave.wingsShape === "angel") { - r.push(`${he} has a pair of ${slave.appendagesColor} angelic wings that give ${him} a noble appearance.`); + r.push(`${he} has a pair of ${slave.appendagesColor} angelic wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. They give ${him} a noble appearance.`); } else if (slave.wingsShape === "seraph") { - r.push(`${he} has three pairs of majestic-looking ${slave.appendagesColor} angel wings that move simultaneously.`); + r.push(`${he} has three pairs of majestic-looking, ${slave.appendagesColor} angel wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`} and can move simultaneously.`); } else if (slave.wingsShape === "demon") { - r.push(`${he} has a pair of sleek and sexy ${slave.appendagesColor} demonic wings that ${he} tends to wrap around ${him}self when ${he}'s being flirty.`); + r.push(`${he} has a pair of sleek and sexy, ${slave.appendagesColor} demonic wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. ${He} tends to wrap them around ${him}self when ${he}'s being flirty.`); } else if (slave.wingsShape === "dragon") { - r.push(`${he} has a pair of imposing ${slave.appendagesColor} draconic wings that tend to create a small breeze when ${he} flaps them.`); + r.push(`${he} has a pair of imposing, ${slave.appendagesColor} draconic wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}; they tend to create a small breeze when ${he} flaps them.`); } else if (slave.wingsShape === "phoenix") { - r.push(`${he} has a pair of magnificent, ${slave.appendagesColor} phoenix wings that give off a luminescent glow when shrouded in darkness.`); + r.push(`${he} has a pair of magnificent, ${slave.appendagesColor} phoenix wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}; they give off a luminescent glow when shrouded in darkness.`); } else if (slave.wingsShape === "bird") { - r.push(`${he} has a pair of soft ${slave.appendagesColor} feathered wings.`); + r.push(`${he} has a pair of soft ${slave.appendagesColor} feathered wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}.`); } else if (slave.wingsShape === "fairy") { - r.push(`${he} has a pair of dainty, translucent fairy wings that are shaped like leaves and tend to flutter when ${he}'s excited.`); + r.push(`${he} has a pair of dainty and translucent, ${slave.appendagesColor} fairy wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. They are shaped like leaves and tend to flutter when ${he}'s excited.`); } else if (slave.wingsShape === "butterfly") { - r.push(`${he} has a pair of big and broad butterfly wings that have ${slave.appendagesColor} colored patterns. ${His} wings tend to flutter when excited.`); + r.push(`${he} has a pair of big and broad, ${slave.appendagesColor} butterfly wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect}`} and have iridescent patterns on them. ${His} wings tend to flutter when excited.`); } else if (slave.wingsShape === "moth") { - r.push(`${he} has a pair of big, soft moth wings that have ${slave.appendagesColor} colored patterns. ${His} wings tend to flutter when excited.`); + r.push(`${he} has a pair of big and soft, ${slave.appendagesColor} moth wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect}`} and have distinct ${slave.patternColor} patterns on them. ${His} wings tend to flutter when excited.`); } else if (slave.wingsShape === "insect") { - r.push(`${he} has a pair of delicate transparent insect wings that tend to flutter when ${he}'s excited.`); + r.push(`${he} has a pair of delicate, transparent insect wings that tend to flutter when ${he}'s excited.`); } else if (slave.wingsShape === "evil") { - r.push(`${he} has a pair of ${slave.appendagesColor} fiendish wings that have a sinister look to them.`); + r.push(`${he} has a pair of ${slave.appendagesColor} fiendish-looking wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. They have a sinister and unsettling look to them.`); } else if (slave.appendages === "falcon") { - r.push(`${he} has a pair of large ${slave.appendagesColor} wings made of advanced synthetic alloys. The wings enable fast aerial movement, swiping at targets with its razor sharp edges and can be used to block projectiles.`); + r.push(`${he} has a pair of large, ${slave.appendagesColor} wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. They're made of advanced synthetic alloys. The wings enable fast aerial movement, swiping at targets with its razor sharp edges and can be used to block projectiles.`); } else if (slave.appendages === "arachnid") { r.push(`${he} has a set of eight ${slave.appendagesColor} deadly spider legs. The legs are made of an advanced synthetic alloy. Being extremely durable in addition to very light, allows extension to thrice their original length. An built-in AI helps with combat, 3-dimensional maneuvering and appendage coordination.`); } else if (slave.appendages === "kraken") { - r.push(`${he} has a set of eight ${slave.appendagesColor} tentacles. The tentacles are made of an advanced synthetic alloy. Being extremely durable in addition to very light, allows the tentacles to extend to thrice their original length. An built-in AI helps with combat, 3-dimensional maneuvering and appendage coordination.`); + r.push(`${he} has a set of eight, ${slave.appendagesColor} tentacles${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. The tentacles are made of an advanced synthetic alloy. Being extremely durable in addition to very light, allows the tentacles to extend to thrice their original length. An built-in AI helps with combat, 3-dimensional maneuvering and appendage coordination.`); } else if (slave.appendages === "sex") { - r.push(`${he} has a set of eight ${slave.appendagesColor} pleasure appendages. The lithe appendages all have different shaped tips with vibration and lube dispensation built-in.`); + r.push(`${he} has a set of eight, ${slave.appendagesColor} pleasure appendages${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. The lithe appendages all have different shaped tips with vibration and lube dispensation built-in.`); } else if (slave.appendages === "flight") { - r.push(`${he} has a pair of large ${slave.appendagesColor} metallic wings. Its durable frame, made of advanced materials, is sufficiently lightweight to allow its small thrusters to support flight while being strong enough to sustain structural integrity.`); + r.push(`${he} has a pair of large, ${slave.appendagesColor} metallic wings${slave.appendagesEffect === "none" ? `` : ` that have ${slave.appendagesEffect} on them`}. Its durable frame, made of advanced materials, is sufficiently lightweight to allow its small thrusters to support flight while being strong enough to sustain structural integrity.`); } if (slave.PBack === 0 && slave.wingsShape !== "none"){