diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js new file mode 100644 index 0000000000000000000000000000000000000000..4975c4009184b594cf92850a2ac77179c4b3ac01 --- /dev/null +++ b/src/facilities/bodyModification/bodyModification.js @@ -0,0 +1,867 @@ +/** + * + * @param {App.Entity.SlaveState} slave + * @param {boolean} cheat + */ +App.UI.bodyModification = function(slave, cheat = false) { + const container = document.createElement("span"); + container.id = "body-modification"; + const { + He, His, + he, his, him, himself + } = getPronouns(slave); + Enunciate(slave); + let piercingLevel; + let modReaction; + let scarApplied; + let tattooChoice; + + container.append(createPage()); + return container; + + function createPage() { + const el = new DocumentFragment(); + if (V.seeImages > 0) { + App.Events.drawEventArt(el, slave); + } + el.append(intro()); + if (!cheat) { + el.append(reaction()); + } + el.append(piercings()); + el.append(tattoos()); + el.append(branding()); + el.append(scar()); + return el; + } + + function intro() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h1", el, "Body Modification Studio"); + App.UI.DOM.appendNewElement("div", el, `${SlaveFullName(slave)} is lying strapped down on the table in your body modification studio. ${He} is entirely at your mercy.`); + return el; + } + + function reaction() { + const el = new DocumentFragment(); + let r = []; + if (V.brandApplied || V.degradation || scarApplied || modReaction) { + if (slave.fuckdoll === 0) { + if (canSee(slave)) { + r.push(`There's a mirror on the ceiling, so ${he} can see`); + } else { + r.push(`${He} can't see, so `); + if (canHear(slave)) { + r.push(`you're careful to describe`); + } else { + r.push(`${he} must, by ${himself}, get a feel for`); + } + } + r.push(`${his} new appearance.`); + } + if (V.brandApplied) { + r.push(`The smell of burnt flesh hangs in the air. Being branded <span class="health.dec">has hurt ${his} health a little.</span>`); + healthDamage(slave, 10); + V.brandApplied = 0; + } + if (scarApplied) { + if (V.scarTarget.local === "entire body") { + switch (V.scarDesign.local) { + case "burn": + r.push(`Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the skin with an open flame.`); + break; + case "surgical": + if (V.PC.skill.medicine >= 100) { + r.push(`Your medical mastery is perfect, so creating Frankenstein's monster was a deliberate work of art.`); + } else if (V.PC.skill.medicine > 0) { + r.push(`Your medical skills are progressing, and the Frankenstein effect reminds you of your earliest attempts.`); + } else { + r.push(`You really slashed away with your knife, but were careful not to allow ${him} to bleed out.`); + } + break; + default: + r.push(`The best way to apply scarring to the entire body is with a good old fashioned whip. ${His} body is a mess of crisscrossed lines`); + if (hasAnyNaturalLimbs(slave)) { + r.push(`, and ${his} `); + if (getLimbCount(slave, piercingLevel) > 1) { + r.push(`limbs twisted so violently in their restraints that they too have`); + } else { + r.push(`only limb twists so violently in its restraints that it too has`); + } + r.push(` become scarred`); + } + r.push(r.pop() + "."); + } + r.push(`No matter how you chose to apply it, scarring so much of ${his} body has <span class="health.dec"> hurt ${his} health.</span>`); + healthDamage(slave, 20); + } else { + if (slave.scar[V.scarTarget.local][V.scarDesign.local] > 0) { + r.push(`This is not the first time ${he} was scarred like this.`); + } + switch (V.scarDesign.local) { + case "whip": + r.push(`Targeting a single area with a whip is not easy. You set the mood by carefully arranging candles dripping on to a whimpering ${slave.slaveName}, then got ${his} attention with a quick`); + if (canSee(slave)) { + r.push(`wave`); + } else if (canHear(slave)) { + r.push(`crack`); + } else { + r.push(`tap`); + } + r.push(`of the whip. One by one, you carefully snuffed out the candles, flicking hot wax as you went. After pausing a moment, you prepared to leave your mark.`); + if (["penis", "vagina"].includes(V.scarTarget.local)) { + if (slave.dick > 4 && V.seeDicks) { + r.push(`${His} dick was large enough that it was not too difficult to hit,`); + } else if (slave.dick > 0 && V.seeDicks) { + r.push(`${His} dick was a challengingly small target,`); + } else { + if (slave.clit > 0) { + r.push(`${His} clit was a difficult target,`); + } else { + r.push(`${His} clit was an impossibly tiny target,`); + } + } + r.push(`but the end was never in doubt. The tip connected with ${his} most intimate place on the first try, and plunged ${him} into absolute agony.`); + } else { + r.push(`The end was never in doubt. A few strokes of the whip plunged ${him} into agony ${his} body will not allow ${him} to forget.`); + } + break; + case "burn": + r.push(`Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the ${slave.skin} skin of ${his} ${V.scarTarget.local} with an open flame.`); + break; + case "surgical": + if (V.PC.skill.medicine >= 100) { + r.push(`Your medical mastery is perfect, so creating such a scar was a deliberate act of degradation.`); + } else if (V.PC.skill.medicine > 0) { + r.push(`Your medical skills are progressing, and the sloppy scar reminds you of your earliest attempts.`); + } else { + r.push(`You really slashed away at ${V.scarTarget.local} with your knife, but were careful not to allow ${him} to bleed out.`); + } + break; + default: + r.push(`You had no shortage of kinky and medical tools for applying scars. ${His} ${slave.skin} ${V.scarTarget.local} is bleeding profusely.`); + } + + r.push(`No matter how you chose to apply it, being scarred <span class="health.dec"> hurt ${his} health a little.</span>`); + healthDamage(slave, 10); + } + r.push(`Afterwards you seal the wounds with a white medical spray. Infection is no risk to `); + slave.slaveName; + r.push(` thanks to your curatives, but in order to form obvious scar tissue you had to keep air out and delay normal healing as long as possible.`); + scarApplied = false; + } + if (slave.fetish !== "mindbroken" && slave.fuckdoll === 0) { + if (V.degradation > 1) { + if (V.degradation > 5) { + if (slave.devotion <= 50 && slave.trust < -50) { + r.push(`${He} is appalled by the whorish spectacle you have made of ${him}. ${He} <span class="gold">fears</span> you all the more for this but is so terrified of you it does not affect ${his} submission.`); + slave.trust -= 10; + } else if (slave.devotion <= 50) { + r.push(`${He} is appalled by the whorish spectacle you have made of ${him}. ${He} <span class="mediumorchid">hates</span> and <span class="gold">fears</span> you for this.`); + slave.devotion -= 10; + slave.trust -= 10; + } else { + r.push(`${He} is shocked by the whorish spectacle you have made of ${him}. However, ${he} is so submissive to your will that ${he} <span class="hotpink">accepts</span> that the slave `); + if (canSee(slave)) { + r.push(`in the mirror`); + } else { + r.push(`${he} pictures`); + } + r.push(`is who ${he} is now.`); + slave.devotion += 4; + } + } else { + if (slave.devotion < -20 && slave.trust < 20) { + r.push(`${He} is <span class="gold">afraid</span> that ${he} has been permanently altered against ${his} will, but is also scared of your reaction to any objection and suppresses ${his} disgust.`); + slave.trust -= 5; + } else if (slave.devotion < -20) { + r.push(`${He} is <span class="mediumorchid">angry</span> and <span class="gold">afraid</span> that ${he} has been permanently altered against ${his} will.`); + slave.devotion -= 5; + slave.trust -= 5; + } else { + r.push(`${He} is saddened to have been altered against ${his} will. However, ${he} realizes that ${he} is a slave, so ${he} <span class="hotpink">accepts</span> your work.`); + slave.devotion += 2; + } + } + V.degradation = 0; + } + if (modReaction) { + r.push(modReaction); + modReaction = false; + } + } + } + App.Events.addNode(el, r, "p"); + return el; + } + + function piercings() { + const el = new DocumentFragment(); + let r = []; + const piercingLocations = ["ear", "nose", "eyebrow", "lips", "tongue", "nipples", "areolae", "navel", "corset", "clit", "vagina", "dick", "anus"]; + // DESCRIPTIONS + App.UI.DOM.appendNewElement("h2", el, "Piercings"); + + for (const piercing of piercingLocations.concat(["chastity"])) { + r.push(App.UI.DOM.makeElement("div", App.Desc.piercing(slave, piercing))); + } + if (r.length === 0) { + r.push(App.UI.DOM.makeElement("div", `${His} smooth ${slave.skin} skin is completely unpierced.`)); + } + App.Events.addNode(el, r); + r = []; + + // Apply piercings + r.push(`Choose piercing style:`); + const piercingLevelNames = new Map([ + ["Remove", 0], + ["Light", 1], + ["Heavy", 2], + ["Smart", 3] + ]); + let linkArray = []; + for (const [title, num] of piercingLevelNames) { + if (piercingLevel === num) { + linkArray.push(App.UI.DOM.disabledLink(title, ["Currently selected"])); + } else { + linkArray.push( + App.UI.DOM.link( + title, + () => { + piercingLevel = num; + refresh(); + } + ) + ); + } + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + App.Events.addNode(el, r, "div"); + r = []; + + // Determine parts that cannot be pierced + let validPiercingLocations = Array.from(piercingLocations); + + if (slave.nipples !== "fuckable") { + removePiercingLocation("nipples"); + } + + if (slave.vagina !== -1 || slave.dick !== 0) { + removePiercingLocation("clit"); + if (slave.vagina !== -1) { + removePiercingLocation("vagina"); + } + } + + if (slave.dick === 0) { + removePiercingLocation("dick"); + } + + function removePiercingLocation(location) { + const index = validPiercingLocations.indexOf(location); + validPiercingLocations.splice(index, 1); + } + + if (piercingLevel < 3) { + if (piercingLevel === 0) { + r.push(`Remove piercings from:`); + } else if (piercingLevel === 1) { + r.push(`Lightly pierce ${his}:`); + } else if (piercingLevel === 2) { + r.push(`Heavily pierce ${his}:`); + } + // Entire body + linkArray = []; + linkArray.push( + App.UI.DOM.link( + "Entire body", + () => { + modReaction = ""; + for (const location of validPiercingLocations) { + if (slave[`${location}Piercing`] !== piercingLevel) { + modReaction += App.Medicine.Modification.setPiercing(slave, location, piercingLevel); + if (piercingLevel > 1) { + V.degradation += 1; + } + } + } + refresh(); + } + ) + ); + + // Each individual piercing + for (const location of validPiercingLocations) { + if (slave[`${location}Piercing`] !== piercingLevel) { + linkArray.push( + App.UI.DOM.link( + capFirstChar(location), + () => { + modReaction = ""; + modReaction += App.Medicine.Modification.setPiercing(slave, location, piercingLevel); + if (piercingLevel > 1) { + V.degradation += 1; + } + refresh(); + } + ) + ); + } + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + } else if (piercingLevel === 3) { + // Smart piercings + if (slave.vagina !== -1 || slave.dick !== 0) { + if (slave.clitPiercing !== 3) { + r.push(`Give ${him} a`); + r.push( + App.UI.DOM.link( + "smart piercing", + () => { + modReaction = App.Medicine.Modification.setPiercing(slave, "clit", 3); + slave.clitSetting = "all"; + V.degradation += 1; + refresh(); + }, + [], + "", + `Costs ${cashFormat(V.SPcost)}, unlocks options to mold sexuality` + ) + ); + } else { + r.push(`${He} already has a smart piercing!`); + } + } + } + App.Events.addNode(el, r, "div"); + return el; + } + + function tattoos() { + const el = new DocumentFragment(); + let r = []; + let noTats; + const tattooLocations = new Map([ + ["shoulder", "shoulders"], + ["lips", "lips"], + ["breast", "boobs"], + ["upper arm", "arms"], + ["back", "back"], + ["lower back", "stamp"], + ["buttock", "butt"], + ["vagina", "vagina"], + ["dick", "dick"], + ["anus", "anus"], + ["thigh", "legs"] + ]); + // DESCRIPTIONS + App.UI.DOM.appendNewElement("h2", el, "Tattoos"); + + for (const [name, place] of tattooLocations) { + r.push(App.UI.DOM.makeElement("div", App.Desc.tattoo(slave, name))); + } + if (r.length === 0) { + r.push(App.UI.DOM.makeElement("div", `${His} smooth ${slave.skin} skin is completely unmarked.`)); + noTats = true; + } + App.Events.addNode(el, r); + r = []; + + // Apply tattoos + r.push(`Choose a tattoo style:`); + const tattooChoiceNames = new Set([ + "tribal patterns", + "flowers", + "counting", + "advertisements", + "rude words", + "degradation", + "Asian art", + "scenes", + "bovine patterns", + "permanent makeup", + "sacrilege", + "sacrament", + "possessive", + "paternalist", + ]); + if (slave.anusTat !== 0) { + tattooChoiceNames.add("bleached"); + } + let linkArray = []; + for (const style of tattooChoiceNames) { + if (tattooChoice === style) { + linkArray.push(App.UI.DOM.disabledLink(capFirstChar(style), ["Currently selected"])); + } else { + linkArray.push( + App.UI.DOM.link( + capFirstChar(style), + () => { + tattooChoice = style; + refresh(); + } + ) + ); + } + } + if (!noTats) { + linkArray.push( + App.UI.DOM.link( + "Remove a tattoo", + () => { + tattooChoice = 0; + refresh(); + } + ) + ); + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + App.Events.addNode(el, r, "div"); + r = []; + + // Determine parts that cannot be pierced + let validTattooLocations; + if (tattooChoice === "bleached") { + validTattooLocations = ["anus"]; + } else { + validTattooLocations = Array.from(tattooLocations.keys()); + if (!hasAnyNaturalArms(slave)) { + removeTattooLocation("upper arm"); + } + + if (!hasAnyNaturalArms(slave)) { + removeTattooLocation("thigh"); + } else { + // There is a disagreement between description and application if we are talking about the leg or thigh. Switch to leg now for application. + const index = validTattooLocations.indexOf("thigh"); + validTattooLocations.splice(index, 1, "leg"); + } + + if (slave.dick === 0 || tattooChoice === "scenes") { + removeTattooLocation("dick"); + } + if ((tattooChoice === "Asian art" || tattooChoice === "scenes") && slave.anusTat === "bleached") { // leave existing bleached anus alone + removeTattooLocation("anus"); + } + } + + function removeTattooLocation(location) { + const index = validTattooLocations.indexOf(location); + validTattooLocations.splice(index, 1); + } + + if (tattooChoice === 0) { + r.push(`Clean the ink off of ${him}:`); + } else if (tattooChoice === "counting") { + r.push(`Add tallies of ${his} sexual exploits to ${him}:`); + } else if (tattooChoice === "bleached") { + r.push(`Bleach ${his}:`); + } else if (tattooChoice) { + r.push(`Add ${tattooChoice} to ${his}:`); + } + // Entire body + linkArray = []; + if (tattooChoice !== undefined && tattooChoice !== "bleached") { + linkArray.push( + App.UI.DOM.link( + "Entire body", + () => { + modReaction = ""; + for (const location of validTattooLocations) { + if (slave[`${location}tattoo`] !== tattooChoice) { + applyTat(location); + } + } + refresh(); + } + ) + ); + } + // Each individual tattoo + for (const location of validTattooLocations) { + if (slave[`${location}tattoo`] !== tattooChoice) { + linkArray.push( + App.UI.DOM.link( + capFirstChar(location), + () => { + modReaction = ""; + applyTat(location); + refresh(); + } + ) + ); + } + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + App.Events.addNode(el, r, "div"); + + const customEl = document.createElement("div"); + customEl.id = "custom-el"; + customEl.append( + App.UI.DOM.link( + "Show custom tattoo locations", + () => { + jQuery("#custom-el").empty().append(customTats()); + } + ) + ); + el.append(customEl); + + return el; + + function applyTat(location) { + tattooChoice = (location === "lips" && tattooChoice === "scenes") ? "permanent makeup" : tattooChoice; + modReaction += App.Medicine.Modification.setTattoo(slave, tattooLocations.get(location), tattooChoice); + if (!["flowers", "paternalist", "tribal patterns", 0].includes(tattooChoice)) { + V.degradation += 1; + } + } + + function customTats() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h3", el, "Custom Tattoos"); + const r = []; + for (const location of validTattooLocations) { + const varName = tattooLocations.get(location); + if (varName) { + r.push(App.UI.DOM.makeElement("div", `${capFirstChar(location)}: `)); + r.push( + App.UI.DOM.makeElement( + "div", + App.UI.DOM.makeTextBox( + slave[`${varName}Tat`], + (v) => { + modReaction += App.Medicine.Modification.setTattoo(slave, varName, v); + refresh(); + } + ) + ) + ); + } + } + + r.push(App.UI.DOM.makeElement("div", `Custom: `)); + r.push( + App.UI.DOM.makeElement( + "div", + App.UI.DOM.makeTextBox( + slave.custom.tattoo, + (v) => { + slave.custom.tattoo = v; + cashX(forceNeg(V.surgeryCost), "slaveMod", slave); + refresh(); + } + ) + ) + ); + App.Events.addNode(el, r, "div", "grid-2columns-auto"); + if (slave.custom.tattoo !== "") { + el.append( + App.UI.DOM.link( + "Remove custom Tattoo", + () => { + slave.custom.tattoo = ""; + cashX(forceNeg(V.surgeryCost), "slaveMod", slave); + } + ) + ); + } + return el; + } + } + + function branding() { + const el = new DocumentFragment(); + const selection = document.createElement("span"); + selection.id = "brand-selection"; + selection.append(App.Medicine.Modification.Select.brand(slave, cheat)); + el.append(selection); + + if (slave.breedingMark === 1 && (V.propOutcome === 0 || V.eugenicsFullControl === 1 || V.arcologies[0].FSRestart === "unset")) { + const r = []; + r.push(`${He} has an intricate tattoo on ${his} lower belly that suggests ${he} was made to be bred.`); + r.push( + App.UI.DOM.link( + "Remove it", + () => { + slave.breedingMark = 0; + refresh(); + } + ) + ); + App.Events.addNode(el, r, "div"); + } + return el; + } + + function scar() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h2", el, "Scars"); + let r = []; + + for (const _scarName in slave.scar) { + const scarDiv = document.createElement("div"); + scarDiv.append(`${His} ${_scarName} is marked with ${App.Desc.expandScarString(slave, _scarName)}: `); + scarDiv.append( + App.UI.DOM.link( + "Remove Scar", + () => { + scarApplied = 0; + delete slave.scar[_scarName]; + cashX(forceNeg(V.surgeryCost), "slaveSurgery", slave); + V.degradation -= 10; + refresh(); + } + ) + ); + r.push(scarDiv); + } + if (r.length > 0) { + App.Events.addNode(el, r, "div"); + } else { + App.UI.DOM.appendNewElement("div", el, `${His} skin is not scarred.`); + } + + r = []; + r.push(`Use <strong>${V.scarDesign.local}</strong> or choose another scar:`); + const scarTypes = new Set([ + "whip", + "burn", + "surgical", + "menacing", + "exotic" + ]); // Other common scars might be battle scars or c-Section but it makes little sense to include them here + let linkArray = []; + for (const scarType of scarTypes) { + linkArray.push( + App.UI.DOM.link( + capFirstChar(scarType), + () => { + V.scarDesign.local = scarType; + refresh(); + } + ) + ); + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + App.Events.addNode(el, r, "div"); + + r = []; + r.push(`Or design your own:`); + r.push( + App.UI.DOM.makeTextBox( + V.scarDesign.local, + (v) => { + V.scarDesign.local = v; + refresh(); + } + ) + ); + App.Events.addNode(el, r, "div"); + + r = []; + r.push(`Choose a site for scaring:`); + + let scarLocations = new Map(); + + if (["exotic", "menacing"].includes(V.scarDesign.local)) { + scarLocations.set("Cheeks", "cheek"); + } else { + // Sorted head to toe + scarLocations.set("Entire body", "entire body"); + + // Head + if (slave.earShape !== "none") { + scarLocations.set("Ears", "ear"); + } + scarLocations.set("Cheeks", "cheek"); + scarLocations.set("Neck", "neck"); + + // Torso + scarLocations.set("Chest", "chest"); + scarLocations.set("Breasts", "breast"); + scarLocations.set("Back", "back"); + scarLocations.set("Lower Back", "lower back"); + scarLocations.set("Belly", "belly"); + scarLocations.set("Pubic Mound", "pubic mound"); + + if (slave.dick > 0) { + scarLocations.set("Penis", "penis"); + } + if (slave.balls > 0 && slave.scrotum > 0) { + scarLocations.set("Testicles", "testicle"); + } + + // Arms + scarLocations.set("Shoulders", "shoulder"); + if (hasAnyNaturalArms(slave)) { + scarLocations.set("Arm, upper", "upper arm"); + scarLocations.set("Arm, lower", "lower arm"); + scarLocations.set("Wrists", "wrist"); + scarLocations.set("Hands", "hand"); + } + + // Legs + scarLocations.set("Buttocks", "buttock"); + if (hasAnyNaturalLegs(slave)) { + scarLocations.set("Thighs", "thigh"); + scarLocations.set("Calves", "calf"); + scarLocations.set("Ankles", "ankle"); + scarLocations.set("Feet", "foot"); + } + } + + linkArray = []; + for (const [text, value] of scarLocations) { + linkArray.push( + App.UI.DOM.link( + text, + () => { + V.scarTarget.local = value; + refresh(); + } + ) + ); + } + r.push(App.UI.DOM.generateLinksStrip(linkArray)); + App.Events.addNode(el, r, "div"); + + r = []; + r.push(`Or a custom site:`); + r.push( + App.UI.DOM.makeTextBox( + V.scarTarget.local, + (v) => { + V.scarTarget.local = v; + refresh(); + } + ) + ); + App.Events.addNode(el, r, "div"); + + // Correct some "bad" choices" + if (["exotic", "menacing"].includes(V.scarDesign.local)) { + if (V.scarTarget.local !== "cheek") { + V.scarTarget.local = "cheek"; + } + } + + r = []; + + if (["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes(V.scarTarget.local)) { + const _leftTarget = ("left " + V.scarTarget.local); + const _rightTarget = ("right " + V.scarTarget.local); + if (slave.scar[_leftTarget]) { + r.push(`${His}${_leftTarget} is already marked with ${App.Desc.expandScarString(slave, _leftTarget)}.`); + } + if (slave.scar[_rightTarget]) { + r.push(`${His}${_rightTarget} is already marked with ${App.Desc.expandScarString(slave, _rightTarget)}.`); + } + r.push(`Scar ${him} now with ''${V.scarDesign.local}'' on the`); + let _left = 0, _right = 0; + // overwrite brand + + if (!(["upper arm", "lower arm", "wrist", "hand"].includes(V.scarTarget.local) && getLeftArmID(slave) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes(V.scarTarget.local) && getLeftLegID(slave) !== 1)) { + _left = 1; + // make next checks easier + r.push( + App.UI.DOM.link( + "left", + () => { + V.scarTarget.local = _leftTarget; + scarApplied = 1; + App.Medicine.Modification.addScar(slave, _leftTarget, V.scarDesign.local); + cashX(forceNeg(V.modCost), "slaveMod", slave); + V.degradation += 10; + refresh(); + } + ) + ); + } + if (!(["upper arm", "lower arm", "wrist", "hand"].includes(V.scarTarget.local) && getRightArmID(slave) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes(V.scarTarget.local) && getRightLegID(slave) !== 1)) { + _right = 1; + // make next checks easier + } + if (_left && _right) { + r.push(`${V.scarTarget.local}, or the`); + } + if (_right) { + r.push( + App.UI.DOM.link( + "right", + () => { + V.scarTarget.local = _rightTarget; + scarApplied = 1; + App.Medicine.Modification.addScar(slave, _rightTarget, V.scarDesign.local); + cashX(forceNeg(V.modCost), "slaveMod", slave); + V.degradation += 10; + refresh(); + } + ) + ); + } + if (!_left || !_right) { + r.push(`${V.scarTarget.local}?`); + } + } else { + if (slave.scar.hasOwnProperty(V.scarTarget.local)) { + if (slave.scar[V.scarTarget.local][V.scarDesign.local]) { + r.push(`${He} already has ${V.scarDesign.local} scars on ${his} V.scarTarget.local. You can make it worse.`); + } else { + // check how much scarring is on this part + const _scarTotalValue = (Object.values(slave.scar[V.scarTarget.local])).reduce((a, b) => a + b, 0); + if (_scarTotalValue) { + r.push(`That would be a new kind of scar to add to the growing collection on ${his} ${V.scarTarget.local}. Life can always be worse for a slave.`); + } + } + } + r.push( + App.UI.DOM.link( + "Scar", + () => { + let _scarArray; + if (V.scarTarget.local === "entire body" && V.scarDesign.local.includes("whip")) { + // Special case for whipping scene, produces two kinds of scars + App.Medicine.Modification.addScourged(slave); + } else { + // Normal entire body scarring + if (V.scarTarget.local === "entire body") { + _scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"]; + if (getLeftArmID(slave) === 0) { + _scarArray.push("left upper arm"); + } + if (getRightArmID(slave) === 0) { + _scarArray.push("right upper arm"); + } + if (getLeftLegID(slave) === 0) { + _scarArray.push("left thigh"); + } + if (getRightLegID(slave) === 0) { + _scarArray.push("right thigh"); + } + } else { // Single scar + _scarArray = [V.scarTarget.local]; + } + for (const scar of _scarArray) { + App.Medicine.Modification.addScar(slave, scar, V.scarDesign.local); + V.degradation += 10; + } + } + cashX(forceNeg(V.modCost), "slaveMod", slave); + scarApplied = 1; + V.degradation += 10; + refresh(); + } + ) + ); + r.push(`with ${V.scarDesign.local} on the ${V.scarTarget.local}${(slave.scar[V.scarTarget.local]) ? `, adding to the scars that are already there?`: `.`}`); + } + App.Events.addNode(el, r, "div"); + + return el; + } + + function refresh() { + jQuery("#body-modification").empty().append(createPage()); + } +}; diff --git a/src/facilities/bodyModification/bodyModification.tw b/src/facilities/bodyModification/bodyModification.tw new file mode 100644 index 0000000000000000000000000000000000000000..74cbfe0d6445fe245e36d74688fd68b05eacfec5 --- /dev/null +++ b/src/facilities/bodyModification/bodyModification.tw @@ -0,0 +1,5 @@ +:: Body Modification [nobr jump-from-safe] + +<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact", $encyclopedia = "The Studio">> + +<<includeDOM App.UI.bodyModification(getSlave($AS))>> \ No newline at end of file diff --git a/src/uncategorized/bodyModification.js b/src/facilities/bodyModification/createBrand.js similarity index 91% rename from src/uncategorized/bodyModification.js rename to src/facilities/bodyModification/createBrand.js index 25c6930b16f25ce2af7d26b2d8cc1075dc09ed9d..fb7b5cc58e1fb92c777536573c4dc7d38f5921e1 100644 --- a/src/uncategorized/bodyModification.js +++ b/src/facilities/bodyModification/createBrand.js @@ -4,7 +4,8 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { let div = document.createElement('div'); const {his, His, him, He} = getPronouns(slave); - p.classList.add("indent"); + App.UI.DOM.appendNewElement("h2", el, "Branding"); + for (const brandPlace in slave.brand) { div = document.createElement('div'); div.append(`${His} ${brandPlace} is marked with ${slave.brand[brandPlace]}`); @@ -33,7 +34,7 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { "Remove Brand", () => { delete slave.brand[brandPlace]; - App.Medicine.Modification.Select.brand(slave, cheat); // Refresh display + refresh(); }, ) ); @@ -55,8 +56,6 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { el.append(p); p = document.createElement('p'); - p.classList.add("indent"); - div = document.createElement('div'); div.append(`Use ''${V.brandDesign.local}'' or choose another brand: `); @@ -69,14 +68,13 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { p.append(symbolBlock("FS")); div = document.createElement('div'); - div.classList.add("indent"); div.append(`Or design your own: `); div.append( App.UI.DOM.makeTextBox( V.brandDesign.local, v => { V.brandDesign.local = v; - App.Medicine.Modification.Select.brand(slave, cheat); // Refresh display + refresh(); }, ) ); @@ -84,7 +82,6 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { el.append(p); p = document.createElement('p'); - p.classList.add("indent"); App.UI.DOM.appendNewElement("div", p, "Choose a site for branding: "); const body = slaveBody(); p.append(partLinks(body.head)); @@ -93,14 +90,13 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { p.append(partLinks(body.legs)); div = document.createElement('div'); - div.classList.add("indent"); div.append(`Or a custom site: `); div.append( App.UI.DOM.makeTextBox( V.brandTarget.local, v => { V.brandTarget.local = v; - App.Medicine.Modification.Select.brand(slave, cheat); // Refresh display + refresh(); }, ) ); @@ -108,7 +104,6 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { el.append(p); p = document.createElement('p'); - p.classList.add("indent"); if (["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes(V.brandTarget.local)) { const leftTarget = ("left " + V.brandTarget.local); @@ -228,12 +223,11 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { } } el.append(p); - return jQuery('#brand-selection').empty().append(el); + return el; function symbolBlock(brandList) { const div = document.createElement('div'); - div.classList.add("double-choices"); - div.style.textIndent = "0px"; + div.classList.add("choices"); div.append(symbolOptions(brandList)); return div; } @@ -256,7 +250,7 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { list[brand].displayName, () => { V.brandDesign.local = check(brand); - App.Medicine.Modification.Select.brand(slave, cheat); // Refresh display + refresh(); } ) ); @@ -316,8 +310,7 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { function partLinks(bodyPartObj) { const div = document.createElement("div"); - div.classList.add("double-choices"); - div.style.textIndent = "0px"; + div.classList.add("choices"); const array = []; for (const bp in bodyPartObj) { array.push( @@ -325,7 +318,7 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { bodyPartObj[bp], () => { V.brandTarget.local = check(bp); - App.Medicine.Modification.Select.brand(slave, cheat); // Refresh display + refresh(); } ) ); @@ -342,4 +335,8 @@ App.Medicine.Modification.Select.brand = function(slave, cheat = false) { return brand; } } + + function refresh() { + jQuery('#brand-selection').empty().append(App.Medicine.Modification.Select.brand(slave, cheat)); + } }; diff --git a/src/npc/descriptions/describeTattoos.js b/src/npc/descriptions/describeTattoos.js index 31be28fb299484947585494885e9e98c3886ee95..52e9e03baddadb7fb70a981726bb897d898d711f 100644 --- a/src/npc/descriptions/describeTattoos.js +++ b/src/npc/descriptions/describeTattoos.js @@ -804,7 +804,7 @@ App.Desc.tattoo = function(slave, surface) { r.push(`${His} anus is bleached.`); break; case "tribal patterns": - r.push(`${His} anus is bleached. It is tattooed with a tribal pattern that changes interestingly when ${he} relaxes or tightens ${his} sphincter.`); + r.push(`${His} anus is tattooed with a tribal pattern that changes interestingly when ${he} relaxes or tightens ${his} sphincter.`); break; case "flowers": r.push(`${He} has a huge blooming flower tattooed right over ${his} anus.`); diff --git a/src/uncategorized/bodyModification.tw b/src/uncategorized/bodyModification.tw deleted file mode 100644 index ddac0a6b07843ae8de1ca1c817f0c3a734d72822..0000000000000000000000000000000000000000 --- a/src/uncategorized/bodyModification.tw +++ /dev/null @@ -1,854 +0,0 @@ -:: Body Modification [nobr jump-from-safe] - -<<set $nextButton = "Confirm changes", $nextLink = "Slave Interact">> -<<run App.Utils.setLocalPronouns(getSlave($AS))>> -<<run Enunciate(getSlave($AS))>> - -<<set $encyclopedia = "The Studio">> - -<h1>Body Modification Studio</h1> -<p class="scene-intro"> - <<= SlaveFullName(getSlave($AS))>> is lying strapped down on the table in your body modification studio. $He is entirely at your mercy. - - <<if $brandApplied || $degradation || $scarApplied || $modReaction>> - <<if getSlave($AS).fuckdoll == 0>> - <<if canSee(getSlave($AS))>>There's a mirror on the ceiling, so $he can see<<else>>$He can't see, so <<if canHear(getSlave($AS))>>you're careful to describe<<else>>$he must, by $himself, get a feel for<</if>><</if>> $his new appearance. - <</if>> - <<if $brandApplied>> - The smell of burnt flesh hangs in the air. Being branded @@.health.dec;has hurt $his health a little.@@ - <<run healthDamage(getSlave($AS), 10)>> - <<unset $brandApplied>> - <</if>> - <<if $scarApplied>> - <<if $scarTarget.local == "entire body">> - <<switch $scarDesign.local>> - <<case "burn">> - Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the skin with an open flame. - <<case "surgical">> - <<if $PC.skill.medicine >= 100>> - Your medical mastery is perfect, so creating Frankenstein's monster was a deliberate work of art. - <<elseif $PC.skill.medicine > 0>> - Your medical skills are progressing, and the Frankenstein effect reminds you of your earliest attempts. - <<else>> - You really slashed away with your knife, but were careful not to allow $him to bleed out. - <</if>> - <<default>> - The best way to apply scarring to the entire body is with a good old fashioned whip. $His body is a mess of crisscrossed lines<<if hasAnyNaturalLimbs(getSlave($AS))>>, and $his <<if getLimbCount(getSlave($AS), 1) > 1>>limbs twisted so violently in their restraints that they too have<<else>>only limb twists so violently in its restraints that it too has<</if>> become scarred<</if>>. - <</switch>> - No matter how you chose to apply it, scarring so much of $his body has @@.health.dec; hurt $his health.@@ - <<run healthDamage(getSlave($AS), 20)>> - <<else>> - <<if getSlave($AS).scar[$scarTarget.local][$scarDesign.local] > 0>> - This is not the first time $he was scarred like this. - <</if>> - <<switch $scarDesign.local>> - <<case "whip">> - Targeting a single area with a whip is not easy. You set the mood by carefully arranging candles dripping on to a whimpering <<= getSlave($AS).slaveName>>, then got $his attention with a quick - <<if canSee(getSlave($AS))>> - wave - <<elseif canHear(getSlave($AS))>> - crack - <<else>> - tap - <</if>> - of the whip. One by one, you carefully snuffed out the candles, flicking hot wax as you went. After pausing a moment, you prepared to leave your mark. - <<if ["penis", "vagina"].includes($scarTarget.local)>> - <<if getSlave($AS).dick > 4 && $seeDicks>> - $His dick was large enough that it was not too difficult to hit, - <<elseif getSlave($AS).dick > 0 && $seeDicks>> - $His dick was a challengingly small target, - <<else>> - <<if getSlave($AS).clit > 0>> - $His clit was a difficult target, - <<else>> - $His clit was an impossibly tiny target, - <</if>> - <</if>> - but the end was never in doubt. The tip connected with $his most intimate place on the first try, and plunged $him into absolute agony. - <<else>> - The end was never in doubt. A few strokes of the whip plunged $him into agony $his body will not allow $him to forget. - <</if>> - <<case "burn">> - Your goal wasn't to make the distinct shape of a brand, but rather to permanently mar the <<= getSlave($AS).skin>> skin of $his $scarTarget.local with an open flame. - <<case "surgical">> - <<if $PC.skill.medicine >= 100>> - Your medical mastery is perfect, so creating such a scar was a deliberate act of degradation. - <<elseif $PC.skill.medicine > 0>> - Your medical skills are progressing, and the sloppy scar reminds you of your earliest attempts. - <<else>> - You really slashed away at $scarTarget.local with your knife, but were careful not to allow $him to bleed out. - <</if>> - <<default>> - You had no shortage of kinky and medical tools for applying scars. $His <<= getSlave($AS).skin>> $scarTarget.local is bleeding profusely. - <</switch>> - - No matter how you chose to apply it, being scarred @@.health.dec; hurt $his health a little.@@ - <<run healthDamage(getSlave($AS), 10)>> - <</if>> - Afterwards you seal the wounds with a white medical spray. Infection is no risk to <<= getSlave($AS).slaveName>> thanks to your curatives, but in order to form obvious scar tissue you had to keep air out and delay normal healing as long as possible. - <<unset $scarApplied>> - <</if>> - <<if getSlave($AS).fetish != "mindbroken" && getSlave($AS).fuckdoll == 0>> - <<if $degradation > 1>> - <<if $degradation > 5>> - <<if getSlave($AS).devotion <= 50 && getSlave($AS).trust < -50>> - $He is appalled by the whorish spectacle you have made of $him. $He @@.gold;fears@@ you all the more for this but is so terrified of you it does not affect $his submission. - <<set getSlave($AS).trust -= 10>> - <<elseif getSlave($AS).devotion <= 50>> - $He is appalled by the whorish spectacle you have made of $him. $He @@.mediumorchid;hates@@ and @@.gold;fears@@ you for this. - <<set getSlave($AS).devotion -= 10, getSlave($AS).trust -= 10>> - <<else>> - $He is shocked by the whorish spectacle you have made of $him. However, $he is so submissive to your will that $he @@.hotpink;accepts@@ that the slave <<if canSee(getSlave($AS))>>in the mirror<<else>>$he pictures<</if>> is who $he is now. - <<set getSlave($AS).devotion += 4>> - <</if>> - <br><br> - <<else>> - <<if getSlave($AS).devotion < -20 && getSlave($AS).trust < 20>> - $He is @@.gold;afraid@@ that $he has been permanently altered against $his will, but is also scared of your reaction to any objection and suppresses $his disgust. - <<set getSlave($AS).trust -= 5>> - <<elseif getSlave($AS).devotion < -20>> - $He is @@.mediumorchid;angry@@ and @@.gold;afraid@@ that $he has been permanently altered against $his will. - <<set getSlave($AS).devotion -= 5, getSlave($AS).trust -= 5>> - <<else>> - $He is saddened to have been altered against $his will. However, $he realizes that $he is a slave, so $he @@.hotpink;accepts@@ your work. - <<set getSlave($AS).devotion += 2>> - <</if>> - <</if>> - <<set $degradation = 0>> - <</if>> - <<if $modReaction>> - <<print $modReaction>> - <<unset $modReaction>> - <</if>> - <</if>> - <</if>> - - /* 000-250-006 */ - <<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>> - /* 000-250-006 */ -</p> - -/* PIERCINGS */ - -<<set _piercingCount =(getSlave($AS).earPiercing + getSlave($AS).nosePiercing + getSlave($AS).eyebrowPiercing + getSlave($AS).lipsPiercing + getSlave($AS).tonguePiercing + getSlave($AS).nipplesPiercing + getSlave($AS).areolaePiercing + getSlave($AS).corsetPiercing + getSlave($AS).navelPiercing + getSlave($AS).clitPiercing + getSlave($AS).vaginaPiercing + getSlave($AS).dickPiercing + getSlave($AS).anusPiercing)>> - -/*DESCRIPTIONS */ - -<h2>Piercings</h2> - -<div class="indent"> - <div style="padding-bottom:1em"> - <<if _piercingCount == 0>> - $His smooth <<= getSlave($AS).skin>> skin is completely unpierced. - <</if>> - <div><<= App.Desc.piercing(getSlave($AS), "ear")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "nose")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "eyebrow")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "lips")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "tongue")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "nipple")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "areolae")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "navel")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "corset")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "clit")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "vagina")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "dick")>></div> - <div><<= App.Desc.piercing(getSlave($AS), "anus")>></div> - - <div><<= App.Desc.piercing(getSlave($AS), "chastity")>></div> - </div> - - /* Apply piercings */ - - <div> - Choose piercing style: - <<if $piercingLevel != 1>>[[Light|Body Modification][$piercingLevel = 1]]<<else>>Light<</if>> - <<if $piercingLevel != 2>>| [[Heavy|Body Modification][$piercingLevel = 2]]<<else>>| Heavy<</if>> - <<if $piercingLevel != 3>>| [[Smart|Body Modification][$piercingLevel = 3]]<<else>>| Smart<</if>> - <<if $piercingLevel != 0>>| [[Remove|Body Modification][$piercingLevel = 0]]<<else>>| Remove<</if>> - </div> - - <div> - <<if $piercingLevel == 1>> - //Lightly// pierce $his: - - <<link "Entire body">> - <<set $modReaction = "">> - <<if getSlave($AS).earPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "ear", 1)>><</if>> - <<if getSlave($AS).nosePiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "nose", 1)>><</if>> - <<if getSlave($AS).eyebrowPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "eyebrow", 1)>><</if>> - <<if getSlave($AS).lipsPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "lips", 1)>><</if>> - <<if getSlave($AS).tonguePiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "tongue", 1)>><</if>> - <<if getSlave($AS).nipples != "fuckable">> - <<if getSlave($AS).nipplesPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "nipples", 1)>><</if>> - <</if>> - <<if getSlave($AS).areolaePiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "areolae", 1)>><</if>> - <<if getSlave($AS).corsetPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "corset", 1)>><</if>> - <<if getSlave($AS).navelPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "navel", 1)>><</if>> - <<if (getSlave($AS).vagina != -1) || (getSlave($AS).dick != 0)>> - <<if getSlave($AS).clitPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 1)>><</if>> - <</if>> - <<if (getSlave($AS).vagina != -1)>> - <<if getSlave($AS).vaginaPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "vagina", 1)>><</if>> - <</if>> - <<if (getSlave($AS).dick > 0)>> - <<if getSlave($AS).dickPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "dick", 1)>><</if>> - <</if>> - <<if getSlave($AS).anusPiercing != 1>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "anus", 1)>><</if>> - <<goto "Body Modification">> - <</link>> - - <<if getSlave($AS).earPiercing != 1>> | [[Ear|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "ear", 1)]]<</if>> - <<if getSlave($AS).nosePiercing != 1>> | [[Nose|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "nose", 1)]]<</if>> - <<if getSlave($AS).eyebrowPiercing != 1>> | [[Eyebrow|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "eyebrow", 1)]]<</if>> - <<if getSlave($AS).lipsPiercing != 1>> | [[Lips|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "lips", 1)]]<</if>> - <<if getSlave($AS).tonguePiercing != 1>> | [[Tongue|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "tongue", 1)]]<</if>> - <<if getSlave($AS).nipples != "fuckable">> - <<if getSlave($AS).nipplesPiercing != 1>> | [[Nipples|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "nipples", 1)]]<</if>> - <</if>> - <<if getSlave($AS).areolaePiercing != 1>> | [[Areolae|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "areolae", 1)]]<</if>> - <<if getSlave($AS).corsetPiercing != 1>> | [[Corset|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "corset", 1)]]<</if>> - <<if getSlave($AS).navelPiercing != 1>> | [[Navel|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "navel", 1)]]<</if>> - <<if (getSlave($AS).vagina != -1) || (getSlave($AS).dick != 0)>> - <<if getSlave($AS).vagina != -1>> - <<if getSlave($AS).clitPiercing != 1>> | [[Clit|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 1)]]<</if>> - <<else>> - <<if getSlave($AS).clitPiercing != 1>> | [[Dickhead|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 1)]]<</if>> - <</if>> - <</if>> - <<if (getSlave($AS).vagina != -1)>> - <<if getSlave($AS).vaginaPiercing != 1>> | [[Vagina|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "vagina", 1)]]<</if>> - <</if>> - <<if (getSlave($AS).dick > 0)>> - <<if getSlave($AS).dickPiercing != 1>> | [[Dick|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "dick", 1)]]<</if>> - <</if>> - <<if getSlave($AS).anusPiercing != 1>> | [[Anus|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "anus", 1)]]<</if>> - <<elseif $piercingLevel == 2>> - ''Heavily'' pierce $his: - - <<link "Entire body">> - <<set $modReaction = "">> - <<if getSlave($AS).earPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "ear", 2), $degradation += 1>><</if>> - <<if getSlave($AS).nosePiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "nose", 2), $degradation += 1>><</if>> - <<if getSlave($AS).eyebrowPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "eyebrow", 2), $degradation += 1>><</if>> - <<if getSlave($AS).lipsPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "lips", 2), $degradation += 1>><</if>> - <<if getSlave($AS).tonguePiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "tongue", 2), $degradation += 1>><</if>> - <<if getSlave($AS).nipples != "fuckable">> - <<if getSlave($AS).nipplesPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "nipples", 2), $degradation += 1>><</if>> - <</if>> - <<if getSlave($AS).areolaePiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "areolae", 2), $degradation += 1>><</if>> - <<if getSlave($AS).corsetPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "corset", 2), $degradation += 1>><</if>> - <<if getSlave($AS).navelPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "navel", 2), $degradation += 1>><</if>> - <<if (getSlave($AS).vagina != -1) || (getSlave($AS).dick != 0)>> - <<if getSlave($AS).clitPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 2), $degradation += 1>><</if>> - <</if>> - <<if (getSlave($AS).vagina != -1)>> - <<if getSlave($AS).vaginaPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "vagina", 2), $degradation += 1>><</if>> - <</if>> - <<if (getSlave($AS).dick > 0)>> - <<if getSlave($AS).dickPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "dick", 2), $degradation += 1>><</if>> - <</if>> - <<if getSlave($AS).anusPiercing != 2>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "anus", 2), $degradation += 1>><</if>> - <<goto "Body Modification">> - <</link>> - - <<if getSlave($AS).earPiercing != 2>> | [[Ear|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "ear", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).nosePiercing != 2>> | [[Nose|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "nose", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).eyebrowPiercing != 2>> | [[Eyebrow|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "eyebrow", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).lipsPiercing != 2>> | [[Lips|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "lips", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).tonguePiercing != 2>> | [[Tongue|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "tongue", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).nipples != "fuckable">> - <<if getSlave($AS).nipplesPiercing != 2>> | [[Nipples|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "nipples", 2),$degradation += 1]]<</if>> - <</if>> - <<if getSlave($AS).areolaePiercing != 2>> | [[Areolae|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "areolae", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).corsetPiercing != 2>> | [[Corset|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "corset", 2),$degradation += 1]]<</if>> - <<if getSlave($AS).navelPiercing != 2>> | [[Navel|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "navel", 2),$degradation += 1]]<</if>> - <<if (getSlave($AS).vagina != -1) || (getSlave($AS).dick != 0)>> - <<if getSlave($AS).vagina != -1>> - <<if getSlave($AS).clitPiercing != 2>> | [[Clit|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 2),$degradation += 1]]<</if>> - <<else>> - <<if getSlave($AS).clitPiercing != 2>> | [[Dickhead|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 2),$degradation += 1]]<</if>> - <</if>> - <</if>> - <<if (getSlave($AS).vagina != -1)>> - <<if getSlave($AS).vaginaPiercing != 2>> | [[Vagina|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "vagina", 2),$degradation += 1]]<</if>> - <</if>> - <<if (getSlave($AS).dick > 0)>> - <<if getSlave($AS).dickPiercing != 2>> | [[Dick|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "dick", 2),$degradation += 1]]<</if>> - <</if>> - <<if getSlave($AS).anusPiercing != 2>> | [[Anus|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "anus", 2),$degradation += 1]]<</if>> - <<elseif $piercingLevel == 3>> - <<if (getSlave($AS).vagina != -1) || (getSlave($AS).dick != 0)>> - <<if getSlave($AS).clitPiercing != 3>> - Give $him a [[smart piercing?|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 3),getSlave($AS).clitSetting = "all",$degradation += 1]] //Costs <<print cashFormat($SPcost)>>, unlocks options to mold sexuality// - <<else>> - $He already has a smart piercing! - <</if>> - <</if>> - <<elseif $piercingLevel == 0>> - Remove piercings from: - - /* no dick/vagina checks in 'remove' so stealth piercings can be cleaned. Check only for piercings. */ - <<link "Everywhere">> - <<set $modReaction = "">> - <<if getSlave($AS).earPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "ear", 0)>><</if>> - <<if getSlave($AS).nosePiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "nose", 0)>><</if>> - <<if getSlave($AS).eyebrowPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "eyebrow", 0)>><</if>> - <<if getSlave($AS).lipsPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "lips", 0)>><</if>> - <<if getSlave($AS).tonguePiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "tongue", 0)>><</if>> - <<if getSlave($AS).nipplesPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "nipples", 0)>><</if>> - <<if getSlave($AS).areolaePiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "areolae", 0)>><</if>> - <<if getSlave($AS).corsetPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "corset", 0)>><</if>> - <<if getSlave($AS).navelPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "navel", 0)>><</if>> - <<if getSlave($AS).clitPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 0)>><</if>> - <<if getSlave($AS).vaginaPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "vagina", 0)>><</if>> - <<if getSlave($AS).dickPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "dick", 0)>><</if>> - <<if getSlave($AS).anusPiercing > 0>><<set $modReaction += App.Medicine.Modification.setPiercing(getSlave($AS), "anus", 0)>><</if>> - <<goto "Body Modification">> - <</link>> - - <<if getSlave($AS).earPiercing > 0>> | [[Ear|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "ear", 0)]]<</if>> - <<if getSlave($AS).nosePiercing > 0>> | [[Nose|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "nose", 0)]]<</if>> - <<if getSlave($AS).eyebrowPiercing > 0>> | [[Eyebrow|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "eyebrow", 0)]]<</if>> - <<if getSlave($AS).lipsPiercing > 0>> | [[Lips|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "lips", 0)]]<</if>> - <<if getSlave($AS).tonguePiercing > 0>> | [[Tongue|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "tongue", 0)]]<</if>> - <<if getSlave($AS).nipplesPiercing > 0>> | [[Nipples|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "nipples", 0)]]<</if>> - <<if getSlave($AS).areolaePiercing > 0>> | [[Areolae|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "areolae", 0)]]<</if>> - <<if getSlave($AS).corsetPiercing > 0>> | [[Corset|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "corset", 0)]]<</if>> - <<if getSlave($AS).navelPiercing > 0>> | [[Navel|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "navel", 0)]]<</if>> - <<if getSlave($AS).vagina != -1>> - <<if getSlave($AS).clitPiercing > 0>> | [[Clit|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 0)]]<</if>> - <<else>> - <<if getSlave($AS).clitPiercing > 0>> | [[Dickhead|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "clit", 0)]]<</if>> - <</if>> - <<if getSlave($AS).vaginaPiercing > 0>> | [[Vagina|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "vagina", 0)]]<</if>> - <<if getSlave($AS).dickPiercing > 0>> | [[Dick|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "dick", 0)]]<</if>> - <<if getSlave($AS).anusPiercing > 0>> | [[Anus|Body Modification][$modReaction = App.Medicine.Modification.setPiercing(getSlave($AS), "anus", 0)]]<</if>> - <</if>> - </div> -</div> /* indent */ - -/* TATTOOS */ - -<h2>Tattoos</h2> -<div class="indent"> - <div style="padding-bottom:1em"> - <<if getSlave($AS).shouldersTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "shoulder")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).lipsTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "lips")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).boobsTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "breast")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).armsTat != 0 && hasAnyNaturalArms(getSlave($AS))>><div><<= App.Desc.tattoo(getSlave($AS), "upper arm")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).backTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "back")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).stampTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "lower back")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).buttTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "buttock")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).vaginaTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "vagina")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).dickTat != 0 && getSlave($AS).dick > 0>><div><<= App.Desc.tattoo(getSlave($AS), "dick")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).anusTat != 0>><div><<= App.Desc.tattoo(getSlave($AS), "anus")>></div><<set _hasTat = 1>><</if>> - <<if getSlave($AS).legsTat != 0 && hasAnyNaturalLegs(getSlave($AS))>><div><<= App.Desc.tattoo(getSlave($AS), "thigh")>></div><<set _hasTat = 1>><</if>> - </div> - - <div> - Choose a tattoo style: - /* if/else is here so a "highlighted" option is never a link. */ - <<if $tattooChoice != "tribal patterns">>[[Tribal patterns|Body Modification][$tattooChoice = "tribal patterns"]]<<else>>Tribal patterns<</if>> - <<if $tattooChoice != "flowers">> | [[Flowers|Body Modification][$tattooChoice = "flowers"]]<<else>>| Flowers<</if>> - <<if $tattooChoice != "counting">> | [[Counting|Body Modification][$tattooChoice = "counting"]]<<else>>| Counting<</if>> - <<if $tattooChoice != "advertisements">> | [[Advertisements|Body Modification][$tattooChoice = "advertisements"]]<<else>>| Advertisements<</if>> - <<if $tattooChoice != "rude words">> | [[Rude words|Body Modification][$tattooChoice = "rude words"]]<<else>>| Rude words<</if>> - <<if $tattooChoice != "degradation">> | [[Degradation|Body Modification][$tattooChoice = "degradation"]]<<else>>| Degradation<</if>> - <<if $tattooChoice != "Asian art">> | [[Asian art|Body Modification][$tattooChoice = "Asian art"]] <<else>>| Asian art<</if>> - <<if $tattooChoice != "scenes">> | [[Scenes|Body Modification][$tattooChoice = "scenes"]]<<else>>| Scenes<</if>> - <<if $tattooChoice != "bovine patterns">> | [[Bovine|Body Modification][$tattooChoice = "bovine patterns"]]<<else>>| Bovine<</if>> - <<if $tattooChoice != "permanent makeup">> | [[Permanent makeup|Body Modification][$tattooChoice = "permanent makeup"]]<<else>>| Permanent makeup<</if>> - <<if $tattooChoice != "sacrilege">> | [[Sacrilege|Body Modification][$tattooChoice = "sacrilege"]]<<else>>| Sacrilege<</if>> - <<if $tattooChoice != "sacrament">> | [[Sacrament|Body Modification][$tattooChoice = "sacrament"]]<<else>>| Sacrament<</if>> - <<if $tattooChoice != "possessive">> | [[Possessive|Body Modification][$tattooChoice = "possessive"]]<<else>>| Possessive<</if>> - <<if $tattooChoice != "paternalist">> | [[Paternalist|Body Modification][$tattooChoice = "paternalist"]]<<else>>| Paternalist<</if>> - - <<if getSlave($AS).anusTat == 0>> - <<if $tattooChoice != "bleached">>| [[Bleach|Body Modification][$tattooChoice = "bleached"]]<<else>>| Bleach<</if>> - <</if>> - - <<if _hasTat == 1>> - <<if $tattooChoice !== 0>> | //[[Remove a tattoo|Body Modification][$tattooChoice = 0]]//<<else>>| Remove a tattoo<</if>> - <</if>> - </div> - - <div> - <<if def $tattooChoice>> - <<if $tattooChoice == 0>> - Clean the ink off of $him: - <<elseif $tattooChoice == "counting">> - Add tallies of $his sexual exploits to $him: - <<elseif $tattooChoice == "bleached">> - Bleach $his: - <<else>> - Add $tattooChoice to $his: - <</if>> - - <<if ($tattooChoice != "bleached") && ($tattooChoice != "permanent makeup")>> - <<link "Entire body">> - <<set _degradationTemp = 0, $modReaction = "">> - <<if getSlave($AS).boobsTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "boobs", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if getSlave($AS).buttTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "butt", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if getSlave($AS).vaginaTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "vagina", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if getSlave($AS).dick > 0>> - <<if getSlave($AS).dickTat != $tattooChoice && $tattooChoice != "scenes">> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "dick", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - <</if>> - - <<if getSlave($AS).lipsTat != $tattooChoice>> - <<if $tattooChoice == "scenes">> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "lips", "permanent makeup")>> - <<else>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "lips", $tattooChoice)>> - <</if>> - <<set _degradationTemp += 1>> - <</if>> - - <<if ($tattooChoice == "Asian art" || $tattooChoice == "scenes") && getSlave($AS).anusTat == "bleached">> - /* leave existing bleached anus alone */ - <<elseif getSlave($AS).anusTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "anus", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if getSlave($AS).shouldersTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "shoulders", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if getSlave($AS).backTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "back", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if hasAnyNaturalArms(getSlave($AS))>> - <<if getSlave($AS).armsTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "arms", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - <</if>> - <<if hasAnyNaturalLegs(getSlave($AS))>> - <<if getSlave($AS).legsTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "legs", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - <</if>> - - <<if getSlave($AS).stampTat != $tattooChoice>> - <<set $modReaction += App.Medicine.Modification.setTattoo(getSlave($AS), "stamp", $tattooChoice)>> - <<set _degradationTemp += 1>> - <</if>> - - <<if !["flowers", "paternalist", "tribal patterns", 0].includes($tattooChoice)>> - <<set $degradation += _degradationTemp>> - <</if>> - - <<goto "Body Modification">> - <</link>> - <</if>> - - <<if $tattooChoice == "permanent makeup">> - [[Face|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "lips", $tattooChoice)]] - <<elseif $tattooChoice == "bleached">> - [[Asshole|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "anus", $tattooChoice)]] - <<else>> - <<if getSlave($AS).shouldersTat != $tattooChoice>> | [[Shoulders|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "shoulders", $tattooChoice)]]<</if>> - <<if $tattooChoice != "scenes">> - <<if getSlave($AS).lipsTat != $tattooChoice>> | [[Face|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "lips", $tattooChoice)]]<</if>> - <</if>> - <<if getSlave($AS).boobsTat != $tattooChoice>> | [[Boobs|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "boobs", $tattooChoice)]]<</if>> - <<if hasAnyNaturalArms(getSlave($AS))>> - <<if getSlave($AS).armsTat != $tattooChoice>> | [[Arms|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "arms", $tattooChoice)]]<</if>> - <</if>> - <<if getSlave($AS).backTat != $tattooChoice>> | [[Upper back|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "back", $tattooChoice)]]<</if>> - <<if getSlave($AS).stampTat != $tattooChoice>> | [[Lower back|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "stamp", $tattooChoice)]]<</if>> - <<if getSlave($AS).buttTat != $tattooChoice>> | [[Buttock|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "butt", $tattooChoice)]]<</if>> - <<if getSlave($AS).vaginaTat != $tattooChoice>> | [[Vagina|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "vagina", $tattooChoice)]]<</if>> - <<if getSlave($AS).dick > 0 && $tattooChoice != "scenes">> - <<if getSlave($AS).dickTat != $tattooChoice>> | [[Dick|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "dick", $tattooChoice)]]<</if>> - <</if>> - <<if ($tattooChoice != "Asian art") && ($tattooChoice != "scenes")>> - <<if getSlave($AS).anusTat != $tattooChoice>> | [[Anus|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "anus", $tattooChoice)]]<</if>> - <</if>> - <<if hasAnyNaturalLegs(getSlave($AS))>> - <<if getSlave($AS).legsTat != $tattooChoice>> | [[Legs|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "legs", $tattooChoice)]]<</if>> - <</if>> - <</if>> - <</if>> - </div> - - <div> - <<if getSlave($AS).belly >= 10000 && getSlave($AS).bellyPreg < 450000 && getSlave($AS).bellyFluid < 5000>> - <<if getSlave($AS).bellyTat == 0>> - $He has no navel tattoos. - <<else>> - $His navel is tattooed with <<= getSlave($AS).bellyTat>>. - <</if>> - <<if getSlave($AS).bellyTat == 0>> - <div> - [[Heart|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "belly", "a heart")]] - | [[Star|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "belly", "a star")]] - | [[Butterfly|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "belly", "a butterfly")]] - </div> - <</if>> - <<if getSlave($AS).bellyTat != 0>> - //[[Remove tattoos|Body Modification][$modReaction = App.Medicine.Modification.setTattoo(getSlave($AS), "belly", 0)]]// - <</if>> - <<elseif getSlave($AS).bellyPreg >= 450000>> - $His middle is large and taut enough to be a suitable canvas for a navel focused tattoo, but $his brood is too active to permit the needle to do its work. - <<elseif getSlave($AS).bellyFluid >= 10000>> - $His middle is large and taut enough to be a suitable canvas for a navel focused tattoo, but the pressure applied to $his stomach will likely force $him to release its contents. - <<else>> - $His middle isn't large enough to be a suitable canvas for a navel focused tattoo. - <</if>> - </div> - - <div> - <<if getSlave($AS).birthsTat > 0>> - <<if getSlave($AS).birthsTat > 1>> - $He has a series of <<= num(getSlave($AS).birthsTat)>> baby-shaped tattoos adorning $his stomach; one for each successful pregnancy<<if getSlave($AS).pregKnown == 1>> and a temporary one for $his current pregnancy<</if>>. - <<else>> - $He has a single baby-shaped tattoo<<if getSlave($AS).pregKnown == 1>>, and one temporary one,<</if>> adorning $his stomach. - <</if>> - //[[Remove tattoos|Body Modification][getSlave($AS).birthsTat = -1, cashX(forceNeg($surgeryCost), "slaveSurgery", getSlave($AS))]]// - <<elseif getSlave($AS).birthsTat == 0>> - <<if getSlave($AS).pregKnown == 1>> - $He has a single baby-shaped temporary tattoo adorning $his stomach. - //[[Remove it|Body Modification][getSlave($AS).birthsTat = -1]]// - <<if getSlave($AS).abortionTat > -1>> //This will only remove birth tracking//<</if>> - <<else>> - $He is scheduled to receive a tattoo each time $he gives birth. - //[[Cancel|Body Modification][getSlave($AS).birthsTat = -1]]// - <</if>> - <<else>> - Have $him receive a tattoo each time $he gives birth. - //[[Begin keeping track|Body Modification][getSlave($AS).birthsTat = 0]]// - <</if>> - </div> - - <div> - <<if getSlave($AS).abortionTat > 0>> - <<if getSlave($AS).abortionTat > 1>> - $He has a series of <<= num(getSlave($AS).abortionTat)>> crossed out baby-shaped tattoos<<if getSlave($AS).pregKnown == 1>>, and one uncrossed one,<</if>> adorning $his stomach. - <<else>> - $He has a single crossed out baby-shaped tattoo<<if getSlave($AS).pregKnown == 1>>, and one uncrossed one,<</if>> adorning $his stomach. - <</if>> - //[[Remove tattoos|Body Modification][getSlave($AS).abortionTat = -1, cashX(forceNeg($surgeryCost), "slaveSurgery", getSlave($AS))]]// - <<elseif getSlave($AS).abortionTat == 0>> - <<if getSlave($AS).pregKnown == 1>> - $He has a single baby-shaped temporary tattoo adorning $his stomach. - //[[Remove it|Body Modification][getSlave($AS).abortionTat = -1]]// - <<if getSlave($AS).birthsTat > -1>> //This will only remove abortion tracking//<</if>> - <<else>> - $He is scheduled to receive a tattoo each time $he gets an abortion or miscarries. - //[[Cancel|Body Modification][getSlave($AS).abortionTat = -1]]// - <</if>> - <<else>> - Have $him receive a tattoo for each abortion or miscarriage $he has. - //[[Begin keeping track|Body Modification][getSlave($AS).abortionTat = 0]]// - <</if>> - </div> -</div>/* indent */ - -<h3>Custom Tattoos</h3> -<div class="indent"> - //Use complete sentences, make a description of it// - <div class="grid-2columns-auto"> - <<if getSlave($AS).lipsTat == 0>> - <div>Give $him a custom face tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].lipsTat" $slaves[$slaveIndices[$AS]].lipsTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).shouldersTat == 0>> - <div>Give $him a custom shoulder tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].shouldersTat" $slaves[$slaveIndices[$AS]].shouldersTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).armsTat == 0 && hasAnyNaturalArms(getSlave($AS))>> - <div>Give $him a custom arm tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].armsTat" $slaves[$slaveIndices[$AS]].armsTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).boobsTat == 0>> - <div>Give $him a custom tit tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].boobsTat" $slaves[$slaveIndices[$AS]].boobsTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).backTat == 0>> - <div>Give $him a custom back tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].backTat" $slaves[$slaveIndices[$AS]].backTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).stampTat == 0>> - <div>Give $him a custom tramp stamp (lower back tattoo):</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].stampTat" $slaves[$slaveIndices[$AS]].stampTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).buttTat == 0>> - <div>Give $him a custom butt tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].buttTat" $slaves[$slaveIndices[$AS]].buttTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).dickTat == 0 && getSlave($AS).dick != 0>> - <div>Give $him a custom dick tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].dickTat" $slaves[$slaveIndices[$AS]].dickTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).vaginaTat == 0>> - <div>Give $him a custom pubic tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].vaginaTat" $slaves[$slaveIndices[$AS]].vaginaTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).anusTat == 0>> - <div>Give $him a custom anus tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].anusTat" $slaves[$slaveIndices[$AS]].anusTat "Slave Interact">></div> - <</if>> - - <<if getSlave($AS).legsTat == 0 && hasAnyNaturalLegs(getSlave($AS))>> - <div>Give $him a custom leg tattoo:</div> - <div><<textbox "$slaves[$slaveIndices[$AS]].legsTat" $slaves[$slaveIndices[$AS]].legsTat "Slave Interact">></div> - <</if>> - </div> /* grid */ - - <div> - <<if (getSlave($AS).custom.tattoo == "")>> - Give $him a custom tattoo: <<textbox "$slaves[$slaveIndices[$AS]].custom.tattoo" $slaves[$slaveIndices[$AS]].custom.tattoo "Slave Interact">> - <<else>> - $He <<if _hasTat == 1>>also<</if>> has a custom tattoo: <<= getSlave($AS).custom.tattoo>> - Change it here: <<textbox "$slaves[$slaveIndices[$AS]].custom.tattoo" $slaves[$slaveIndices[$AS]].custom.tattoo "Slave Interact">> - <</if>> - <<if getSlave($AS).custom.tattoo != "">> - //[[Remove custom tattoo|Body Modification][getSlave($AS).custom.tattoo = "",cashX(forceNeg($surgeryCost), "slaveSurgery", getSlave($AS))]]// - <</if>> - </div> - -</div> /* indent */ - -/* Branding */ - -<h2>Branding</h2> -<span id="brand-selection"></span> -<script> - App.Medicine.Modification.Select.brand(getSlave(V.AS)) -</script> - - -<<if getSlave($AS).breedingMark == 1 && ($propOutcome == 0 || $eugenicsFullControl == 1 || $arcologies[0].FSRestart == "unset")>> - <div class="indent"> - $He has an intricate tattoo on $his lower belly that suggests $he was made to be bred. [[Remove it|Body Modification][getSlave($AS).breedingMark = 0]] - </div> -<</if>> - -/* Scars */ - -<h2>Scars</h2> -<div class="indent"> -<div style="padding-bottom:1em"> -<<for _scarName, _scar range getSlave($AS).scar>> - <div> - $His _scarName is marked with <<= App.Desc.expandScarString(getSlave($AS), _scarName)>>: - <<capture _scarName>> - <<link "Remove Scar">> - <<set $scarApplied = 0>> - <<run delete getSlave($AS).scar[_scarName]>> - <<run cashX(forceNeg($surgeryCost), "slaveSurgery", getSlave($AS))>> - <<set $degradation -= 10>> - <<goto "Body Modification">> - <</link>> - <</capture>> - </div> -<</for>> -<<if (jQuery.isEmptyObject(getSlave($AS).scar))>> - <div> - $His skin is not scarred. - </div> -<</if>> -</div> - -<div> -Use ''$scarDesign.local'' or choose another scar: - -[[Whip|Body Modification][$scarDesign.local = "whip"]] -| [[Burns|Body Modification][$scarDesign.local = "burn"]] -| [[Surgical|Body Modification][$scarDesign.local = "surgical"]] -| [[Menacing|Body Modification][$scarDesign.local = "menacing"]] -| [[Exotic|Body Modification][$scarDesign.local = "exotic"]] -/* Other common scars might be battle scars or c-Section but it makes little sense to include them here */ -</div> - -<div> -Or design your own: <<textbox "$scarDesign.local" $scarDesign.local "Body Modification">> -</div> - -<div> -Choose a site for scaring: - -<<if ["exotic", "menacing"].includes($scarDesign.local)>> - [[Cheeks|Body Modification][$scarTarget.local = "cheek"]] -<<else>> - /* Sorted head to toe */ - - [[Entire body|Body Modification][$scarTarget.local = "entire body"]] - - /* Head */ - <<if getSlave($AS).earShape != "none">> - | [[Ears|Body Modification][$scarTarget.local = "ear"]] - <</if>> - | [[Cheeks|Body Modification][$scarTarget.local = "cheek"]] - | [[Neck|Body Modification][$scarTarget.local = "neck"]] - - /* Torso */ - | [[Chest|Body Modification][$scarTarget.local = "chest"]] - | [[Breasts|Body Modification][$scarTarget.local = "breast"]] - | [[Back|Body Modification][$scarTarget.local = "back"]] - | [[Lower Back|Body Modification][$scarTarget.local = "lower back"]] - | [[Belly|Body Modification][$scarTarget.local = "belly"]] - | [[Pubic Mound|Body Modification][$scarTarget.local = "pubic mound"]] - <<if getSlave($AS).dick > 0>> - | [[Penis|Body Modification][$scarTarget.local = "penis"]] - <</if>> - <<if getSlave($AS).balls > 0 && getSlave($AS).scrotum > 0>> - | [[Testicles|Body Modification][$scarTarget.local = "testicle"]] - <</if>> - - /* Arms*/ - | [[Shoulders|Body Modification][$scarTarget.local = "shoulder"]] - <<if hasAnyNaturalArms(getSlave($AS))>> - | [[Arm, upper|Body Modification][$scarTarget.local = "upper arm"]] - | [[Arm, lower|Body Modification][$scarTarget.local = "lower arm"]] - | [[Wrists|Body Modification][$scarTarget.local = "wrist"]] - | [[Hands|Body Modification][$scarTarget.local = "hand"]] - <</if>> - - /* Legs */ - | [[Buttocks|Body Modification][$scarTarget.local = "buttock"]] - <<if hasAnyNaturalLegs(getSlave($AS))>> - | [[Thighs|Body Modification][$scarTarget.local = "thigh"]] - | [[Calves|Body Modification][$scarTarget.local = "calf"]] - | [[Ankles|Body Modification][$scarTarget.local = "ankle"]] - | [[Feet|Body Modification][$scarTarget.local = "foot"]] - <</if>> -<</if>> -</div> - -<div> -Or a custom site: <<textbox "$scarTarget.local" $scarTarget.local "Body Modification">> -</div> - -/* Correct some "bad" choices" */ -<<if ["exotic", "menacing"].includes($scarDesign.local)>> - <<if $scarTarget.local != "cheek">> - <<set $scarTarget.local = "cheek">> - <</if>> -<</if>> - -<div> -<<if ["ankle", "breast", "buttock", "calf", "cheek", "ear", "foot", "hand", "lower arm", "shoulder", "testicle", "thigh", "upper arm", "wrist"].includes($scarTarget.local)>> - <<set _leftTarget = ("left " + $scarTarget.local)>> - <<set _rightTarget = ("right " + $scarTarget.local)>> - <<if getSlave($AS).scar[_leftTarget]>> - $His _leftTarget is already marked with <<= App.Desc.expandScarString(getSlave($AS), _leftTarget)>>. - <</if>> - <<if getSlave($AS).scar[_rightTarget]>> - $His _rightTarget is already marked with <<= App.Desc.expandScarString(getSlave($AS), _rightTarget)>>. - <</if>> - Scar $him now with ''$scarDesign.local'' on the - <<set _left = 0, _right = 0>> /* overwrite brand */ - - <<if !(["upper arm", "lower arm", "wrist", "hand"].includes($scarTarget.local) && getLeftArmID(getSlave($AS)) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes($scarTarget.local) && getLeftLegID(getSlave($AS)) !== 1)>> - <<set _left = 1>> /* make next checks easier */ - <<link "left">> - <<set $scarTarget.local = _leftTarget>> - <<set $scarApplied = 1>> - <<run App.Medicine.Modification.addScar(getSlave($AS), _leftTarget, $scarDesign.local)>> - <<run cashX(forceNeg($modCost), "slaveMod", getSlave($AS))>> - <<set $degradation += 10>> - <<goto "Body Modification">> - <</link>> - <</if>> - <<if !(["upper arm", "lower arm", "wrist", "hand"].includes($scarTarget.local) && getRightArmID(getSlave($AS)) !== 1) && !(["thigh", "calf", "ankle", "foot"].includes($scarTarget.local) && getRightLegID(getSlave($AS)) !== 1)>> - <<set _right = 1>> /* make next checks easier */ - <</if>> - <<if _left && _right>> - $scarTarget.local, or the - <</if>> - <<if _right>> - <<link "right">> - <<set $scarTarget.local = _rightTarget>> - <<set $scarApplied = 1>> - <<run App.Medicine.Modification.addScar(getSlave($AS), _rightTarget, $scarDesign.local)>> - <<run cashX(forceNeg($modCost), "slaveMod", getSlave($AS))>> - <<set $degradation += 10>> - <<goto "Body Modification">> - <</link>> - <</if>><<if !_left || !_right>> $scarTarget.local<</if>>? -<<else>> - <<if getSlave($AS).scar.hasOwnProperty($scarTarget.local)>> - <<if getSlave($AS).scar[$scarTarget.local][$scarDesign.local]>> - $He already has $scarDesign.local scars on $his $scarTarget.local. You can make it worse. - <<else>> /* check how much scarring is on this part */ - <<set _scarTotalValue = (Object.values(getSlave($AS).scar[$scarTarget.local])).reduce((a, b) => a + b, 0)>> - <<if _scarTotalValue>> - That would be a new kind of scar to add to the growing collection on $his $scarTarget.local. Life can always be worse for a slave. - <</if>> - <</if>> - <</if>> - <<link "Scar">> - <<if $scarTarget.local === "entire body" && $scarDesign.local.includes("whip")>> - /* Special case for whipping scene, produces two kinds of scars */ - <<run App.Medicine.Modification.addScourged(getSlave($AS))>> - <<else>> - /* Normal entire body scarring */ - <<if $scarTarget.local === "entire body">> - <<set _scarArray = ["left breast", "right breast", "back", "lower back", "left buttock", "right buttock"]>> - <<if getLeftArmID(getSlave($AS)) === 0>> - <<set _scarArray.push("left upper arm")>> - <</if>> - <<if getRightArmID(getSlave($AS)) === 0>> - <<set _scarArray.push("right upper arm")>> - <</if>> - <<if getLeftLegID(getSlave($AS)) === 0>> - <<set _scarArray.push("left thigh")>> - <</if>> - <<if getRightLegID(getSlave($AS)) === 0>> - <<set _scarArray.push("right thigh")>> - <</if>> - /* Single scar */ - <<else>> - <<set _scarArray = [$scarTarget.local]>> - <</if>> - <<for _i to 0; _i < _scarArray.length; _i++>> - <<run App.Medicine.Modification.addScar(getSlave($AS), _scarArray[_i], $scarDesign.local)>> - <<set $degradation += 10>> - <</for>> - <</if>> - <<run cashX(forceNeg($modCost), "slaveMod", getSlave($AS))>> - <<set $scarApplied = 1>> - <<set $degradation += 10>> - <<goto "Body Modification">> - <</link>> - with $scarDesign.local on the $scarTarget.local<<if getSlave($AS).scar[$scarTarget.local]>>, adding to the scars that are already there?<<else>>.<</if>> -<</if>> -</div> -</div> /* indent */