diff --git a/js/002-config/fc-js-init.js b/js/002-config/fc-js-init.js index ab834eafafc92ce7e48c6b4e57278eca99647daf..9df9b04d98527041e66b1d6be969d5455e1c7b82 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 0000000000000000000000000000000000000000..ed15c7c3d27cea282a90a88213c822a2e1fa558d --- /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 0000000000000000000000000000000000000000..c4c441ebc57d1b685a54f25e6ca058631b090476 --- /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 942f044f99e1ac2856abb0d1eeebde36b284d65b..7d978cb8af48a2609b8d89737d1bc84dbef65785 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 a98e63d2ca643080ca4c94d7b92d76ad13515a46..0000000000000000000000000000000000000000 --- 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