diff --git a/devTools/types/FC/RA.d.ts b/devTools/types/FC/RA.d.ts index a7dbfbbdaf7ea25173b7eec3cf496466a3aaa078..c68f19732dd74ff2a61b640979e08fa4babd569b 100644 --- a/devTools/types/FC/RA.d.ts +++ b/devTools/types/FC/RA.d.ts @@ -92,7 +92,6 @@ declare namespace FC { dickAccessory: string; bellyAccessory: string; aVirginButtplug: string; - buttplug: string; vaginalAttachment: string; buttplugAttachment: string; iris: string; diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js index b9681730add67c3985bb75a6587d6c06b233d919..acce98a8329fa781d6d392059ee753aa1f261429 100644 --- a/js/003-data/slaveWearData.js +++ b/js/003-data/slaveWearData.js @@ -1063,37 +1063,6 @@ App.Data.slaveWear = { ] ]), - buttplugs: new Map([ - ["none", {name: "None"}], - ["plug", {name: "Standard plug"}], - ["long plug", - { - name: "Long plug", - get requirements() { - return V.boughtItem.toys.buttPlugs === 1; - } - } - ], - ["large plug", {name: "Large plug"}], - ["long, large plug", - { - name: "Long, large plug", - get requirements() { - return V.boughtItem.toys.buttPlugs === 1; - } - } - ], - ["huge plug", {name: "Huge plug"}], - ["long, huge plug", - { - name: "Long, huge plug", - get requirements() { - return V.boughtItem.toys.buttPlugs === 1; - } - } - ] - ]), - buttplugAttachments: new Map([ ["none", {name: "None"}], ["tail", @@ -1221,6 +1190,80 @@ App.Data.shoes = new Map([ // TODO: add lift property ], ]); +/** + * @typedef {object} slaveButtplugs + * @property {string} name + * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS. + * @property {boolean} [requirements] + * @property {boolean} [harsh] + * @property {0|1|2|3} width height in cm. Adds to heel height. + * @property {0|1|2} length height in cm. Over 4cm they may totter. 21cm and over (8 inch heels) will be painful/extreme + */ + +/** + * @type {Map<string, slaveButtplugs>} slaveShoesCategory + */ +App.Data.buttplugs = new Map([ + ["none", + { + name: "None", + width: 0, + length: 0 + } + ], + ["plug", + { + name: "Standard plug", + width: 1, + length: 1 + } + ], + ["long plug", + { + name: "Long plug", + get requirements() { + return V.boughtItem.toys.buttPlugs === 1; + }, + width: 1, + length: 2 + } + ], + ["large plug", + { + name: "Large plug", + width: 2, + length: 1 + } + ], + ["long, large plug", + { + name: "Long, large plug", + get requirements() { + return V.boughtItem.toys.buttPlugs === 1; + }, + width: 2, + length: 2 + } + ], + ["huge plug", + { + name: "Huge plug", + width: 3, + length: 1 + } + ], + ["long, huge plug", + { + name: "Long, huge plug", + get requirements() { + return V.boughtItem.toys.buttPlugs === 1; + }, + width: 3, + length: 2 + } + ] +]); + /** * @typedef {object} slaveWearChastity * @property {string} name diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js index 0abf5f1e2b96472cc80935c0cbb4f286ccb32cd6..30075c19d6384c3c14d08d3fd865829da542269d 100644 --- a/src/endWeek/saClothes.js +++ b/src/endWeek/saClothes.js @@ -1127,7 +1127,8 @@ App.SlaveAssignment.clothes = (function() { * */ function analAccessories(slave) { - if (slave.buttplug === "plug" || slave.buttplug === "long plug") { + const plugDiameter = plugWidth(slave); + if (plugDiameter === 1) { if (["cat tail", "cow tail", "fox tail", "tail"].includes(slave.buttplugAttachment)) { if (slave.fuckdoll === 0 && slave.fetish !== "mindbroken") { if (slave.anus < 1) { @@ -1142,7 +1143,7 @@ App.SlaveAssignment.clothes = (function() { r.push(`It <span class="green">gets ${him} habituated to having ${his} asshole filled.</span>`); slave.sexualFlaw = "none"; } - if (slave.sexualQuirk === "size queen" && slave.buttplug === "long plug") { + if (slave.sexualQuirk === "size queen" && plugLength(slave) > 1) { r.push(`The overly long plug delving the depths of ${his} rear <span class="hotpink">gets ${him} off,</span> since ${he}'s a size queen.`); slave.devotion += 2; } @@ -1159,13 +1160,13 @@ App.SlaveAssignment.clothes = (function() { r.push(`It <span class="green">gets ${him} habituated to having ${his} asshole filled.</span>`); slave.sexualFlaw = "none"; } - if (slave.sexualQuirk === "size queen" && slave.buttplug === "long plug") { + if (slave.sexualQuirk === "size queen" && plugLength(slave) > 1) { r.push(`The overly long plug delving the depths of ${his} rear <span class="hotpink">gets ${him} off,</span> since ${he}'s a size queen.`); slave.devotion += 2; } } } - } else if (slave.buttplug === "large plug" || slave.buttplug === "long, large plug") { + } else if (plugDiameter === 2) { if (["cat tail", "cow tail", "fox tail", "tail"].includes(slave.buttplugAttachment)) { if (slave.fuckdoll === 0 && slave.fetish !== "mindbroken") { if (slave.anus < 2) { @@ -1233,7 +1234,7 @@ App.SlaveAssignment.clothes = (function() { } } } - } else if (slave.buttplug === "huge plug" || slave.buttplug === "long, huge plug") { + } else if (plugDiameter === 3) { if (["cat tail", "cow tail", "fox tail", "tail"].includes(slave.buttplugAttachment)) { if (slave.anus < 4) { if (slave.fuckdoll === 0 && slave.fetish !== "mindbroken") { @@ -1308,7 +1309,7 @@ App.SlaveAssignment.clothes = (function() { slave.fetishStrength = 10; } } - } else if (slave.buttplug === "plug" || slave.buttplug === "large plug" || slave.buttplug === "long, large plug" || slave.buttplug === "long plug") { + } else if (plugWidth(slave) > 0) { if (slave.fetish === "buttslut" && slave.fetishKnown === 0) { r.push(`${He} shows a surprising lack of resistance to the routine of getting the plug up ${his} butt in the morning; ${he} seems to <span class="lightcoral">naturally enjoy anal stimulation.</span>`); slave.fetishKnown = 1; diff --git a/src/endWeek/saLongTermMentalEffects.js b/src/endWeek/saLongTermMentalEffects.js index ef0b21b94079e76f3a3a5bde86457534c72fa49a..cc3ceb57302550bd13e9e83ef9d0b3226734c6bc 100644 --- a/src/endWeek/saLongTermMentalEffects.js +++ b/src/endWeek/saLongTermMentalEffects.js @@ -1337,7 +1337,7 @@ App.SlaveAssignment.longTermMentalEffects = (function() { } else if (V.suppository !== 0) { r.push(`${His} paraphilia is satisfied by the way ${he} gets to take medication.`); App.EndWeek.saVars.paraphiliaSatisfied = 1; - } else if (slave.buttplug === "huge plug" || slave.buttplug === "long, huge plug") { + } else if (plugWidth(slave) > 2) { r.push(`${His} paraphilia is satisfied by the enormous plug ${he} wears in ${his} ass.`); App.EndWeek.saVars.paraphiliaSatisfied = 1; } else if (slave.assignment === "work in the dairy" && V.dairyStimulatorsSetting > 0) { diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js index 65fbc8197b8a59efaa794ceebb7afed0630a30a6..b900d14cad38a796c175906622d970b80024d41e 100644 --- a/src/endWeek/saLongTermPhysicalEffects.js +++ b/src/endWeek/saLongTermPhysicalEffects.js @@ -236,7 +236,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { if (slave.vagina >= 3 && !["huge dildo", "large dildo", "long, huge dildo", "long, large dildo"].includes(slave.vaginalAccessory)) { r.push(`With a rest from strenuous use, <span class="improvement">${his} loose vagina recovers a little.</span>`); slave.vagina -= 1; - } else if (slave.anus >= 3 && !["huge plug", "large plug", "long, huge plug", "long, large plug"].includes(slave.buttplug)) { + } else if (slave.anus >= 3 && plugWidth(slave) < 2) { r.push(`With a rest from continual sodomy, <span class="improvement">${his} gaping anus recovers a little.</span>`); slave.anus -= 1; } diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js index 512c0f0950ba6da3dfea24604f229c5314722932..516e06e3e8e2d7ac1e6af9de0ef477bf78c4d90e 100644 --- a/src/interaction/main/walkPast.js +++ b/src/interaction/main/walkPast.js @@ -8376,10 +8376,10 @@ globalThis.walkPast = (function() { } if ((slave.vaginalAccessory === "long dildo") || (slave.vaginalAccessory === "long, large dildo") || (slave.vaginalAccessory === "long, huge dildo")) { t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`; - if ((slave.buttplug === "long plug") || (slave.buttplug === "long, large plug") || (slave.buttplug === "long, huge plug")) { + if (plugLength(slave) > 1) { t += `Beside it, a second bulge caused by ${his} extra long buttplug.`; } - } else if ((slave.buttplug === "long plug") || (slave.buttplug === "long, large plug") || (slave.buttplug === "long, huge plug")) { + } else if (plugLength(slave) > 1) { t += `With every motion ${he} makes, ${his} buttplug shifts, bulging out ${his} stomach.`; } @@ -8966,10 +8966,10 @@ globalThis.walkPast = (function() { } if ((slave.vaginalAccessory === "long dildo") || (slave.vaginalAccessory === "long, large dildo") || (slave.vaginalAccessory === "long, huge dildo")) { t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`; - if ((slave.buttplug === "long plug") || (slave.buttplug === "long, large plug") || (slave.buttplug === "long, huge plug")) { + if (plugLength(slave) > 1) { t += `Beside it, a second bulge caused by ${his} extra long buttplug.`; } - } else if ((slave.buttplug === "long plug") || (slave.buttplug === "long, large plug") || (slave.buttplug === "long, huge plug")) { + } else if (plugLength(slave) > 1) { t += `With every motion ${he} makes, ${his} buttplug shifts, bulging out ${his} stomach.`; } diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js index 5d4f914ce1e79c5ad93b0351728babbfc360dd92..6db2efd28da4339f90816a23490cfeb35002f723 100644 --- a/src/interaction/siWardrobe.js +++ b/src/interaction/siWardrobe.js @@ -492,9 +492,10 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } el.appendChild(label); - let optionsArray = []; + let normalArray = []; + let longArray = []; - for (const [key, object] of App.Data.slaveWear.buttplugs) { + for (const [key, object] of App.Data.buttplugs) { if (key === "none") { // skip none in set, we set the link elsewhere. continue; @@ -504,17 +505,19 @@ App.UI.SlaveInteract.wardrobe = function(slave) { updateSlave: {buttplug: key}, FS: object.fs, }; - optionsArray.push(reshapedItem); + if (object.length > 1) { + longArray.push(reshapedItem); + } else { + normalArray.push(reshapedItem); + } } // Sort // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Options - let links = document.createElement('div'); - links.className = "choices"; - links.appendChild(generateRows(optionsArray, "buttplug", true)); - el.appendChild(links); + App.UI.DOM.appendNewElement("div", el, generateRows(normalArray, "buttplug", true), "choices"); + App.UI.DOM.appendNewElement("div", el, generateRows(longArray, "buttplug", true), "choices"); return el; } diff --git a/src/js/eventSelectionJS.js b/src/js/eventSelectionJS.js index 69d25cc39e3de80951bf931d8a0367b404dfd774..de1809507cc92c5ac159594ed6110b4d5fca8c19 100644 --- a/src/js/eventSelectionJS.js +++ b/src/js/eventSelectionJS.js @@ -991,7 +991,7 @@ globalThis.generateRandomEventPoolStandard = function(eventSlave) { } } - if (["huge plug", "large plug", "long, huge plug", "long, large plug"].includes(eventSlave.buttplug)) { + if (plugWidth(eventSlave) > 1) { if (eventSlave.assignment !== Job.CONFINEMENT && isSlaveAvailable(eventSlave)) { if (eventSlave.devotion <= 20) { if (eventSlave.trust >= -50) { @@ -2049,7 +2049,7 @@ globalThis.generateRandomEventPoolServant = function(eventSlave) { } } - if (["huge plug", "large plug", "long, huge plug", "long, large plug"].includes(eventSlave.buttplug)) { + if (plugWidth(eventSlave) > 1) { if (isSlaveAvailable(eventSlave)) { if (eventSlave.devotion <= 20) { if (eventSlave.trust >= -50) { diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js index c5a1940e32584378eb2bb81ff924d7196a2c7afa..3721d2bf853d8c39bb4ea85fc3bd070776488a5e 100644 --- a/src/js/itemAvailability.js +++ b/src/js/itemAvailability.js @@ -28,7 +28,7 @@ globalThis.isItemAccessible = (function() { selectedDB = App.Data.slaveWear.bellyAccessories; break; case "buttplug": - selectedDB = App.Data.slaveWear.buttplugs; + selectedDB = App.Data.buttplugs; break; case "buttplugAttachment": selectedDB = App.Data.slaveWear.buttplugAttachments; diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 7bf0077d52297b8434d0519b6134dcc5d3360f2b..294b86564f30c9595c969fb68c540dbb72a02da9 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -2000,7 +2000,7 @@ App.RA.options = (function() { class ButtplugsVirginsList extends ListSelector { constructor() { - super("Buttplugs for anal virgins", isItemAccessible.array(App.Data.slaveWear.buttplugs)); + super("Buttplugs for anal virgins", isItemAccessible.array(App.Data.buttplugs)); this.setValue(current_rule.set.aVirginButtplug); this.onchange = (value) => current_rule.set.aVirginButtplug = value; } @@ -2008,7 +2008,7 @@ App.RA.options = (function() { class ButtplugsOtherList extends ListSelector { constructor() { - super("Buttplugs for other slaves", isItemAccessible.array(App.Data.slaveWear.buttplugs)); + super("Buttplugs for other slaves", isItemAccessible.array(App.Data.buttplugs)); this.setValue(current_rule.set.buttplug); this.onchange = (value) => current_rule.set.buttplug = value; } diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js index 7120c7da44d566ce1e591c7c552b8416b2a09ee5..5dfda9f45376541bcf3a49cdc56a67136472f72a 100644 --- a/src/js/utilsAssessSlave.js +++ b/src/js/utilsAssessSlave.js @@ -269,3 +269,21 @@ globalThis.shoeHeight = function(slave) { return heelHeight + platformHeight; }; +/** + * @param {App.Entity.SlaveState} slave + * @returns {0|1|2|3} + */ +globalThis.plugWidth = function(slave) { + return App.Data.buttplugs.get(slave.buttplug) ? App.Data.buttplugs.get(slave.buttplug).width : 0; +}; + +/** + * @param {App.Entity.SlaveState} slave + * @returns {0|1|2|3} + */ +globalThis.plugLength = function(slave) { + return App.Data.buttplugs.get(slave.buttplug) ? App.Data.buttplugs.get(slave.buttplug).length : 0; +}; + + + diff --git a/src/npc/interaction/fFeelings.tw b/src/npc/interaction/fFeelings.tw index dafa73b59919e7683d3d7612d05beff52e6b412b..7aab4a8cbafc394567c3d42d5fae3986def5a249 100644 --- a/src/npc/interaction/fFeelings.tw +++ b/src/npc/interaction/fFeelings.tw @@ -569,11 +569,11 @@ My favorite part of my body i<<s>> I'm <<s>>o horny, <<Master>>. I can't <<s>>top <<s>>taring at <<if $PC.dick != 0>>cock<<s>> and imagining them down my throat, cumming and cumming<<else>>pu<<ss>>ie<<s>> and imagining how their jui<<c>>e<<s>> <<if canTaste(getSlave($AS))>>ta<<s>>te<<else>>feel on my <<s>>kin<</if>><</if>>. <<case "buttslut">> I'm <<s>>o horny, <<Master>>. - <<if (["long plug", "plug"].includes(getSlave($AS).buttplug) && getSlave($AS).anus > 2) >> + <<if (plugWidth(getSlave($AS)) == 1) && getSlave($AS).anus > 2) >> I wear the buttplug you gave me, but it i<<s>> <<s>>o <<s>>mall... It remind<<s>> me of being fucked in the a<<ss>>, but I can barely feel it. It drive<<s>> me crazy. - <<elseif (["long plug", "plug"].includes(getSlave($AS).buttplug) && getSlave($AS).anus < 3) || (["large plug", "long, large plug"].includes(getSlave($AS).buttplug) && getSlave($AS).anus == 3) || (["huge plug", "long, huge plug"].includes(getSlave($AS).buttplug) && getSlave($AS).anus >= 4) >> + <<elseif (plugWidth(getSlave($AS)) == 1 && getSlave($AS).anus < 3) || plugWidth(getSlave($AS)) == 2 && getSlave($AS).anus == 3) || plugWidth(getSlave($AS)) == 3 && getSlave($AS).anus >= 4) >> Thank you for the buttplug. It i<<s>> really fun to have my a<<ss>> filled all day long. - <<elseif (["large plug", "long, large plug"].includes(getSlave($AS).buttplug) && getSlave($AS).anus < 3) || (["huge plug", "long, huge plug"].includes(getSlave($AS).buttplug) && getSlave($AS).anus < 4) >> + <<elseif (plugWidth(getSlave($AS)) == 2 && getSlave($AS).anus < 3) || plugWidth(getSlave($AS)) > 2 && getSlave($AS).anus < 4) >> I like it up the a<<ss>>, but the plug you make me wear i<<s>> too big. It really hurt<<s>>. Not in the good way. <<else>> My anu<<s>> i<<s>> killing me, all I want to do i<<s>> touch it and ma<<ss>>age it and fill it. diff --git a/src/uncategorized/reShelterInspection.tw b/src/uncategorized/reShelterInspection.tw index 7fdff1f7b9884a92e64689854e17ca09cc5c7aec..95f4f03261840e4baecb41e7d509c16a664b9ee0 100644 --- a/src/uncategorized/reShelterInspection.tw +++ b/src/uncategorized/reShelterInspection.tw @@ -425,7 +425,7 @@ Not waiting to be greeted, the inspector looks up at the nearest camera and dema <br><br> <<run Enunciate(_Inspectee)>> <<if (_Inspectee.devotion < 10)>> - <<if (_Inspectee.buttplug == "large plug") || (_Inspectee.buttplug == "huge plug") || (_Inspectee.buttplug == "long, large plug") || (_Inspectee.buttplug == "long, huge plug")>> + <<if (plugWidth(_slave) > 1)>> "W-well," $he says, "I wear a buttplug." The inspector frowns. <<run Enunciate(_slave)>> "A buttplug <<sh>>ouldn't do that!" @@ -447,7 +447,7 @@ Not waiting to be greeted, the inspector looks up at the nearest camera and dema The slave looks worried and replies, "I-it'<<s>> a hole, right? I get fucked in all my hole<<s>>." The inspector is not amused. _He2 offers you a few choice words, makes notes on _his2 tablet, and storms out. <</if>> <<else>> - <<if (_Inspectee.buttplug == "large plug") || (_Inspectee.buttplug == "huge plug") || (_Inspectee.buttplug == "long, large plug") || (_Inspectee.buttplug == "long, huge plug")>> + <<if (plugWidth(_slave) > 1)>> "I wear a buttplug!" $he says confidently. The inspector frowns. <<run Enunciate(_slave)>> "A buttplug <<sh>>ouldn't do that!"