From 201c16e3269e41c6d8bd3a3747e717c9cd5f23ff Mon Sep 17 00:00:00 2001 From: Svornost <11434-svornost@users.noreply.gitgud.io> Date: Sat, 12 Jun 2021 13:20:02 -0700 Subject: [PATCH] Sell/Discard slave improvements. - Restore relative reaction text that was being discarded. - Discard slave now discards the slave instead of redirecting to Sell Slave. Bugged slaves can now be properly discarded again, and will reimburse the player half the calculated cost, or the minimum slave cost if the cost could not be calculated. - Use semantic CSS class names in Sell Slave. - Fix some missing interpolation. - Refactor slave buyers a little bit to reduce bloat. - A few other minor fixes. --- js/002-config/fc-js-init.js | 1 + src/interaction/discard.js | 39 ++ src/interaction/saleFunctions.js | 66 +++ src/interaction/sellSlave.js | 617 ++++++++-------------------- src/uncategorized/discardConfirm.tw | 7 - 5 files changed, 286 insertions(+), 444 deletions(-) create mode 100644 src/interaction/discard.js create mode 100644 src/interaction/saleFunctions.js delete mode 100644 src/uncategorized/discardConfirm.tw diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js index ab834eafafc..9df9b04d985 100644 --- a/js/002-config/fc-js-init.js +++ b/js/002-config/fc-js-init.js @@ -50,6 +50,7 @@ App.Facilities.Schoolroom = {}; App.Facilities.ServantsQuarters = {}; App.Facilities.Spa = {}; App.Interact = {}; +App.Interact.Sale = {}; App.Intro = {}; App.Neighbor = {}; App.MainView = {}; diff --git a/src/interaction/discard.js b/src/interaction/discard.js new file mode 100644 index 00000000000..ed15c7c3d27 --- /dev/null +++ b/src/interaction/discard.js @@ -0,0 +1,39 @@ +/** @param {App.Entity.SlaveState} slave */ +App.Interact.discard = function(slave) { + const frag = document.createDocumentFragment(); + + const {him} = getPronouns(slave); + + let cost = 0; + try { + cost = 50 * Math.trunc(slaveCost(slave) / 100); // slightly less than you'd get from Sell Slave + } catch { + // just use the minimum price + } + cost = Math.max(cost, minimumSlaveCost(false)); + + const result = document.createElement("span"); + + App.UI.DOM.appendNewElement("p", frag, `This will permanently remove ${SlaveFullName(slave)} from the game, and you will receive a minimal reimbursement of ${cashFormat(cost)} for ${him}. This is primarily intended as a way to rid yourself of bugged slaves. Are you certain?`); + + App.UI.DOM.appendNewElement("div", result, App.UI.DOM.link(`Discard ${him}`, () => { + $(result).empty(); + try { + result.append(App.Interact.Sale.separationReactions(slave)); + } catch { + // oh well + } + + App.UI.DOM.appendNewElement("div", result, `${slave.slaveName} has been removed from the game.`); + + cashX(cost, "slaveTransfer"); + removeSlave(slave); + })); + + App.UI.DOM.appendNewElement("div", result, App.UI.DOM.passageLink(`Put ${him} up for sale instead`, "Sell Slave")); + App.UI.DOM.appendNewElement("div", result, App.UI.DOM.passageLink("Cancel", V.nextLink)); + + frag.append(result); + + return frag; +}; diff --git a/src/interaction/saleFunctions.js b/src/interaction/saleFunctions.js new file mode 100644 index 00000000000..c4c441ebc57 --- /dev/null +++ b/src/interaction/saleFunctions.js @@ -0,0 +1,66 @@ +/** @param {App.Entity.SlaveState} slave */ +App.Interact.Sale.separationReactions = function(slave) { + const {sister, daughter, father, mother} = getPronouns(slave); + const resultNode = document.createDocumentFragment(); + for (const s of V.slaves) { + const {his2} = getPronouns(s).appendSuffix("2"); + if (slave.mother === s.ID) { + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">grieved</span> that you are selling ${his2} ${daughter}.`], "div"); + s.devotion -= 20; + } + if (slave.father === s.ID) { + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">disappointed</span> that you are selling ${his2} ${daughter}.`], "div"); + s.devotion -= 10; + } + if (slave.ID === s.father) { + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">saddened</span> that you are selling ${his2} ${father}.`], "div"); + s.devotion -= 10; + } + if (slave.ID === s.mother) { + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">grieved</span> that you are selling ${his2} ${mother}.`], "div"); + s.devotion -= 20; + } + switch (areSisters(slave, s)) { + case 1: + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">devastated</span> that you are selling ${his2} twin.`], "div"); + s.devotion -= 30; + break; + case 2: + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">grieved</span> that you are selling ${his2} ${sister}.`], "div"); + s.devotion -= 20; + break; + case 3: + App.Events.addNode(resultNode, [`${s.slaveName} is <span class="devotion dec">disheartened</span> that you are selling ${his2} half-${sister}.`], "div"); + s.devotion -= 10; + break; + } + } + if (slave.relationship > 0) { + const rel = getSlave(slave.relationshipTarget); + if (rel && rel.fetish !== "mindbroken") { + const {his2} = getPronouns(rel).appendSuffix("2"); + App.Events.addParagraph(resultNode, [`${rel.slaveName} is <span class="devotion dec">grieved</span> that you are selling ${his2} best source of comfort and companionship in a life of bondage.`]); + rel.devotion -= rel.relationship*10; + } + } else if (slave.relationship === -3) { + App.Events.addParagraph(resultNode, [`Selling one of your slave wives is <span class="reputation dec">socially unacceptable.</span> In addition, your other devoted slaves are <span class="trust dec">worried</span> that you may not respect their status.`]); + repX(-200, "slaveTransfer"); + for (const s of V.slaves) { + if (s.devotion > 50) { + s.trust -= 5; + } + } + } + if (slave.rivalry !== 0) { + const riv = getSlave(slave.rivalryTarget); + if (riv && riv.fetish !== "mindbroken") { + const {he2, his2} = getPronouns(riv).appendSuffix("2"); + App.Events.addParagraph(resultNode, [`${riv.slaveName} is <span class="devotion inc">pleased</span> that ${he2} won't have to see ${his2} rival any more.`]); + riv.devotion += riv.rivalry*3; + } + } + if (isShelterSlave(slave)) { + V.shelterAbuse += 1; + } + return resultNode; +}; diff --git a/src/interaction/sellSlave.js b/src/interaction/sellSlave.js index 942f044f99e..7d978cb8af4 100644 --- a/src/interaction/sellSlave.js +++ b/src/interaction/sellSlave.js @@ -1,11 +1,9 @@ -new App.DomPassage("Sell Slave", () => { - V.nextButton = "Back"; - V.nextLink = "Slave Interact"; +/** @param {App.Entity.SlaveState} slave */ +App.Interact.sellSlave = function(slave) { const scene = document.createElement("span"); - const slave = getSlave(V.AS); const { He, His, - he, his, hers, him, himself, girl, sister, daughter, father, mother + he, his, hers, him, himself, girl } = getPronouns(slave); const {womenU} = getNonlocalPronouns(V.seeDicks).appendSuffix("U"); let cost; @@ -305,7 +303,7 @@ new App.DomPassage("Sell Slave", () => { } if (slave.geneticQuirks.progeria !== 2 && slave.geneticQuirks.neoteny === 2 && slave.actualAge > slave.visualAge + 5) { - t.push(`${He} appears to be neotonic, that will turn off some but attract others. Overall should prove positive though.`); + t.push(`${He} appears to be neotonic, which will turn off some but attract others. Overall should prove positive though.`); } if (slave.career !== 0) { @@ -483,31 +481,31 @@ new App.DomPassage("Sell Slave", () => { if (V.arcologies[0].FSRepopulationFocusSMR !== 0) { if (slave.preg < -1) { t.push(`The lack of an ability to become pregnant greatly decreases value, the global market being what it is.`); - } else if ((slave.bellyPreg >= 300000)) { + } else if (slave.bellyPreg >= 300000) { t.push(`That belly is all child? Incredible. Such fertility will price ${him} very high, the global market being what it is.`); - } else if ((slave.bellyPreg >= 120000)) { + } else if (slave.bellyPreg >= 120000) { t.push(`Such a massive pregnancy demands a high value, the global market being what it is.`); - } else if ((slave.preg > slave.pregData.normalBirth / 4)) { + } else if (slave.preg > slave.pregData.normalBirth / 4) { t.push(`The advanced pregnancy adds a little value, the global market being what it is.`); } } else if (V.arcologies[0].FSRestartSMR !== 0) { if (slave.preg < -1) { t.push(`${His} infertility improves ${his} value, since ${his} kind should not be allowed to reproduce.`); - } else if ((slave.bellyPreg >= 300000)) { + } else if (slave.bellyPreg >= 300000) { t.push(`That belly is all child? How horrible. ${He}'d make a better example of the horrors of pregnancy than a sex slave.`); - } else if ((slave.bellyPreg >= 30000)) { + } else if (slave.bellyPreg >= 30000) { t.push(`What a disgusting creature, that filth inside ${him} will destroy ${his} value.`); - } else if ((slave.preg > slave.pregData.normalBirth / 4)) { + } else if (slave.preg > slave.pregData.normalBirth / 4) { t.push(`What a waste, if ${he} weren't pregnant, ${he} might be worth something.`); } } else { if (slave.ovaries === 0 && slave.vagina > -1 && slave.genes === "XY") { t.push(`The lack of a natural vagina still removes a little value, the global market being what it is.`); - } else if ((slave.bellyPreg >= 300000)) { + } else if (slave.bellyPreg >= 300000) { t.push(`Such an obscene and life threatening display of fertility will turn off most buyers and considerably damage ${his} value, the global market being what it is.`); - } else if ((slave.bellyPreg >= 120000)) { + } else if (slave.bellyPreg >= 120000) { t.push(`Such a massive and dangerous pregnancy removes some value, the global market being what it is.`); - } else if ((slave.preg > slave.pregData.normalBirth / 4)) { + } else if (slave.preg > slave.pregData.normalBirth / 4) { t.push(`The advanced pregnancy removes a little value, the global market being what it is.`); } } @@ -840,13 +838,17 @@ new App.DomPassage("Sell Slave", () => { }/* closes breeding mark */ App.Events.addParagraph(scene, t); + if (isShelterSlave(slave)) { + App.Events.addParagraph(scene, [`${He} was placed in your care by the Slave Shelter. Selling ${him} will `, App.UI.DOM.makeElement("span", "violate your contract with them.", "reputation dec")]); + } + /** * @typedef {Object} slaveBuyerData * @property {number} cost * @property {string} offerDesc * @property {boolean} requirements * @property {number} percentOdds - * @property {Node} [completeSale] + * @property {Array<string|HTMLElement|DocumentFragment>} [completeSale] * @property {boolean} [allowsBoomerang=true] */ @@ -861,7 +863,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return true; }, percentOdds: 100, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is quickly escorted out by ${his} new master. ${He} is rarely seen in public anymore, but ${his} records show ${he} is settling well into being ${his} new owner's breeder.`); @@ -872,10 +873,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your non-chosen slaves <span class="mediumorchid">resent</span> you for denying them the special treatment ${slave.slaveName} is receiving.`); + r.push(`Your non-chosen slaves <span class="devotion dec">resent</span> you for denying them the special treatment ${slave.slaveName} is receiving.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false } @@ -932,7 +932,6 @@ new App.DomPassage("Sell Slave", () => { () => { V.nextButton = "Back to Main"; V.nextLink = "Main"; - V.returnTo = "Main"; V.encyclopedia = "Personal Assistant"; App.Utils.scheduleSidebarRefresh(); const resultNode = new DocumentFragment(); @@ -1010,71 +1009,12 @@ new App.DomPassage("Sell Slave", () => { } } } - for (const s of V.slaves) { - const {his2} = getPronouns(s).appendSuffix("2"); - if (slave.mother === s.ID) { - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">grieved</span> that you are selling ${his2} ${daughter}.`)); - s.devotion -= 20; - } - if (slave.father === s.ID) { - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">disappointed</span> that you are selling ${his2} ${daughter}.`)); - s.devotion -= 10; - } - if (V.AS === s.father) { - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">saddened</span> that you are selling ${his2} ${father}.`)); - s.devotion -= 10; - } - if (V.AS === s.mother) { - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">grieved</span> that you are selling ${his2} ${mother}.`)); - s.devotion -= 20; - } - switch (areSisters(slave, s)) { - case 1: - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">devastated</span> that you are selling ${his2} twin.`)); - s.devotion -= 30; - break; - case 2: - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">grieved</span> that you are selling ${his2} ${sister}.`)); - s.devotion -= 20; - break; - case 3: - r.push(App.UI.DOM.makeElement("div", `${s.slaveName} is <span class="mediumorchid">disheartened</span> that you are selling ${his2} half-${sister}.`)); - s.devotion -= 10; - break; - } - } - if (slave.relationship > 0) { - const rel = getSlave(slave.relationshipTarget); - if (rel && rel.fetish !== "mindbroken") { - const {his2} = getPronouns(rel).appendSuffix("2"); - r.push(App.UI.DOM.makeElement("p", `${rel.slaveName} is <span class="mediumorchid">grieved</span> that you are selling ${his2} best source of comfort and companionship in a life of bondage.`)); - rel.devotion -= rel.relationship*10; - } - } else if (slave.relationship === -3) { - r.push(App.UI.DOM.makeElement("p", `Selling one of your slave wives is <span class="red">socially unacceptable.</span> In addition, your other devoted slaves are <span class="gold">worried</span> that you may not respect their status.`)); - repX(-200, "slaveTransfer"); - for (const s of V.slaves) { - if (s.devotion > 50) { - s.trust -= 5; - } - } - } - if (slave.rivalry !== 0) { - const riv = getSlave(slave.rivalryTarget); - if (riv && riv.fetish !== "mindbroken") { - const {he2, his2} = getPronouns(riv).appendSuffix("2"); - r.push(App.UI.DOM.makeElement("p", `${riv.slaveName} is <span class="hotpink">pleased</span> that ${he2} won't have to see ${his2} rival any more.`)); - riv.devotion += riv.rivalry*3; - } - } + resultNode.append(App.Interact.Sale.separationReactions(slave)); cashX(buyer.cost, "slaveTransfer"); - if (isShelterSlave(slave)) { - V.shelterAbuse += 1; - } - resultNode.append( + App.Events.addParagraph(resultNode, buyer.hasOwnProperty("completeSale") ? buyer.completeSale : - `The buyer forwards payment and sends a purchasing agent to collect ${him}. There is nothing more to be done.` + [`The buyer forwards payment and sends a purchasing agent to collect ${him}. There is nothing more to be done.`] ); jQuery(scene).empty().append(resultNode); removeSlave(slave); @@ -1093,7 +1033,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((slave.physicalAge > 30) && (slave.devotion > 20)); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} settles into ${his} new life in a humbler part of ${V.arcologies[0].name}, and can occasionally be seen accompanying ${his} master in public.`); @@ -1106,10 +1045,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other older, obedient slaves are <span class="mediumaquamarine">reassured</span> that if they're sold, they can hope for better than life in a cheap brothel.`); + r.push(`Your other older, obedient slaves are <span class="trust inc">reassured</span> that if they're sold, they can hope for better than life in a cheap brothel.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["preg fetishist", { @@ -1118,7 +1056,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((isFertile(slave) && V.seePreg !== 0) && cost > 10000); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} settles in to ${his} new role easily enough; ${he}'s one of the most pampered slaves in the arcology. All ${he}'s expected to do is light housework and self-maintenance, along with gentle unprotected vaginal sex with ${his} new master.`); @@ -1131,10 +1068,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves with pregnancy fetishes envy ${him}, and <span class="mediumaquamarine">trust that even if you decide to sell them,</span> they'll find themselves in a sexually satisfying life.`); + r.push(`Your slaves with pregnancy fetishes envy ${him}, and <span class="trust inc">trust that even if you decide to sell them,</span> they'll find themselves in a sexually satisfying life.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["organ crafter", { @@ -1143,7 +1079,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((isFertile(slave) && V.seePreg !== 0) && slave.mpreg === 1); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is seen in a research report nine months later; ${he} has undergone some interesting changes. As expected by someone interested in ${his} odd womb, ${he} is quite pregnant, but what really stands out is the massive size of ${his} testicles and ${his} huge round implants. A quick glance at the article reveals that they aren't implants; in fact, ${his} breasts and testicles are rounded with children.`); @@ -1154,10 +1089,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other anally fertile slaves <span class="gold">are concerned </span> that they may end up carrying children in more than just their bellies.`); + r.push(`Your other anally fertile slaves <span class="trust dec">are concerned</span> that they may end up carrying children in more than just their bellies.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }], @@ -1167,7 +1101,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((isFertile(slave) && V.seePreg !== 0) && V.seeHyperPreg === 1 && V.seeExtreme === 1 && slave.vagina === 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}`); @@ -1197,10 +1130,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other virgins <span class="gold">are terrified they'll meet a similar fate</span> if they cannot convince you to fill their wombs with your children.`); + r.push(`Your other virgins <span class="trust dec">are terrified they'll meet a similar fate</span> if they cannot convince you to fill their wombs with your children.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }], @@ -1210,7 +1142,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((isFertile(slave) && V.seePreg !== 0) && slave.intelligence > 50) && slave.face >= 55 && slave.faceShape !== "masculine"; }, percentOdds: 90, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is seen nearly a year later, happy and healthy, along with ${his} owner and newborn son. They are quite a good looking family.`); @@ -1223,10 +1154,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your more idiotic slaves are <span class="mediumorchid">deeply jealous</span> of ${slave.slaveName}'s new pampered lifestyle, oblivious to the demanding nature of eugenics.`); + r.push(`Your more idiotic slaves are <span class="devotion dec">deeply jealous</span> of ${slave.slaveName}'s new pampered lifestyle, oblivious to the demanding nature of eugenics.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }], @@ -1236,7 +1166,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((isFertile(slave) && V.seePreg !== 0) && slave.hips > 1 && slave.vagina === 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is seen nine months later with an enormous pregnancy and the most content look on ${his} face. ${He} `); @@ -1256,10 +1185,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other pregnancy fetishists <span class="mediumorchid">are jealous</span> of ${slave.slaveName}'s good fortune.`); + r.push(`Your other pregnancy fetishists <span class="devotion dec">are jealous</span> of ${slave.slaveName}'s good fortune.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }], @@ -1269,7 +1197,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return ((isFertile(slave) && V.seePreg !== 0) && slave.vagina === 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is seen in a shipment of slaves leaving the arcology a month later, with just the slightest hint of a gravid belly and a worn-down expression on ${his} face.`); @@ -1282,10 +1209,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other virgins <span class="gold">fear they'll be subjected to similar abuse</span> if they cannot make their virginities otherwise valuable or appealing to you.`); + r.push(`Your other virgins <span class="trust dec">fear they'll be subjected to similar abuse</span> if they cannot make their virginities otherwise valuable or appealing to you.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["abortion TV", { @@ -1294,7 +1220,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.seePreg !== 0 && V.seeHyperPreg === 1 && V.seeExtreme === 1 && (slave.preg > slave.pregData.normalBirth / 2) && (slave.bellyPreg >= 300000)); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is soon seen on live TV, restrained and still grotesquely pregnant. ${He} screams into ${his} restraints as the host approaches with a comically large syringe of abortifacients and drives it deep into ${his} womb. Within minutes, a flood of liquid and fetuses are pouring from ${his} gaping cunt, all the while he times how long it takes ${his} overburdened womb to drain of all its contents.`); @@ -1305,10 +1230,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other hyper pregnant slaves <span class="gold">are terrified that their children will be ripped from them</span> if they don't please you.`); + r.push(`Your other hyper pregnant slaves <span class="trust dec">are terrified that their children will be ripped from them</span> if they don't please you.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }], @@ -1318,7 +1242,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.nipples === "huge"); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s new mistress is an exhibitionist as well as a nipple fetishist, and before long, she's seen in the club, riding ${slave.slaveName}'s chest with her wet pussy. The slave is expected to keep ${his} nipples erect for her at all times.`); @@ -1331,10 +1254,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves with breast fetishes envy ${him}, and <span class="mediumaquamarine">trust that even if you decide to sell them,</span> they'll find themselves in a sexually satisfying life.`); + r.push(`Your slaves with breast fetishes envy ${him}, and <span class="trust inc">trust that even if you decide to sell them,</span> they'll find themselves in a sexually satisfying life.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["nipple fucker", { @@ -1343,7 +1265,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.nipples === "fuckable"); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s new master is an exhibitionist as well as a nipple fetishist, and before long, he's seen in the club, plowing ${slave.slaveName}'s engorged breasts. Since nipple cunts aren't naturally lubricated, some owners find stimulating milk production a suitable replacement; judging from the pooling fluids and sympathetic gushes from ${his} ignored tit, he is one of them.`); @@ -1358,10 +1279,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves in love with their own fuckable breasts envy ${him}, and <span class="mediumaquamarine">trust that even if you decide to sell them,</span> they'll find themselves in a sexually satisfying life, even if your average guy can only satisfy one breast at a time.`); + r.push(`Your slaves in love with their own fuckable breasts envy ${him}, and <span class="trust inc">trust that even if you decide to sell them,</span> they'll find themselves in a sexually satisfying life, even if your average guy can only satisfy one breast at a time.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["anal fetishist", { @@ -1370,7 +1290,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.balls > 0 && slave.skill.anal > 10 && slave.devotion > 20); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`The next time ${slave.slaveName} is seen in public, on an errand for ${his} master, ${he}'s `); @@ -1389,10 +1308,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your buttsluts envy ${him}, and <span class="mediumaquamarine">trust that even if you decide to sell them,</span> they'll find themselves orgasming with dicks up their asses anyway.`); + r.push(`Your buttsluts envy ${him}, and <span class="trust inc">trust that even if you decide to sell them,</span> they'll find themselves orgasming with dicks up their asses anyway.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["oral fetishist", { @@ -1401,7 +1319,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.skill.oral > 30 && slave.devotion > 20); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`The next time ${slave.slaveName} is seen in public, ${he}'s obediently accompanying ${his} new master. After doing some business on the promenade, he pulls ${him} into an alcove and lets ${him} masturbate as he uses ${his} throat.`); @@ -1414,10 +1331,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your cumsluts envy ${him}, and <span class="mediumaquamarine">trust that even if you decide to sell them,</span> they'll find themselves filled with cum every day.`); + r.push(`Your cumsluts envy ${him}, and <span class="trust inc">trust that even if you decide to sell them,</span> they'll find themselves filled with cum every day.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["pain fetishist", { @@ -1426,7 +1342,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.fetish !== "masochist" && slave.devotion > 50); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is not seen again in public for a long time, but the crack of leather on flesh and the resultant hoarse female howling that issues from ${his} new mistress's apartment is well-known.`); @@ -1439,10 +1354,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your masochists envy ${him}, and <span class="mediumaquamarine">trust that even if you decide to sell them,</span> they'll never lack for the abuse they need.`); + r.push(`Your masochists envy ${him}, and <span class="trust inc">trust that even if you decide to sell them,</span> they'll never lack for the abuse they need.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["sadism fetishist", { @@ -1451,7 +1365,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.muscles > 30 && slave.height >= 170 && (slave.intelligence + slave.intelligenceImplant < -15)); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} rarely leaves ${his} new mistress's apartments, but the slave rumor mill bears stories about ${him} to your penthouse anyway. ${His} mistress uses ${him} as a rapist on demand, and ${his} dumbly obedient brutality is renowned.`); @@ -1464,10 +1377,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your sadists consider such a life scarcely capable of improvement, and <span class="mediumaquamarine">trust that if you decide to sell them,</span> they'll get a chance to abuse other slaves.`); + r.push(`Your sadists consider such a life scarcely capable of improvement, and <span class="trust inc">trust that if you decide to sell them,</span> they'll get a chance to abuse other slaves.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["dom fetishist", { @@ -1476,7 +1388,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.devotion > 20 && (slave.intelligence + slave.intelligenceImplant > 50) && slave.intelligenceImplant >= 15); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} wins ${himself} a leadership position with ${his} new master, who repays ${his} hard work by allowing ${him} to use his slaves at will.`); @@ -1489,10 +1400,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your sexually dominant slaves do their best to follow ${his} success, and <span class="mediumaquamarine">trust that if you decide to sell them,</span> they'll stand a chance of winning a place in which they can fuck as well as get fucked.`); + r.push(`Your sexually dominant slaves do their best to follow ${his} success, and <span class="trust inc">trust that if you decide to sell them,</span> they'll stand a chance of winning a place in which they can fuck as well as get fucked.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["sub fetishist", { @@ -1501,7 +1411,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.devotion > 50 && slave.skill.oral >= 100); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`The back of ${slave.slaveName}'s head becomes a well-known sight in business circles, since ${his} mistress rarely lets it out from between her legs.`); @@ -1514,10 +1423,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your sexually submissive slaves secretly envy ${his} simple life, and <span class="mediumaquamarine">trust that if you decide to sell them,</span> there are places where a sub can be valuable and safe.`); + r.push(`Your sexually submissive slaves secretly envy ${his} simple life, and <span class="trust inc">trust that if you decide to sell them,</span> there are places where a sub can be valuable and safe.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["buttbreaker", { @@ -1526,7 +1434,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.anus === 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`In short order, ${slave.slaveName} is heard out on the promenade, sobbing and screaming as ${his} new owner breaks in ${his} virgin butt in public.`); @@ -1537,10 +1444,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other anal virgins <span class="gold">fear for their asses</span> should you decide to sell them.`); + r.push(`Your other anal virgins <span class="trust dec">fear for their asses</span> should you decide to sell them.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["trainer staffing", { @@ -1549,7 +1455,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.skill.oral >= 100 && slave.skill.anal >= 100 && (slave.intelligence + slave.intelligenceImplant > 15)); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is soon well-known among the slaves of the arcology, as many of them are sold after passing under ${his} hands in training. ${He} performs effectively, imparting good sex slave ethics in a generation of sluts.`); @@ -1560,10 +1465,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other intelligent slaves <span class="mediumaquamarine">trust that their skills will be valued</span> even should you decide to sell them.`); + r.push(`Your other intelligent slaves <span class="trust inc">trust that their skills will be valued</span> even should you decide to sell them.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["D milf staffing", { @@ -1572,7 +1476,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.skill.oral >= 100 && slave.skill.anal >= 100 && (slave.intelligence + slave.intelligenceImplant > 15) && slave.intelligenceImplant >= 15 && slave.physicalAge > 35); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} becomes a common sight around the arcology, training slaves for ${his} new master. They're usually seen hanging close by ${him} as ${he} manages them with an air at once protective and frankly sexual.`); @@ -1583,10 +1486,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your older slaves are <span class="mediumaquamarine">happy for ${him},</span> since it isn't always easy for older ladies.`); + r.push(`Your older slaves are <span class="trust inc">happy for ${him},</span> since it isn't always easy for older ladies.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["D hucow", { @@ -1595,7 +1497,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.boobsImplant === 0 && slave.lactation > 0 && slave.ovaries > 0 && slave.boobs > 1000); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} becomes quite a fixture at social events hosted by ${his} new master; he enjoys showing off how healthy, happy and productive his cow is.`); @@ -1606,11 +1507,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other milkers are sometimes concerned about being sold to a cruel stockyard, and ${his} pleasant life encourages them to <span class="mediumaquamarine">stop being so worried.</span>`); + r.push(`Your other milkers are sometimes concerned about being sold to a cruel stockyard, and ${his} pleasant life encourages them to <span class="trust inc">stop being so worried.</span>`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["D startled the witch", { @@ -1619,7 +1518,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.muscles > 5 && slave.weight < -10 && slave.teeth === "pointy" && slave.skill.combat > 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} heads off to form part of whatever great design ${his} new master is pursuing; all you know is that it apparently requires lots of lithe, sharp toothed slave ${girl}s.`); @@ -1630,11 +1528,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your properly broken slaves are so inured to strange tastes that they pay no attention, but the others are just <span class="mediumaquamarine">glad ${he} won't frighten them</span> any more. They thought ${he} was scary.`); + r.push(`Your properly broken slaves are so inured to strange tastes that they pay no attention, but the others are just <span class="trust inc">glad ${he} won't frighten them</span> any more. They thought ${he} was scary.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["vampire clan", { @@ -1643,7 +1539,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.teeth === "fangs" && (skinToneLevel(slave.skin) < 7)); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is quickly embraced by ${his} new owner and spirited away like all the other ${girl}s that catch his fancy.`); @@ -1654,10 +1549,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your properly broken slaves are so inured to strange tastes that they pay no attention, but the others are just <span class="mediumaquamarine">glad ${he} won't frighten them</span> any more. There was a rumor circulating that ${he} was a creature of the night.`); + r.push(`Your properly broken slaves are so inured to strange tastes that they pay no attention, but the others are just <span class="trust inc">glad ${he} won't frighten them</span> any more. There was a rumor circulating that ${he} was a creature of the night.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["D virgin asspussy", { @@ -1666,7 +1560,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.vagina === 0 && slave.anus > 1 && slave.skill.anal >= 100 && slave.physicalAge < 25); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s buyer takes charge of ${him}, and cannot resist immediately running a hand between ${his} buttocks to sink a couple of groping fingers into ${his} soft asspussy.`); @@ -1677,11 +1570,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves who enjoy having things shoved up their assholes <span class="mediumaquamarine">hope that if they're sold,</span> their new masters will be like that too.`); + r.push(`Your slaves who enjoy having things shoved up their assholes <span class="trust inc">hope that if they're sold,</span> their new masters will be like that too.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["D waifu", { @@ -1690,11 +1581,9 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.vagina === 0 && (slave.fetish === "submissive" || slave.fetish === "pregnancy") && slave.skill.entertainment > 30 && slave.physicalAge < 30); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; r.push(`${slave.slaveName} is rarely seen after ${his} buyer takes charge of ${him}, since he prefers to keep his beloved at home. Though ${he} seems to be well treated, arcology society finds him repellent enough that your other slaves do not envy ${him}.`); - App.Events.addNode(el, r); - return el; + return r; } }], ["monster movie", { // or "sex double" @@ -1716,7 +1605,6 @@ new App.DomPassage("Sell Slave", () => { }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; if (random(1, 3) === 1 && V.seePreg !== 0) { @@ -1729,7 +1617,7 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`The pregnancy obsessed sluts among your slaves are <span class="mediumorchid">envious</span> of ${slave.slaveName}'s new experience, even if it is fake.`); + r.push(`The pregnancy obsessed sluts among your slaves are <span class="devotion dec">envious</span> of ${slave.slaveName}'s new experience, even if it is fake.`); } } else { // Sex Double @@ -1741,11 +1629,10 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`The attention whores among your slaves are <span class="mediumorchid">envious</span> of ${slave.slaveName}'s good fortune.`); + r.push(`The attention whores among your slaves are <span class="devotion dec">envious</span> of ${slave.slaveName}'s good fortune.`); } } - App.Events.addNode(el, r); - return el; + return r; } }], ["D oral servants", { @@ -1754,7 +1641,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.dick > 0 && slave.skill.oral >= 100 && slave.height < 160 && slave.butt > 3); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is an occasional sight around the arcology; ${he}'s never seen outside the company of ${his} new slave superior. This is one of ${his} new master's more favored slaves. ${He} has a huge cock, and ${slave.slaveName} is usually seen crouching down, hugging one of ${his} superior's legs and keeping ${his} mouth obediently near that dick.`); @@ -1767,11 +1653,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your cumsluts are <span class="mediumaquamarine">rather envious.</span>`); + r.push(`Your cumsluts are <span class="trust inc">rather envious.</span>`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["D trap lover", { @@ -1780,7 +1664,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.dick > 0 && slave.devotion > 20 && slave.fetish === "buttslut" && slave.visualAge < 25 && slave.boobs < 400 && slave.weight <= 10); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} becomes a frequent sight around the arcology, accompanying ${his} new master. ${He}'s clearly happy, and is frequently seen to offer ${his} butt to him with a smile.`); @@ -1793,10 +1676,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves with dicks who've accepted their lot in life find this <span class="mediumaquamarine">encouraging.</span>`); + r.push(`Your slaves with dicks who've accepted their lot in life find this <span class="trust inc">encouraging.</span>`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["D butt bury", { @@ -1805,7 +1687,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.height > 185 && slave.butt > 8 && slave.buttImplant < 2 && slave.weight > 10); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s buyer arrives promptly; he seems pleased with his new slave's bountiful bottom, so far off the ground.`); @@ -1818,11 +1699,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your buttsluts giggle over what he's got in store for ${him}, and <span class="mediumaquamarine">envy</span> ${his} new owner a little.`); + r.push(`Your buttsluts giggle over what he's got in store for ${him}, and <span class="trust inc">envy</span> ${his} new owner a little.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["D milky herm", { @@ -1831,7 +1710,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.dick > 1 && slave.balls === 1 && slave.vagina > -1 && canAchieveErection(slave) && slave.lactation > 0 && slave.face > 10 && slave.faceShape !== "masculine"); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s buyer arrives and seems pleased with ${his} lovely feminine appearance; he verifies ${his} lactation and ${his} ability to achieve erection despite ${his} lack of visible balls.`); @@ -1844,11 +1722,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other feminine slaves with dicks <span class="mediumaquamarine">trust</span> they'll go to owners that will value them, should they be sold.`); + r.push(`Your other feminine slaves with dicks <span class="trust inc">trust</span> they'll go to owners that will value them, should they be sold.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["D amazon hunter", { @@ -1857,14 +1733,12 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.dick === 0 && slave.muscles > 30 && slave.devotion > 20 && slave.height > 180); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; - r.push(`When ${slave.slaveName}'s buyer appears, the big ${girl} is almost bashful. He tries to resist the impulse, but quickly breaks down and sweeps ${him} into a tight hug. ${He} accepts the embrace meekly. Your other slaves find this <span class="mediumaquamarine">very romantic.</span>`); + r.push(`When ${slave.slaveName}'s buyer appears, the big ${girl} is almost bashful. He tries to resist the impulse, but quickly breaks down and sweeps ${him} into a tight hug. ${He} accepts the embrace meekly. Your other slaves find this <span class="trust inc">very romantic.</span>`); for (const s of V.slaves) { s.trust += 1; } - App.Events.addNode(el, r); - return el; + return r; } }], ["D shorty breeder", { @@ -1873,7 +1747,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.seePreg !== 0 && slave.ovaries === 1 && slave.preg > -2 && slave.muscles > 30 && slave.weight <= 10 && slave.height < 165); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s lithe, muscular form is rarely seen after ${his} buyer takes charge of ${him}, since ${he} seems to spend most of ${his} time at home making babies.`); @@ -1886,10 +1759,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves with pregnancy fetishes <span class="mediumaquamarine">almost want to be sold</span> since there's a chance they'll be purchased by him, too.`); + r.push(`Your slaves with pregnancy fetishes <span class="trust inc">almost want to be sold</span> since there's a chance they'll be purchased by him, too.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["D oral servants", { @@ -1898,7 +1770,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.devotion > 20 && slave.fetish === "cumslut" && slave.lips > 30 && hasAnyArms(slave) && hasAnyLegs(slave) && slave.skill.oral > 50); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is an occasional sight around the arcology; ${he}'s never seen outside the company of ${his} new slave superior. This is one of ${his} new master's more favored slaves. ${He} has a huge cock, and ${slave.slaveName} is usually seen crouching down, hugging one of ${his} superior's legs and keeping ${his} mouth obediently near that dick.`); @@ -1911,10 +1782,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your cumsluts are <span class="mediumaquamarine">rather envious.</span>`); + r.push(`Your cumsluts are <span class="trust inc">rather envious.</span>`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["D r9k", { @@ -1923,7 +1793,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.skill.vaginal <= 10 && slave.skill.anal <= 10 && slave.skill.oral <= 10 && slave.skill.whoring <= 10 && slave.skill.entertainment <= 10); }, percentOdds: 80, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s nervous buyer comes to collect ${him}, stammering and sweating and doing his best to pretend he does this all the time.`); @@ -1934,11 +1803,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other less experienced slaves persistently find this romantic, and <span class="mediumaquamarine">hope something like that will happen to them,</span> too.`); + r.push(`Your other less experienced slaves persistently find this romantic, and <span class="trust inc">hope something like that will happen to them,</span> too.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["D cannibal", { @@ -1947,15 +1814,12 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.weight > 10 && slave.muscles > 5 && slave.health.condition > 60 && cost < 10000); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; - r.push(`${slave.slaveName} is never seen again. ${His} buyer prefers to keep whatever happened to ${him} private. However, rumors of steaks, rump roasts, sweetbreads, and blood pudding eaten at three in the morning filter out from time to time. Naturally, these murmurs never fail to <span class="gold">terrify</span> your other slaves.`); + r.push(`${slave.slaveName} is never seen again. ${His} buyer prefers to keep whatever happened to ${him} private. However, rumors of steaks, rump roasts, sweetbreads, and blood pudding eaten at three in the morning filter out from time to time. Naturally, these murmurs never fail to <span class="trust dec">terrify</span> your other slaves.`); for (const s of V.slaves) { s.trust -= 2; } - - App.Events.addNode(el, r); - return el; + return r; } }], ["obsessed fan", { @@ -1964,7 +1828,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.porn.prestige === 1); }, percentOdds: 69, // Who did this? Seriously, who did this... get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is rarely seen after ${his} buyer takes charge of ${him}, since he prefers to keep his prize safe and sound at home.`); @@ -1977,11 +1840,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other borderline unheard of sluts <span class="mediumaquamarine">hope that someone like him would consider whisking them away,</span> but most of your slaves are skeptical at what his intent may be.`); + r.push(`Your other borderline unheard of sluts <span class="trust inc">hope that someone like him would consider whisking them away,</span> but most of your slaves are skeptical at what his intent may be.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["porn studio", { @@ -1990,7 +1851,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.porn.prestige === 3); }, percentOdds: 90, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} becomes a frequent sight in ${slave.porn.fameType} smut and attracts huge crowds with each public appearance.`); @@ -2003,10 +1863,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other aspiring porn stars <span class="mediumaquamarine">try harder than ever</span> in the hopes of following in ${his} prestigious footsteps.`); + r.push(`Your other aspiring porn stars <span class="trust inc">try harder than ever</span> in the hopes of following in ${his} prestigious footsteps.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["teaching trainer", { @@ -2015,7 +1874,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSDegradationist === "unset" && slave.intelligenceImplant < 15); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is not pleased by ${his} change in circumstances, since ${he} is soon subjected to training rigor that ${he} did not experience while your property.`); @@ -2026,11 +1884,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other uneducated slaves <span class="gold">fear the abusive indoctrination</span> they will apparently suffer under should you decide to sell them.`); + r.push(`Your other uneducated slaves <span class="trust dec">fear the abusive indoctrination</span> they will apparently suffer under should you decide to sell them.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["implanting trainer", { @@ -2039,7 +1895,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSBodyPurist === "unset" && slave.boobsImplant === 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`A few weeks later, ${slave.slaveName} is seen in a shipment of slaves heading out of the arcology. ${He} has new fake tits, a bigger butt, lip implants, and even some facial bone structure alterations, but ${his} balloon breasts are the most shocking change.`); @@ -2050,11 +1905,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your unimplanted slaves <span class="gold">fear they'll go under the knife</span> for invasive surgery like ${slave.slaveName} suffered, should you ever decide to sell them.`); + r.push(`Your unimplanted slaves <span class="trust dec">fear they'll go under the knife</span> for invasive surgery like ${slave.slaveName} suffered, should you ever decide to sell them.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["purifying trainer", { @@ -2063,7 +1916,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSTransformationFetishist === "unset" && slave.boobsImplant > 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`A few weeks later, ${slave.slaveName} is seen in a shipment of slaves heading out of the arcology. ${He} is almost unrecognizable, having been quickly returned to as natural an appearance as skillful removal of ${his} implants could manage.`); @@ -2074,11 +1926,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves who are carrying around huge implants <span class="mediumaquamarine">hope they'll be allowed to lay down their burdens</span> should you decide to sell them.`); + r.push(`Your slaves who are carrying around huge implants <span class="trust inc">hope they'll be allowed to lay down their burdens</span> should you decide to sell them.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["slimming trainer", { @@ -2087,7 +1937,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSAssetExpansionist === "unset" && slave.boobs > 600 && slave.butt > 3 && slave.weight > 10); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is occasionally visible around the arcology, looking rather tired and gaunt under the stresses of a severe crash diet coupled with a punishing cardio regime.`); @@ -2098,11 +1947,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your chubby slaves take note, and <span class="gold">fear they'll have to suffer too</span> should you ever decide to sell them.`); + r.push(`Your chubby slaves take note, and <span class="trust dec">fear they'll have to suffer too</span> should you ever decide to sell them.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["broadening trainer", { @@ -2111,7 +1958,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSSlimnessEnthusiast === "unset" && slave.boobs < 600 && slave.butt < 3 && slave.weight < -10); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is only rarely seen around the arcology, since ${his} new owners force ${him} to spend most of ${his} time sleeping, eating and looking after ${himself}. But ${his} belly, painfully distended with food, makes ${his} situation obvious.`); @@ -2122,20 +1968,17 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`When they hear about ${him}, your slim slaves are <span class="gold">disgusted and afraid,</span> fearing they'll be forced to eat themselves plush if sold.`); + r.push(`When they hear about ${him}, your slim slaves are <span class="trust dec">disgusted and afraid,</span> fearing they'll be forced to eat themselves plush if sold.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["cow trainer", { cost: 500 * Math.trunc((cost * 1.1) / 500), - offerDesc: `from a slave trainer that specializes in getting womenU ready to be dairy cows by using aggressive hormonal and pharmaceutical treatment to balloon their tits.`, + offerDesc: `from a slave trainer that specializes in getting ${womenU} ready to be dairy cows by using aggressive hormonal and pharmaceutical treatment to balloon their tits.`, get requirements() { return (slave.boobs > 1000 && slave.boobsImplant === 0 && slave.lactation === 0); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is last seen somewhat later, packed into a shipment of cows heading out of the arcology. ${He} looks rather ill from the drugs ${he}'s been filled with, and ${his} now-distended breasts are marred by unsightly stretch marks.`); @@ -2146,11 +1989,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Even your slaves who normally enjoy breast expansion are <span class="gold">disgusted and afraid</span> they'll be treated as pharmaceutical mixing machines if you sell them to the same company. Only your cows are inured to lactation to the point they're unaffected.`); + r.push(`Even your slaves who normally enjoy breast expansion are <span class="trust dec">disgusted and afraid</span> they'll be treated as pharmaceutical mixing machines if you sell them to the same company. Only your cows are inured to lactation to the point they're unaffected.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["clipping trainer", { @@ -2159,7 +2000,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSGenderFundamentalist === "unset" && slave.balls > 0 && slave.boobs < 500); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is frequently seen in public over the next few weeks, since ${he}'s being trained to improve ${his} feminine deportment. ${He} grows visibly more feminine as time passes, as the hormonal effects of having ${his} balls cut off become apparent.`); @@ -2170,11 +2010,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves who retain their testicles are <span class="gold">afraid</span> of displeasing you, knowing that castration is a distinct possibility on the open market.`); + r.push(`Your slaves who retain their testicles are <span class="trust dec">afraid</span> of displeasing you, knowing that castration is a distinct possibility on the open market.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["reassignment trainer", { @@ -2183,7 +2021,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSGenderRadicalist === "unset" && slave.dick > 0 && cost > 10000); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is next seen after some weeks of surgery. ${He}'s barely recognizable, and now possesses a serviceable vagina which ${he} clearly is unsure of. ${His} original status is scarcely discernible.`); @@ -2194,11 +2031,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your less feminized slaves <span class="gold">fear similar treatment;</span> even those who aspire to be better slave girls are shocked by the rapidity and totality of the surgical transformation.`); + r.push(`Your less feminized slaves <span class="trust dec">fear similar treatment;</span> even those who aspire to be better slave girls are shocked by the rapidity and totality of the surgical transformation.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["pastoralist arcology", { @@ -2207,7 +2042,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.boobs - slave.boobsImplant > 2000 && slave.lactation > 1); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is subjected to a stock assay and then packed off to take ${his} place as a prize heifer.`); @@ -2220,11 +2054,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves who are already lactating know that ${his} role is to be a relatively easy and decent one, and your obedient slaves accept it regardless. Others, however, <span class="gold">fear being transformed into livestock</span> a little.`); + r.push(`Your slaves who are already lactating know that ${his} role is to be a relatively easy and decent one, and your obedient slaves accept it regardless. Others, however, <span class="trust dec">fear being transformed into livestock</span> a little.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["egyptian revivalist arcology", { @@ -2233,7 +2065,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.devotion > 50 && (slave.intelligence + slave.intelligenceImplant > 50) && slave.intelligenceImplant >= 30); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s journey to ${his} new home is respectful, even celebratory, as far as you can see. ${He} is gravely informed by the purchasing agent that many slaves await ${his} learned instruction.`); @@ -2244,11 +2075,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Most of your slaves quietly envy ${his} good fortune. The stupidest however tend to resent their intellectual superiors and <span class="mediumorchid">actively resent</span> how obvious ${his} advantage over them proved to be.`); + r.push(`Most of your slaves quietly envy ${his} good fortune. The stupidest however tend to resent their intellectual superiors and <span class="devotion dec">actively resent</span> how obvious ${his} advantage over them proved to be.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["aztec revivalist arcology", { @@ -2257,10 +2086,9 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.skill.combat >= 1 && slave.health.condition > 40 && slave.muscles > 25); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; - r.push(`${slave.slaveName} is transported after losing a military engagement. Though ${his} will remains strong, ${he}'s <span class="gold">filled with fear</span> when ${he} sees the rivers of blood that flow through the city.`); + r.push(`${slave.slaveName} is transported after losing a military engagement. Though ${his} will remains strong, ${he}'s <span class="trust dec">filled with fear</span> when ${he} sees the rivers of blood that flow through the city.`); for (const s of V.slaves) { if (s.skill.combat > 0) { s.trust -= 2; @@ -2268,11 +2096,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`${His} willingness to obey will be tested. ${His} life will be forfeit, a fate many others <span class="gold">fear might befall them,</span> if ${he} does not perform.`); + r.push(`${His} willingness to obey will be tested. ${His} life will be forfeit, a fate many others <span class="trust dec">fear might befall them,</span> if ${he} does not perform.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["roman revivalist arcology", { @@ -2281,7 +2107,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.skill.combat > 0 && slave.health.condition > 40 && slave.muscles > 5); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is shipped to a new arcology, and culturally, across the centuries. ${His} skill at arms is well enough known that ${his} impending role as a gladiatrix is easily deduced.`); @@ -2292,11 +2117,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`A gladiatrix's life expectancy in an arcology that enjoys lethal combats is punishingly low. Your other slaves with combat skill <span class="gold">worry they'll follow ${him}</span> out onto the sand.`); + r.push(`A gladiatrix's life expectancy in an arcology that enjoys lethal combats is punishingly low. Your other slaves with combat skill <span class="trust dec">worry they'll follow ${him}</span> out onto the sand.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["neoimperialist arcology", { @@ -2305,7 +2128,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.health.condition > 40 && (slave.intelligence + slave.intelligenceImplant > 20) && slave.muscles > 5); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is taken away by an expensive, flashy shuttle shortly after you finalize the trade. ${He} is swept into a life of luxury; the next time you see ${him}, ${he}'s dressed in a manner more befitting of a consort than a simple slave.`); @@ -2316,10 +2138,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`The majority of your slaves are simply jealous of the wealth and luxury of ${his} new home, but the brighter servants shudder with the understanding that such decadence is bought at the price of fawning obedience to a trussed-up megalomaniac.`); + r.push(`The majority of your slaves are simply jealous of the wealth and luxury of ${his} new home, but the brighter servants <span class="devotion dec">shudder</span> with the understanding that such decadence is bought at the price of fawning obedience to a trussed-up megalomaniac.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["chattel religionist arcology", { @@ -2328,7 +2149,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.face > 10 && slave.counter.anal < 100); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is terrified of ${his} impending religious life; perhaps ${he}'s heard the new text that reads 'no woman come of age is holy unless she performs the act as many times per day as she has years less than forty.'`); @@ -2339,10 +2159,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your sexually experienced slaves are too inured to industrial lovemaking to be affected by ${his} fate, but your more innocent slaves <span class="gold">fear being required to fuck</span> at that pace.`); + r.push(`Your sexually experienced slaves are too inured to industrial lovemaking to be affected by ${his} fate, but your more innocent slaves <span class="trust dec">fear being required to fuck</span> at that pace.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["physical idealist arcology", { @@ -2351,7 +2170,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.muscles > 5 && slave.muscles <= 95 && slave.health.condition > 60); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`Stories about the arcology ${slave.slaveName} is headed to have circulated among slaves. Most intelligent slaves see a life of workouts as relatively harmless.`); @@ -2364,10 +2182,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`However, your stupider slaves consider a life of rigorous dieting and punishing exercise daunting, and are filled with <span class="gold">minor fears</span> that they will be made to starve and sweat, too.`); + r.push(`However, your stupider slaves consider a life of rigorous dieting and punishing exercise daunting, and are filled with <span class="trust dec">minor fears</span> that they will be made to starve and sweat, too.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["hedonistic decadence arcology", { @@ -2376,7 +2193,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.weight > 30 && slave.weight <= 95 && slave.health.condition > 60); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is taken away to join a quivering mass of plump, pampered ladies that crowd the bedroom of ${his} new owner.`); @@ -2387,10 +2203,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your more gluttonous slaves are <span class="mediumorchid">deeply jealous</span> of ${slave.slaveName}'s constant feedings and excessive weight gain.`); + r.push(`Your more gluttonous slaves are <span class="devotion dec">deeply jealous</span> of ${slave.slaveName}'s constant feedings and excessive weight gain.`); } - App.Events.addNode(el, r); - return el; + return r; } }], ["stuffer chef", { @@ -2399,7 +2214,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSSlimnessEnthusiast !== "unset" && slave.weight < 10 && slave.muscles < 10 && slave.belly === 0 && slave.preg < 1); }, percentOdds: 80, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s new owner is quite fond of his work and typically sends out photos of his progress. This is no exception; you are treated to a series of images featuring ${slave.slaveName} being force-fed until ${his} stomach bulges. Day after day, you watch ${him} handle more and more food until ${his} belly is big enough to fill ${his} lap even when empty.`); @@ -2410,11 +2224,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other thin slaves are <span class="gold">terrified</span> that they'll soon find themselves tied to a chair and fed until they are ready to pop.`); + r.push(`Your other thin slaves are <span class="trust dec">terrified</span> that they'll soon find themselves tied to a chair and fed until they are ready to pop.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["transformation fetishist arcology", { @@ -2423,7 +2235,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.boobs > 1000 && slave.boobsImplant === 0); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`A purchasing agent arrives for ${slave.slaveName}; he uses a lull in the proceedings to use a permanent marker to begin mapping out surgical sites across ${his} body. There are a lot of them.`); @@ -2434,11 +2245,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your unbroken slaves who hear about how severely ${he}'s about to be cut up are <span class="gold">somewhat afraid</span> that they will suffer similar surgical invasion.`); + r.push(`Your unbroken slaves who hear about how severely ${he}'s about to be cut up are <span class="trust dec">somewhat afraid</span> that they will suffer similar surgical invasion.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["asset expansionist arcology", { @@ -2447,7 +2256,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.boobs > 800 && slave.boobsImplant === 0 && slave.physicalAge < 25); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`A shipping container arrives for ${slave.slaveName}; as ${he}'s loaded into it, it sedates ${him} and begins to pump hormones, curatives and growth enhancers into no less than seven places scattered over ${his} body.`); @@ -2459,11 +2267,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your unbroken slaves who hear about the grotesque display of pharmacological art are <span class="gold">somewhat afraid</span> that they will suffer similar chemical invasion.`); + r.push(`Your unbroken slaves who hear about the grotesque display of pharmacological art are <span class="trust dec">somewhat afraid</span> that they will suffer similar chemical invasion.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["slimness enthusiast arcology", { @@ -2472,7 +2278,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.boobs < 500 && slave.butt < 3 && slave.physicalAge < 25 && slave.anus < 2); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is taken away to join the tribe of squealing, slim forms that populate the arcology of ${his} new owner.`); @@ -2483,11 +2288,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Most of your chattel could scarcely care less, but your most intelligent slaves are <span class="mediumorchid">privately dubious of your tacit support</span> for an arcology owner whose tastes they wonder about.`); + r.push(`Most of your chattel could scarcely care less, but your most intelligent slaves are <span class="devotion dec">privately dubious of your tacit support</span> for an arcology owner whose tastes they wonder about.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["body purist arcology", { @@ -2496,7 +2299,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.boobsImplant > 0 && slave.buttImplant > 0 && slave.lipsImplant > 0); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is shipped to ${his} new owner's arcology to have ${his} implants extracted and the resultant damage addressed.`); @@ -2509,11 +2311,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves burdened with gigantic implants who aren't devoted enough to bear them cheerfully <span class="mediumorchid">resent you somewhat</span> for keeping them here with aching backs.`); + r.push(`Your slaves burdened with gigantic implants who aren't devoted enough to bear them cheerfully <span class="devotion dec">resent you somewhat</span> for keeping them here with aching backs.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["degradationist arcology", { @@ -2522,7 +2322,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.trust > 20); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`Stories about the place ${he}'s going have reached ${V.arcologies[0].name}, and ${slave.slaveName} suspects the fate ${he}'s been condemned to when ${he}'s loaded into a shipping container expressly designed to keep the inmate awake and uncomfortable.`); @@ -2533,11 +2332,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other devoted or just obedient slaves are <span class="gold">suddenly afraid</span> that their obedience and their devotion is as nothing next to the fact that they are sex slaves relying on your whim.`); + r.push(`Your other devoted or just obedient slaves are <span class="trust dec">suddenly afraid</span> that their obedience and their devotion is as nothing next to the fact that they are sex slaves relying on your whim.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["paternalist arcology", { @@ -2546,7 +2343,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.intelligenceImplant < 5 && slave.devotion > 20 && slave.fetish !== "mindbroken"); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is shipped off to be improved into a happy, educated slave at the best pace ${his} new owner can manage.`); @@ -2559,11 +2355,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your unbroken, uneducated slaves who hear about this are <span class="mediumorchid">quietly resentful,</span> not understanding that ${he} was only sold to a paternalist arcology because ${he} was obedient.`); + r.push(`Your unbroken, uneducated slaves who hear about this are <span class="devotion dec">quietly resentful,</span> not understanding that ${he} was only sold to a paternalist arcology because ${he} was obedient.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["gender fundamentalist arcology", { @@ -2572,7 +2366,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.dick === 0 && slave.boobs > 800 && slave.butt > 3 && slave.devotion > 20 && (slave.intelligence + slave.intelligenceImplant < -15)); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is taken away to join the legion of airheaded, big-titted sex slaves that throng the arcology owned by ${his} purchaser.`); @@ -2583,11 +2376,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Most of your chattel could scarcely care less, but your most intelligent slaves are <span class="mediumorchid">privately skeptical of ${his} fate;</span> ${he}'s become one more cookie cutter bimbo in a place that uses and discards such sluts.`); + r.push(`Most of your chattel could scarcely care less, but your most intelligent slaves are <span class="devotion dec">privately skeptical of ${his} fate;</span> ${he}'s become one more cookie cutter bimbo in a place that uses and discards such sluts.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["gender radicalist arcology", { @@ -2596,7 +2387,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.dick > 0 && slave.face < -10 && slave.boobs < 400); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is shipped off, but ${his} buyer is so unwilling to waste any time that the shipment container includes hormonal injectors to get ${him} started on an intensive feminization regime as quickly as possible.`); @@ -2609,11 +2399,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves who retain dicks, and are not yet broken to your will, <span class="gold">fear the implication</span> that feminization is inescapable: either you'll turn them into girly sluts, or someone else will.`); + r.push(`Your slaves who retain dicks, and are not yet broken to your will, <span class="trust dec">fear the implication</span> that feminization is inescapable: either you'll turn them into girly sluts, or someone else will.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["supremacist arcology", { @@ -2622,7 +2410,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.race !== "mixed race" && slave.devotion <= 20 && slave.trust < 20); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} leaves your control forthwith, to be freed and installed in a favored life in an arcology that gives ${slave.race} people every possible advantage.`); @@ -2633,11 +2420,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`All your slaves who are not devoted to you <span class="mediumorchid">like you a little less</span> in the light of this thin beam of freedom you've allowed to shine into ${V.arcologies[0].name}.`); + r.push(`All your slaves who are not devoted to you <span class="devotion dec">like you a little less</span> in the light of this thin beam of freedom you've allowed to shine into ${V.arcologies[0].name}.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["subjugationist arcology", { @@ -2646,7 +2431,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.seePreg !== 0 && slave.race !== "mixed race" && (slave.intelligence + slave.intelligenceImplant < -50) && slave.ovaries === 1); }, percentOdds: 70, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is shipped off to help produce a race of ${slave.race} idiots to perform eternal servitude. ${He} is not perceptive enough to fear ${his} upcoming life as a downtrodden breeder.`); @@ -2657,11 +2441,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Those of your slaves who are intelligent enough to understand the implications of the scheme <span class="gold">fear all slaveholders more, and especially you,</span> since you've shown yourself willing to subject them to eugenics.`); + r.push(`Those of your slaves who are intelligent enough to understand the implications of the scheme <span class="trust dec">fear all slaveholders more, and especially you,</span> since you've shown yourself willing to subject them to eugenics.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["cheap brothel", { @@ -2670,7 +2452,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSPaternalist === "unset" && cost < 10000); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is soon seen on shift outside a seedy establishment in the lower arcology, mechanically offering ${his} holes to passersby and flinching whenever ${his} superiors come out to check on ${him}.`); @@ -2681,11 +2462,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other slave prostitutes <span class="gold">fear they'll be condemned</span> to similar exploitation in their turn.`); + r.push(`Your other slave prostitutes <span class="trust dec">fear they'll be condemned</span> to similar exploitation in their turn.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["factory farm", { @@ -2694,7 +2473,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSPaternalist === "unset" && cost < 20000 && slave.boobsImplant === 0); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is never again seen in public, but ${his} fate is obvious: ${he}'s chained to a milking rack somewhere in a cavernous factory farm, with milk draining from ${his}`); @@ -2712,11 +2490,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other slaves are <span class="gold">afraid they'll end up like that too,</span> since the factory farms will buy almost anyone. Only your devoted slaves trust you to spare them such a fate.`); + r.push(`Your other slaves are <span class="trust dec">afraid they'll end up like that too,</span> since the factory farms will buy almost anyone. Only your devoted slaves trust you to spare them such a fate.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["arcade", { @@ -2725,7 +2501,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSPaternalist === "unset" && cost < 5000); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`The upper half of ${slave.slaveName}'s body is never seen again. ${His} butt, on the other hand, is periodically visible in a lower-level arcade, ${his} orifices gradually showing the wear and ${his} price gradually decreasing, until finally ${he} is seen no more.`); @@ -2736,11 +2511,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your devoted slaves are fairly confident they will escape such a fate, but everyone else <span class="gold">is terrified of ending that way.</span>`); + r.push(`Your devoted slaves are fairly confident they will escape such a fate, but everyone else <span class="trust dec">is terrified of ending that way.</span>`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["volume breeder", { @@ -2749,7 +2522,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.seePreg !== 0 && V.arcologies[0].FSPaternalist === "unset" && cost < 10000 && slave.health.condition > 40 && slave.ovaries === 1); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`The breeder already has stud stock, and ${slave.slaveName} is rapidly impregnated. ${He}'s kept in a stockyard on the lower service levels of the arcology, one of a dense crowd of beaten-down women with gravid bellies.`); @@ -2760,11 +2532,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other fertile slaves <span class="gold">fear they'll be sold as breeding stock</span> if they fail to make themselves useful to you otherwise.`); + r.push(`Your other fertile slaves <span class="trust dec">fear they'll be sold as breeding stock</span> if they fail to make themselves useful to you otherwise.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["nice brothel", { @@ -2773,7 +2543,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSDegradationist === "unset" && cost > 20000); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} disappears for a time as ${his} training is perfected, but ${he} reappears in the refined brothel, wearing classy clothes and flirting gracefully with patrons of ${his} body.`); @@ -2784,11 +2553,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other slave prostitutes <span class="mediumaquamarine">hope they'll be lucky enough</span> to find themselves in relatively decent circumstances too, should you decide to sell them.`); + r.push(`Your other slave prostitutes <span class="trust inc">hope they'll be lucky enough</span> to find themselves in relatively decent circumstances too, should you decide to sell them.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["free range", { @@ -2797,7 +2564,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.arcologies[0].FSDegradationist === "unset" && cost < 50000 && slave.boobsImplant === 0 && slave.health.condition > 40); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName} is a common sight around the arcology, since free range cows are allowed to range between milkings. ${He} seems reasonably content.`); @@ -2808,11 +2574,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other cows <span class="mediumaquamarine">hope they'll be lucky enough</span> to find themselves in relatively decent circumstances too, should you decide to sell them.`); + r.push(`Your other cows <span class="trust inc">hope they'll be lucky enough</span> to find themselves in relatively decent circumstances too, should you decide to sell them.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["harvester", { @@ -2821,15 +2585,12 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.chem < 50 && slave.health.condition > 40 && cost < 5000); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; - r.push(`Though ${slave.slaveName}'s fate as a source of organs for transplantation is not announced, rumors of what happens to those who <span class="gold">fail to be valuable to you</span> pass among your slaves.`); + r.push(`Though ${slave.slaveName}'s fate as a source of organs for transplantation is not announced, rumors of what happens to those who <span class="trust dec">fail to be valuable to you</span> pass among your slaves.`); for (const s of V.slaves) { s.trust -= 2; } - - App.Events.addNode(el, r); - return el; + return r; } }], ["fuckdoll", { @@ -2838,16 +2599,12 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (cost < 5000); }, percentOdds: 50, get completeSale() { - const el = new DocumentFragment(); const r = []; - r.push(`Though ${slave.slaveName}'s fate as a living fucktoy is not obvious, since most of ${his} body will forever after be encased in thick latex, rumors of what happens to those who <span class="gold">fail to be valuable to you</span> pass among your slaves.`); - + r.push(`Though ${slave.slaveName}'s fate as a living fucktoy is not obvious, since most of ${his} body will forever after be encased in thick latex, rumors of what happens to those who <span class="trust dec">fail to be valuable to you</span> pass among your slaves.`); for (const s of V.slaves) { s.trust -= 2; } - - App.Events.addNode(el, r); - return el; + return r; } }], ["tentacle bred", { @@ -2856,7 +2613,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.seeExtreme === 1 && cost < 5000 && slave.vagina > -1 && slave.bellyImplant > -1); }, percentOdds: 90, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`Sometime later, a snuff film starring ${slave.slaveName} as a heroine captured, raped, and fatally bred by tentacles is released. It receives rave reviews for the scene involving ${slave.slaveName}, depicting ${his} aphrodisiac-filled body being penetrated in all ${his} holes by tentacles. Their thrusting into ${him} increases until large bulges of cum pass through the ones filling ${his} stretched cunt, visibly bloating ${his} belly. ${He} then collapses to the ground, ${his} swollen belly rapidly growing with the tentacle spawn gestating within ${him}. As they bulge against the straining walls of ${his} implant-filled middle; ${he} lets out a final moan as ${his} belly ruptures, releasing ${his} "spawn" to hunt down the other heroines.`); @@ -2869,11 +2625,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your less than intelligent slaves are <span class="mediumorchid">deeply envious</span> of ${slave.slaveName}, completely failing to comprehend what they saw were not special effects.`); + r.push(`Your less than intelligent slaves are <span class="devotion dec">deeply envious</span> of ${slave.slaveName}, completely failing to comprehend what they saw were not special effects.`); } - - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }], @@ -2895,7 +2649,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.hears === -2); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`As ${slave.slaveName} now spends all ${his} time backstage, ${he}'s rarely seen again. Occasionally, however, a roadie will bring ${him} outside as he hauls the equipment, and ${he} jacks him off.`); @@ -2906,11 +2659,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves with hearing problems <span class="mediumaquamarine">take some solace</span> in the idea of being bought because of their disability, not in spite of it.`); + r.push(`Your slaves with hearing problems <span class="trust inc">take some solace</span> in the idea of being bought because of their disability, not in spite of it.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["etiquette coach", { @@ -2919,7 +2670,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (slave.sexualFlaw === "crude"); }, percentOdds: 60, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`${slave.slaveName}'s new etiquette trainer sends you courtesy updates on ${his} progress, as ${he} learns proper poise and enunciation, the correct locations of silverware, and how to avoid making vulgar comments while performing lascivious acts.`); @@ -2930,11 +2680,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your other slaves lacking in manners consider being turned into a proper member of polite society <span class="gold">a fate wore than death.</span>`); + r.push(`Your other slaves lacking in manners consider being turned into a proper member of polite society <span class="trust dec">a fate wore than death.</span>`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ["sniper spotter", { @@ -2943,7 +2691,6 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (hasBothEyes(slave) && canSeePerfectly(slave) && isSlim(slave)); }, percentOdds: 65, get completeSale() { - const el = new DocumentFragment(); const r = []; let slaveImpact; r.push(`The mercenary sniper greets ${slave.slaveName} before the two of them head off for a battlefield halfway around the world. "Let's hope you've got a good eye for political assassinations," he says humorlessly.`); @@ -2954,11 +2701,9 @@ new App.DomPassage("Sell Slave", () => { } } if (slaveImpact === 1) { - r.push(`Your slaves lacking in combat skills don't envy ${him}, and <span class="gold">in fact seem very worried</span> that they may share ${his} fate.`); + r.push(`Your slaves lacking in combat skills don't envy ${him}, and <span class="trust dec">in fact seem very worried</span> that they may share ${his} fate.`); } - - App.Events.addNode(el, r); - return el; + return r; } }], ]); @@ -2974,11 +2719,10 @@ new App.DomPassage("Sell Slave", () => { get requirements() { return (V.plot && V.peacekeepers && V.peacekeepers.strength >= 50); }, percentOdds: 100, get completeSale() { - const el = new DocumentFragment(); + const r = []; if (V.peacekeepers === 0) { - return el; + return r; } - const r = []; r.push(`${slave.slaveName} is delivered to General ${V.peacekeepers.generalName}'s forces, to serve as a barracks whore. Several days later, the purchasing officer forwards a short shot of ${slave.slaveName}`); cost = slaveCost(slave); @@ -3117,8 +2861,7 @@ new App.DomPassage("Sell Slave", () => { } else { r.push(`General ${V.peacekeepers.generalName}'s little empire continues to be a reliable client state of ${V.arcologies[0].name}, and a good market for ${V.peacekeepers.tastes}.`); } - App.Events.addNode(el, r); - return el; + return r; }, allowsBoomerang: false }); @@ -3166,7 +2909,7 @@ new App.DomPassage("Sell Slave", () => { desc = ` from a citizen interested in acquiring a skilled cocksucker.`; } else if ((slave.health.condition > 80) && (random(1, 100) > 80)) { desc = ` from a citizen who pays creepily close attention to the state of ${his} health, and ignores everything else.`; - } else if ((slave.nationality !== 0) && (random(1, 100) > 80)) { + } else if (slave.nationality && (random(1, 100) > 80)) { desc = ` from a citizen with a special appetite for ${moreNational(slave.nationality)} ${girl}s.`; } if (desc) { @@ -3179,4 +2922,4 @@ new App.DomPassage("Sell Slave", () => { } return buyers; } -}); +}; diff --git a/src/uncategorized/discardConfirm.tw b/src/uncategorized/discardConfirm.tw deleted file mode 100644 index a98e63d2ca6..00000000000 --- a/src/uncategorized/discardConfirm.tw +++ /dev/null @@ -1,7 +0,0 @@ -:: Discard Confirm [nobr] -<<run App.Utils.setLocalPronouns(getSlave($AS))>> - -This will permanently remove <<= getSlave($AS).slaveName>> from the game, and you will not receive any money for $him. This is primarily intended as a way to rid yourself of bugged slaves. Are you certain? - -<br><br><<link "Discard $him" "Sell Slave">><</link>> -<br><br>[[Cancel|Slave Interact]] \ No newline at end of file -- GitLab