diff --git a/chastity/belt/belt_livingwood.js b/chastity/belt/belt_livingwood.js index 87a4405f..251b712b 100644 --- a/chastity/belt/belt_livingwood.js +++ b/chastity/belt/belt_livingwood.js @@ -1,4 +1,5 @@ const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getChastityBra } = require("../../functions/vibefunctions.js"); // Livingwood Belt // This belt has a higher growth coefficient. Notably however, @@ -6,28 +7,32 @@ const { getUserVar, setUserVar } = require("../../functions/usercontext") // or every 15 minutes, until the wearer successfully orgasms. exports.growthCoefficient = (data) => { return 1 } exports.decayCoefficient = (data) => { return 0.1 } -exports.minVibe = (data) => { - return Math.max(Math.min(Math.floor((Date.now() - (getUserVar(data.userID, "livingwoodbelt") ?? Date.now())) / 900000), 20), getUserVar(data.userID, "livingwoodvibe")) +// Never Fully Clear Arousal +exports.minArousal = (data) => { return 0.5 } +exports.minVibe = function(data) { + return Math.max(Math.min(Math.floor((Date.now() - (getUserVar(data.userID, "livingwood_chastity") ?? Date.now())) / 900000), 20), getUserVar(data.userID, "livingwood_vibe")) } -// Note, we must use a regular function context to retrieve a this correctly. -exports.onOrgasm = function(data) { - setUserVar(data.userID, "livingwoodvibe", Math.max((this.minVibe(data) - 10), 0)) - setUserVar(data.userID, "livingwoodbelt", Date.now()); +exports.onOrgasm = (data) => { + setUserVar(data.userID, "livingwood_vibe", Math.max((this.minVibe(data) - 10), 0)) + setUserVar(data.userID, "livingwood_chastity", Date.now()); } -exports.onFailedOrgasm = function(data) { - console.log(this); - setUserVar(data.userID, "livingwoodvibe", Math.min((this.minVibe(data) + 1), 20)); +exports.onFailedOrgasm = (data) => { + //console.log(this); + setUserVar(data.userID, "livingwood_vibe", Math.min((this.minVibe(data) + 1), 20)); } exports.onEquip = (data) => { - setUserVar(data.userID, "livingwoodvibe", 0); - setUserVar(data.userID, "livingwoodbelt", Date.now()); + if (!getUserVar(data.userID, "livingwood_vibe") || getUserVar(data.userID, "livingwood_vibe") == undefined) setUserVar(data.userID, "livingwood_vibe", 0); + if (!getUserVar(data.userID, "livingwood_chastity") || getUserVar(data.userID, "livingwood_chastity") == undefined) setUserVar(data.userID, "livingwood_chastity", Date.now()); } exports.onUnequip = (data) => { - setUserVar(data.userID, "livingwoodvibe", 0); - setUserVar(data.userID, "livingwoodbelt", Date.now()); + // Check if user is wearing a Livingwood Bra otherwise Null Out Vars + if (!getChastityBra(data.userID)?.chastitytype != "bra_livingwood") { + setUserVar(data.userID, "livingwood_vibe", undefined); + setUserVar(data.userID, "livingwood_chastity", undefined); + } } +// Tags exports.tags = ["living"] - // Name exports.name = "Livingwood Belt" \ No newline at end of file diff --git a/chastity/belt/belt_seal_air.js b/chastity/belt/belt_seal_air.js new file mode 100644 index 00000000..e195eb14 --- /dev/null +++ b/chastity/belt/belt_seal_air.js @@ -0,0 +1,23 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { addArousal } = require("../../functions/vibefunctions") + +// Seal of the Capricious Breeze +// This Seal randomly adds an amount of arousal between 0 and the Wearer's current value when orgasming +// No Increase to denial when worn +exports.denialCoefficient = (data) => { return 1 } +exports.growthCoefficient = (data) => { return 1.5 } +exports.decayCoefficient = (data) => { return 0.15 } + +// Orgasm Cooldown randomised between 0 and 2x default +exports.orgasmCooldown = (data) => { return 2 * Math.random() } + +// Events +// Randomly reduce the level of arousal by a random percentage, then reduce by a further 10% +exports.onOrgasm = (data) => { + addArousal(data.userID, data.prevArousal * Math.random() * 0.9); +} + +// Tags +exports.tags = ["seal"] +// Name +exports.name = "Seal of the Capricious Breeze" \ No newline at end of file diff --git a/chastity/belt/belt_seal_earth.js b/chastity/belt/belt_seal_earth.js new file mode 100644 index 00000000..d9ec2bad --- /dev/null +++ b/chastity/belt/belt_seal_earth.js @@ -0,0 +1,38 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getArousal, addArousal } = require("../../functions/vibefunctions") + +// Seal of the Unmoving Stone +// This Seal locks the user's arousal to within a small range of their current level. The Range shifts gradually as they remain above or below the median. Also doubles the Orgasm Cooldown +exports.growthCoefficient = (data) => { return 1 } +exports.decayCoefficient = (data) => { return 1 } +exports.orgasmCooldown = (data) => { return 2 } +exports.denialCoefficient = (data) => { return 1 } + +// Set Min Arousal to be equal to the base Arousal + 5% when equipped +exports.minArousal = function(data) { return getUserVar(data.userID, "base_arousal") * 0.90} +exports.maxArousal = function(data) { return getUserVar(data.userID, "base_arousal") * 1.10} + +// Events +exports.onOrgasm = (data) => { + // Maintain Arousal level and Increase Base Arousal to raise cap as the 'rock' jolts slightly forwards + addArousal(data.userID, getUserVar(data.userID, "base_arousal")); + setUserVar(data.userID, "base_arousal", getUserVar(data.userID, "base_arousal") * 1.1) + console.log(getUserVar(data.userID, "base_arousal")) +} +exports.afterArousalChange = (data) => { + // Earth only allows slow shifts in the arousal values regardless of vibe strength + if(getArousal(data.userID) > getUserVar(data.userID, "base_arousal")) setUserVar(data.userID, "base_arousal", Math.max(getUserVar(data.userID, "base_arousal") * 1.02, getUserVar(data.userID, "base_arousal") + 0.01)) + else if(getArousal(data.userID) < getUserVar(data.userID, "base_arousal")) setUserVar(data.userID, "base_arousal", Math.max(Math.min(getUserVar(data.userID, "base_arousal") * 0.98, getUserVar(data.userID, "base_arousal") - 0.01), 0)) +} +exports.onEquip = (data) => { + // Configure base arousal value + if (!getUserVar(data.userID, "base_arousal") || getUserVar(data.userID, "base_arousal") == undefined) setUserVar(data.userID, "base_arousal", getArousal(data.userID)); +} +exports.onUnequip = (data) => { + setUserVar(data.userID, "base_arousal", undefined); +} + +// Tags +exports.tags = ["seal"] +// Name +exports.name = "Seal of the Unmoving Stone" \ No newline at end of file diff --git a/chastity/belt/belt_seal_fire.js b/chastity/belt/belt_seal_fire.js new file mode 100644 index 00000000..f6966707 --- /dev/null +++ b/chastity/belt/belt_seal_fire.js @@ -0,0 +1,34 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getArousal, addArousal } = require("../../functions/vibefunctions") + +// Seal of the Ardent Flame +// This Seal locks the user's min arousal at their current level, and increases the growth coefficient along with reducing the decay rate. Also halves the Orgasm Cooldown +exports.growthCoefficient = (data) => { return 3 } +exports.decayCoefficient = (data) => { return 0.6 } +exports.orgasmCooldown = (data) => { return 0.5 } +exports.denialCoefficient = (data) => { return 1 } + +// Set Min Arousal to be equal to the initial Arousal when equipped +exports.minArousal = function(data) { return getUserVar(data.userID, "base_arousal") } + +// Events +exports.onOrgasm = (data) => { + // Reset Arousal to Base + addArousal(data.userID, getUserVar(data.userID, "base_arousal")); +} +exports.onFailedOrgasm = (data) => { + // Add a small amount of arousal with each failed attempt + addArousal(data.userID, 2 * Math.random()); +} +exports.onEquip = (data) => { + // Configure base arousal value + if (!getUserVar(data.userID, "base_arousal") || getUserVar(data.userID, "base_arousal") == undefined) setUserVar(data.userID, "base_arousal", getArousal(data.userID)); +} +exports.onUnequip = (data) => { + setUserVar(data.userID, "base_arousal", undefined); +} + +// Tags +exports.tags = ["seal"] +// Name +exports.name = "Seal of the Ardent Flame" \ No newline at end of file diff --git a/chastity/belt/belt_seal_ice.js b/chastity/belt/belt_seal_ice.js new file mode 100644 index 00000000..fab2574e --- /dev/null +++ b/chastity/belt/belt_seal_ice.js @@ -0,0 +1,38 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getArousal, addArousal } = require("../../functions/vibefunctions") + +// Seal of the Enduring Ice +// This Seal locks the user's max arousal at their current level + 5%, and decreases the growth coefficient along with increasing the decay rate. Also doubles the Orgasm Cooldown +exports.growthCoefficient = (data) => { return 0.5 } +exports.decayCoefficient = (data) => { return 0.1 } +exports.orgasmCooldown = (data) => { return 2 } +exports.denialCoefficient = (data) => { return 1 } + +// Set Min Arousal to be equal to the base Arousal + 5% when equipped +exports.maxArousal = function(data) { return getUserVar(data.userID, "base_arousal") * 1.05} + +// Events +exports.onOrgasm = (data) => { + // Decrease Base Arousal as the ice refreezes + setUserVar(data.userID, "base_arousal", getUserVar(data.userID, "base_arousal") * 0.5) +} +exports.onFailedOrgasm = (data) => { + // Remove a small amount of arousal with each failed attempt + addArousal(data.userID, -0.5); +} +exports.afterArousalChange = (data) => { + // Gradually raise the arousal cap as the ice slowly melts + if(getArousal(data.userID) > getUserVar(data.userID, "base_arousal")) setUserVar(data.userID, "base_arousal", getUserVar(data.userID, "base_arousal") * 1.001) +} +exports.onEquip = (data) => { + // Configure base arousal value + if (!getUserVar(data.userID, "base_arousal") || getUserVar(data.userID, "base_arousal") == undefined) setUserVar(data.userID, "base_arousal", getArousal(data.userID) ?? 5); +} +exports.onUnequip = (data) => { + setUserVar(data.userID, "base_arousal", undefined); +} + +// Tags +exports.tags = ["seal"] +// Name +exports.name = "Seal of the Enduring Ice" \ No newline at end of file diff --git a/chastity/bra/bra_livingwood.js b/chastity/bra/bra_livingwood.js index 7892e57a..6c22481d 100644 --- a/chastity/bra/bra_livingwood.js +++ b/chastity/bra/bra_livingwood.js @@ -1,4 +1,5 @@ const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getChastity } = require("../../functions/vibefunctions.js"); // Livingwood Bra // This bra has a higher growth coefficient. Notably however, @@ -6,30 +7,35 @@ const { getUserVar, setUserVar } = require("../../functions/usercontext") // or every 15 minutes, until the wearer successfully orgasms. // // This code is copied from chastity/belt/belt_livingwood.js and should be reviewed. Commented out for now. -/* + exports.growthCoefficient = (data) => { return 1 } exports.decayCoefficient = (data) => { return 0.1 } -exports.minVibe = (data) => { - return Math.max(Math.min(Math.floor((Date.now() - (getUserVar(data.userID, "livingwoodbelt") ?? Date.now())) / 900000), 20), getUserVar(user, "livingwoodvibe")) +// Never Fully Clear Arousal +exports.minArousal = (data) => { return 0.5 } +exports.minVibe = function(data) { + return Math.max(Math.min(Math.floor((Date.now() - (getUserVar(data.userID, "livingwood_chastity") ?? Date.now())) / 900000), 20), getUserVar(data.userID, "livingwood_vibe")) } -// Note, we must use a regular function context to retrieve a this correctly. -exports.onOrgasm = function(data) { - setUserVar(data.userID, "livingwoodvibe", Math.max((this.minVibe() - 10), 0)) - setUserVar(data.userID, "livingwoodbelt", Date.now()); +exports.onOrgasm = (data) => { + setUserVar(data.userID, "livingwood_vibe", Math.max((this.minVibe(data) - 10), 0)) + setUserVar(data.userID, "livingwood_chastity", Date.now()); } -exports.onFailedOrgasm = function(data) { - setUserVar(data.userID, "livingwoodvibe", Math.min((this.minVibe() + 1), 20)); +exports.onFailedOrgasm = (data) => { + //console.log(this); + setUserVar(data.userID, "livingwood_vibe", Math.min((this.minVibe(data) + 1), 20)); } exports.onEquip = (data) => { - setUserVar(data.userID, "livingwoodvibe", 0); - setUserVar(data.userID, "livingwoodbelt", Date.now()); + if (!getUserVar(data.userID, "livingwood_vibe") || getUserVar(data.userID, "livingwood_vibe") == undefined) setUserVar(data.userID, "livingwood_vibe", 0); + if (!getUserVar(data.userID, "livingwood_chastity") || getUserVar(data.userID, "livingwood_chastity") == undefined) setUserVar(data.userID, "livingwood_chastity", Date.now()); } exports.onUnequip = (data) => { - setUserVar(data.userID, "livingwoodvibe", 0); - setUserVar(data.userID, "livingwoodbelt", Date.now()); -}*/ + // Check if user is wearing a Livingwood Belt otherwise Null Out Vars + if (!getChastity(data.userID)?.chastitytype != "belt_livingwood") { + setUserVar(data.userID, "livingwood_vibe", undefined); + setUserVar(data.userID, "livingwood_chastity", undefined); + } +} +// Tags +exports.tags = ["living"] // Name exports.name = "Livingwood Bra" - -exports.tags = ["living"] \ No newline at end of file diff --git a/functions/textfunctions.js b/functions/textfunctions.js index bbb55b06..ae45e333 100644 --- a/functions/textfunctions.js +++ b/functions/textfunctions.js @@ -1,16 +1,36 @@ const { convertPronounsText } = require("./pronounfunctions.js"); const { getWearable } = require("./wearablefunctions.js"); -const { getChastity, getArousal } = require("./vibefunctions.js"); +const { getChastity, getChastityBra, getArousal } = require("./vibefunctions.js"); const { getHeadwearRestrictions } = require("./headwearfunctions.js"); const texts_chastity = { chastitybelt: { heavy: { - chastity: [`USER_TAG squirms in USER_THEIR VAR_C1, trying to adjust USER_THEIR VAR_C2, but it's futile!`, `USER_TAG wiggles a bit, trying to adjust USER_THEIR VAR_C2, but USER_THEIR VAR_C1 makes it hard to reach...`], + chastity: [ + `USER_TAG squirms in USER_THEIR VAR_C1, trying to adjust USER_THEIR VAR_C2, but it's futile!`, + `USER_TAG wiggles a bit, trying to adjust USER_THEIR VAR_C2, but USER_THEIR VAR_C1 makes it hard to reach...` + ], nochastity: [`USER_TAG squirms in USER_THEIR VAR_C1, trying to put on a VAR_C2, but can't!`, `USER_TAG shifts USER_THEIR hips, wanting to put USER_THEMSELF in chastity because USER_THEY USER_ISARE a good USER_PRAISEOBJECT, but USER_THEIR VAR_C1 said no.`, `USER_TAG bumps into a VAR_C2, wanting so desperately to put it on USER_THEIR hips, but USER_THEIR VAR_C1 gives USER_THEM no arms with which to work with.`], }, noheavy: { - chastity: { key_other: [`You are already locked in a chastity belt and TARGET_TAG has the key!`], key_self: [`You are already locked in a chastity belt and you're holding the key!`] }, + chastity: { + key_other: [`You are already locked in a chastity belt and TARGET_TAG has the key!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `You are already wearing a chastity seal with access keyed to TARGET_TAG!`, + }, + ], + key_self: [`You are already locked in a chastity belt and you're holding the key!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `You are already wearing a chastity seal keyed to you!`, + }, + ] + }, nochastity: { namedchastity: { key_other: [ @@ -29,6 +49,12 @@ const texts_chastity = { }, text: `USER_TAG feverishly slips a VAR_C2 onto USER_THEIR waist before USER_THEY can regret it! USER_THEY_CAP hands TARGET_TAG the key to keep USER_THEM safe from touching USER_THEMSELF!`, }, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG presses a VAR_C2 against USER_THEIR skin, feeling it activate and key itself to TARGET_TAG!`, + }, ], key_self: [ `USER_TAG puts a VAR_C2 on and clicks a tiny lock on it before stashing the key for safekeeping!`, @@ -46,6 +72,12 @@ const texts_chastity = { }, text: `In a vain attempt to be a good USER_PRAISEOBJECT, USER_TAG locks USER_THEMSELF up with a VAR_C2. Though, USER_THEY USER_ISARE still holding the key.`, }, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG presses a VAR_C2 against USER_THEIR skin, feeling it activate and seal USER_THEM away until USER_THEY choose to remove it!`, + }, ], }, nonamedchastity: { @@ -65,6 +97,12 @@ const texts_chastity = { }, text: `USER_TAG feverishly slips a VAR_C2 onto USER_THEIR waist before USER_THEY can regret it! USER_THEY_CAP hands TARGET_TAG the key to keep USER_THEM safe from touching USER_THEMSELF!`, }, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG presses a VAR_C2 against USER_THEIR skin, feeling it activate and key itself to TARGET_TAG!`, + }, ], key_self: [ `USER_TAG puts a VAR_C2 on and clicks a tiny lock on it before stashing the key for safekeeping!`, @@ -82,6 +120,12 @@ const texts_chastity = { }, text: `In a vain attempt to be a good USER_PRAISEOBJECT, USER_TAG locks USER_THEMSELF up with a VAR_C2. Though, USER_THEY USER_ISARE still holding the key.`, }, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG presses a VAR_C2 against USER_THEIR skin, feeling it activate and seal USER_THEM away until USER_THEY choose to remove it!`, + }, ], }, }, @@ -961,14 +1005,49 @@ const texts_letgo = { `Like a dam bursting, USER_TAG thrashes out as USER_THEY finally reachUSER_ES the top!`, ], chastity: [ - `USER_TAG tries to get over the edge but is denied by USER_THEIR steel prison!`, - `USER_TAG frantically *claws* at USER_THEIR chastity belt, but it offers no sensation!`, - `USER_TAG tries to rub the cold steel of USER_THEIR chastity belt, but USER_THEY can't feel anything!`, `USER_TAG squirms, trying to adjust the belt so USER_THEY can feel ***something***, but USER_THEY just can't get over the edge!`, `USER_TAG holds USER_THEIR breath, feverishly stroking the smooth belt USER_THEY USER_ISARE wearing, but USER_THEY just can't let go!`, `USER_TAG grinds on a near by object, trying to get that last little bit of sensation to let go... but USER_THEY just can't make it!`, `USER_TAG buckles USER_THEIR legs, panting in short breaths as USER_THEY attemptUSER_S to (and failUSER_S miserably) to get release!`, `USER_TAG attempts to get relief, but **good USER_PRAISEOBJECTs** don't get to touch there.`, + { + required: (t) => { + let blacklistTypes = ["livingwood", "seal"] + return !blacklistTypes.some(blacklistTypes => getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG tries to get over the edge but is denied by USER_THEIR steel prison!`, + }, + { + required: (t) => { + let blacklistTypes = ["livingwood", "seal"] + return !blacklistTypes.some(blacklistTypes => getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG tries to rub the cold steel of USER_THEIR chastity belt, but USER_THEY can't feel anything!`, + }, + { + required: (t) => { + let blacklistTypes = ["seal"] + return !blacklistTypes.some(blacklistTypes => getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG frantically *claws* at USER_THEIR chastity belt, but it offers no sensation!`, + }, + { + required: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("livingwood"); + }, + text: `USER_TAG struggles fruitlessly to get over the edge, aggitating USER_THEIR livingwood chastity and causing its tendrils to squirm more insistently~!`, + }, + { + required: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG struggles fruitlessly to get over the edge, but the magics in the seal applied to USER_THEM prevent USER_THEM from touching USER_THEMSELF~!`, + } + ], + heavy: [ + `USER_TAG shifts USER_THEIR legs to try to reach the peak! Too bad USER_THEIR VAR_C1 makes it hard to touch there!`, + `USER_TAG bucks USER_THEIR midsection, trying to climax, but without arms, USER_THEY USER_ISARE not getting anywhere!`, + `USER_TAG squirms helplessly in USER_THEIR VAR_C1, trying to let go! USER_THEY needUSER_S some more help from vibrators!` ], heavy: [`USER_TAG shifts USER_THEIR legs to try to reach the peak! Too bad USER_THEIR VAR_C1 makes it hard to touch there!`, `USER_TAG bucks USER_THEIR midsection, trying to climax, but without arms, USER_THEY USER_ISARE not getting anywhere!`, `USER_TAG squirms helplessly in USER_THEIR VAR_C1, trying to let go! USER_THEY_CAP needUSER_S some more help from vibrators!`], free: [`USER_TAG takes a deep breath and calms USER_THEIR nerves, the hot feelings *slowly* going away...`, `USER_TAG takes some ice and holds it to USER_THEIR crotch. The sensation is unpleasant, but effective in clearing USER_THEIR mind!`, `USER_TAG fans USER_THEMSELF and closes USER_THEIR eyes, taking deep breaths.`, `USER_TAG carefully uncorks a frigid potion and chugs it. It tastes foul, but USER_THEY feelUSER_S a little more coherent now!`], @@ -1206,12 +1285,24 @@ const texts_struggle = { // Using open hand, wrists, etc. 50% chance to use with mittens, 50% chance to use with free hands nofingers: [ `USER_TAG runs USER_THEIR palms on USER_THEIR VAR_C4, but despite USER_THEIR best efforts, the belt remains unyielding on USER_THEIR hips.`, - `USER_TAG wiggles USER_THEIR thighs to make USER_THEIR VAR_C4 sit more comfortably. Steel is so *unforgiving.*`, `USER_TAG gropes USER_THEMSELF with USER_THEIR hands, helplessly unable to touch...`, `USER_TAG squirms in USER_THEIR VAR_C4, but no matter how much USER_THEY USER_TRY, USER_THEY just can't feel anything...`, { required: (t) => { - return getChastity(t.interactionuser.id).timestamp + 7200000 < Date.now(); + let blacklistTypes = ["livingwood", "seal"] + return !blacklistTypes.some(blacklistTypes => !getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG wiggles USER_THEIR thighs to make USER_THEIR VAR_C4 sit more comfortably. Steel is so *unforgiving.*`, + }, + { + required: (t) => { + getChastity(t.interactionuser.id)?.chastitytype.includes("seal") + }, + text: `USER_TAG tries to touch the VAR_C4, but the magic in the seal repels USER_THEIR fingers!`, + }, + { + required: (t) => { + return getChastity(t.interactionuser.id)?.timestamp + 7200000 < Date.now(); }, text: `USER_TAG sighs as USER_THEY USER_TRY to fumble with USER_THEIR VAR_C4. When was the last time USER_THEY had freedom or relief?`, }, @@ -1228,9 +1319,27 @@ const texts_struggle = { ], // Able to use fingers. 50% chance to use with free hands, 0% chance to use with mittens nomitten: [ - `USER_TAG caresses the smooth metal of USER_THEIR VAR_C4, but the lock holds it snugly to USER_THEIR hips!`, - `USER_TAG tries to get a couple of fingers under USER_THEIR VAR_C4, but it's quite challenging to do so. USER_THEY_CAP should use the key!`, - `USER_TAG squeezes USER_THEIR thumb under the waistband of USER_THEIR VAR_C4, but can accomplish little more than shift it a bit.`, + { + required: (t) => { + let blacklistTypes = ["livingwood", "seal"] + return !blacklistTypes.some(blacklistTypes => !getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG caresses the smooth metal of USER_THEIR VAR_C4, but the lock holds it snugly to USER_THEIR hips!`, + }, + { + required: (t) => { + let blacklistTypes = ["seal"] + return !blacklistTypes.some(blacklistTypes => !getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG squeezes USER_THEIR thumb under the waistband of USER_THEIR VAR_C4, but can accomplish little more than shift it a bit.`, + }, + { + required: (t) => { + let blacklistTypes = ["seal"] + return !blacklistTypes.some(blacklistTypes => !getChastity(t.interactionuser.id)?.chastitytype.includes(blacklistTypes)); + }, + text: `USER_TAG tries to get a couple of fingers under USER_THEIR VAR_C4, but it's quite challenging to do so. USER_THEY_CAP should use the key!`, + }, `USER_TAG dances USER_THEIR fingernails on the protective shield of USER_THEIR VAR_C4. Oh how nice it would be to touch...`, ], }, @@ -1255,8 +1364,14 @@ const texts_struggle = { ], // Able to use fingers. 50% chance to use with free hands, 0% chance to use with mittens nomitten: [ - `USER_TAG gently taps USER_THEIR VAR_C6 on USER_THEIR chest, locked on and sealing away USER_THEIR breasts... if only USER_THEY could touch...`, - `USER_TAG dances USER_THEIR fingers on the smooth exterior trapping USER_THEIR breasts. The unyielding steel denies USER_THEM any reprieve.` + `USER_TAG gently taps USER_THEIR VAR_C6 on USER_THEIR chest, locked on and sealing away USER_THEIR breasts... if only USER_THEY could touch....`, + `USER_TAG runs USER_THEIR hands over the VAR_C6 on USER_THEIR chest, whining softly as USER_THEY struggles to get any sensation on USER_THEIR breasts~.`, + { + required: (t) => { + return !getChastityBra(t.interactionuser.id)?.chastitytype.includes("livingwood"); + }, + text: `USER_TAG dances USER_THEIR fingers on the smooth exterior trapping USER_THEIR breasts. The unyielding steel denies USER_THEM any reprieve.` + } ] } }, @@ -1413,7 +1528,13 @@ const texts_toy = { `USER_TAG twists USER_THEIR chest over to a pair of VAR_C2, but even if USER_THEY USER_HAVE had USER_THEIR arms, USER_THEY wouldn't be able to unlock USER_THEIR chastity bra to put them on!` ], "Vibrator": [ - `USER_TAG bucks USER_THEIR hips over towards a VAR_C2 despite USER_THEIR VAR_C1, but USER_THEIR chastity belt prevents USER_THEM from putting the toy inside anyway.` + `USER_TAG bucks USER_THEIR hips over towards a VAR_C2 despite USER_THEIR VAR_C1, but USER_THEIR chastity belt prevents USER_THEM from putting the toy inside anyway.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG bucks USER_THEIR hips over towards a VAR_C2 despite USER_THEIR VAR_C1, but the seal on USER_THEM would prevent USER_THEM putting the toy inside anyway~.`, + }, ], "Wand": [ `USER_TAG squirms with USER_THEIR VAR_C1, but can't get a grip on a VAR_C2 to pleasure USER_THEMSELF. (this is a bug, please report)` @@ -1625,7 +1746,13 @@ const texts_toy = { ] }, nofumble: [ - `USER_TAG puts the key in USER_THEIR belt, unlocking it and adding a VAR_C2, turned up to VAR_C3! USER_THEY_CAP then closeUSER_S and lockUSER_S USER_THEMSELF back up.` + `USER_TAG puts the key in USER_THEIR belt, unlocking it and adding a VAR_C2, turned up to VAR_C3! USER_THEY_CAP then closeUSER_S and lockUSER_S USER_THEMSELF back up.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG disables the magics of USER_THEIR seal, allowing USER_THEM to add a VAR_C2, turned up to VAR_C3! USER_THEY_CAP then reactivateUSER_S the seal, denying USER_THEMSELF access once more.`, + }, ] }, "Wand": { @@ -1665,7 +1792,13 @@ const texts_toy = { `USER_TAG tries as USER_THEY might, but is unable to unlock USER_THEIR chastity bra to add a VAR_C2.` ], "Vibrator": [ - `USER_TAG tries as USER_THEY might, but is unable to unlock USER_THEIR chastity belt to add a VAR_C2.` + `USER_TAG tries as USER_THEY might, but is unable to unlock USER_THEIR chastity belt to add a VAR_C2.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tries as USER_THEY might, but is unable to bypass the magics of USER_THEIR seal to add a VAR_C2.`, + }, ], "Wand": [ `USER_TAG grabs a VAR_C2 but can't apply it for some reason... Huh. (This is a bug, report)!` @@ -1953,7 +2086,15 @@ const texts_unchastity = { chastitybelt: { heavy: { self: { - chastity: [`USER_TAG shifts in USER_THEIR VAR_C1, trying to squirm out of USER_THEIR chastity belt, but USER_THEIR metal prison holds firmly to USER_THEIR body!`], + chastity: [`USER_TAG shifts in USER_THEIR VAR_C1, trying to squirm out of USER_THEIR chastity belt, but USER_THEIR metal prison holds firmly to USER_THEIR body!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG shifts in USER_THEIR VAR_C1, trying to detatch USER_THEIR seal, but paper tag remains stubbornly attached to USER_THEIR body!`, + }, + ], + // ephemeral nochastity: [`You're not in a chastity belt, but you wouldn't be able to remove it anyway!`], }, @@ -1973,7 +2114,14 @@ const texts_unchastity = { }, nofumble: [`USER_TAG puts the key in the lock on USER_THEIR belt and unlocks it, freeing USER_THEMSELF from that wretched prison!`], }, - nokey: [`USER_TAG runs USER_THEIR fingers uselessly on the metal of USER_THEIR chastity belt, but USER_THEY can't unlock it without the key!`], + nokey: [`USER_TAG runs USER_THEIR fingers uselessly on the metal of USER_THEIR chastity belt, but USER_THEY can't unlock it without the key!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG reaches USER_THEIR fingers uselessly towards USER_THEIR seal, but USER_THEIR fingers can't bypass the magic protections!`, + }, + ], }, // ephemeral nochastity: [`You aren't wearing a chastity belt!`], @@ -2071,7 +2219,15 @@ const texts_uncollar = { const texts_uncorset = { heavy: { self: { - corset: { chastity: [`Since USER_THEY USER_DOESNT have arms, USER_TAG wiggles USER_THEIR torso a little bit, trying to slink off USER_THEIR VAR_C2, but USER_THEIR chastity belt is in the way.`], nochastity: [`USER_TAG wriggles in USER_THEIR VAR_C1, but without arms, USER_THEY can't easily undo the laces of USER_THEIR VAR_C2 to take it off!`] }, + corset: { chastity: [ + `Since USER_THEY USER_DOESNT have arms, USER_TAG wiggles USER_THEIR torso a little bit, trying to slink off USER_THEIR VAR_C2, but USER_THEIR chastity belt is in the way.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `Since USER_THEY USER_DOESNT have arms free, USER_TAG wiggles USER_THEIR torso a little bit, trying to slink off USER_THEIR VAR_C2, but USER_THEIR seal prevents USER_THEM from removing it.`, + }, + ], nochastity: [`USER_TAG wriggles in USER_THEIR VAR_C1, but without arms, USER_THEY can't easily undo the laces of USER_THEIR VAR_C2 to take it off!`] }, // Ephemeral nocorset: [`You aren't wearing a corset, but even if you were, you wouldn't be able to take it off!`], }, @@ -2095,7 +2251,14 @@ const texts_uncorset = { }, nofumble: [`USER_TAG unlocks USER_THEIR chastity belt briefly, undoing the laces of the VAR_C2 USER_THEY USER_ISARE wearing and pulling it off of USER_THEIR waist! USER_THEY_CAP then carefully lockUSER_S USER_THEMSELF back up!`], }, - nokey: [`USER_TAG tugs at USER_THEIR chastity belt to try to remove USER_THEIR VAR_C2, but the locking mechanism holds firm!`], + nokey: [`USER_TAG tugs at USER_THEIR chastity belt to try to remove USER_THEIR VAR_C2, but the locking mechanism holds firm!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG franticaly attempts to bypass the magic of USER_THEIR chastity seal to try to remove USER_THEIR VAR_C2, but the magics deny them access!`, + }, + ], }, nochastity: [`USER_TAG carefully undoes the laces and USER_THEIR VAR_C2, unwrapping it from USER_THEIR waist. USER_THEY_CAP breatheUSER_S a *huge* breath of relief!`], }, @@ -2339,7 +2502,13 @@ const texts_untoy = { `USER_TAG twists USER_THEIR chest to remove USER_THEIR VAR_C2, but even if USER_THEY USER_HAVE had USER_THEIR arms, USER_THEY wouldn't be able to unlock USER_THEIR chastity bra to put them on!` ], "Vibrator": [ - `USER_TAG bucks USER_THEIR hips to remove USER_THEIR VAR_C2 despite USER_THEIR VAR_C1, but USER_THEIR chastity belt prevents USER_THEM from getting to it.` + `USER_TAG bucks USER_THEIR hips to remove USER_THEIR VAR_C2 despite USER_THEIR VAR_C1, but USER_THEIR chastity belt prevents USER_THEM from getting to it.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG bucks USER_THEIR hips to remove USER_THEIR VAR_C2 despite USER_THEIR VAR_C1, but USER_THEIR seal traps it inside USER_THEM.`, + }, ], "Wand": [ `USER_TAG twists USER_THEIR thighs slightly, but can't click the button on USER_THEIR VAR_C2 to turn it off! (this is a bug, please report)` @@ -2482,7 +2651,13 @@ const texts_untoy = { `USER_TAG tries as USER_THEY might, but is unable to unlock USER_THEIR chastity bra to remove USER_THEIR VAR_C2.` ], "Vibrator": [ - `USER_TAG tries as USER_THEY might, but is unable to unlock USER_THEIR chastity belt to remove USER_THEIR VAR_C2.` + `USER_TAG tries as USER_THEY might, but is unable to unlock USER_THEIR chastity belt to remove USER_THEIR VAR_C2.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tries as USER_THEY might, but is unable to breach the protections of USER_THEIR seal to remove USER_THEIR VAR_C2.`, + }, ], "Wand": [ `USER_TAG tries to press the button on USER_THEIR VAR_C2, but... can't? (this is a bug, please report)` @@ -2658,7 +2833,26 @@ const texts_untoy = { const texts_unvibe = { heavy: { self: { - chastity: { single: [`USER_TAG tries to knock USER_THEIR VAR_C2 off with USER_THEIR thighs, but USER_THEY can't because USER_THEIR arms are useless from USER_THEIR VAR_C1. Well, and USER_THEIR chastity belt of course!`], both: [`USER_TAG tries to knock USER_THEIR vibrators off with USER_THEIR thighs, but USER_THEY can't because USER_THEIR arms are useless from USER_THEIR VAR_C1. Well, and USER_THEIR chastity belt of course!`] }, + chastity: { + single: [ + `USER_TAG tries to knock USER_THEIR VAR_C2 off with USER_THEIR thighs, but USER_THEY can't because USER_THEIR arms are useless from USER_THEIR VAR_C1. Well, and USER_THEIR chastity belt of course!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tries to knock USER_THEIR VAR_C2 off with USER_THEIR thighs, but USER_THEY can't because USER_THEIR arms are useless from USER_THEIR VAR_C1. Well, and USER_THEIR chastity seal of course!`, + }, + ], + both: [ + `USER_TAG tries to knock USER_THEIR vibrators off with USER_THEIR thighs, but USER_THEY can't because USER_THEIR arms are useless from USER_THEIR VAR_C1. Well, and USER_THEIR chastity belt of course!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tries to knock USER_THEIR vibrators off with USER_THEIR thighs, but USER_THEY can't because USER_THEIR arms are useless from USER_THEIR VAR_C1. Well, and USER_THEIR chastity seal of course!`, + }, + ] + }, nochastity: { single: [`USER_TAG thrashes USER_THEIR thighs to try to knock out USER_THEIR VAR_C2, however it stays pretty secure in USER_THEIR body!`], both: [`USER_TAG thrashes USER_THEIR thighs to try to knock out USER_THEIR VAR_C2, however it stays pretty secure in USER_THEIR body!`] }, }, other: { @@ -2681,7 +2875,15 @@ const texts_unvibe = { nofumble: { single: [`USER_TAG puts the key in USER_THEIR belt, unlocking it and removing the tormenting VAR_C2 before closing it and locking USER_THEMSELF back up.`], both: [`USER_TAG puts the key in USER_THEIR belt, unlocking it and removing the tormenting vibrators before closing it and locking USER_THEMSELF back up.`] }, }, // No public access to self belt - nokey: [`USER_TAG claws feverishly at USER_THEIR belt, the agonizing vibrators offering USER_THEM no reprieve from their sweet sensation!`], + nokey: [ + `USER_TAG claws feverishly at USER_THEIR belt, the agonizing vibrators offering USER_THEM no reprieve from their sweet sensation!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG claws feverishly at USER_THEIR seal but fail to bypass it, the agonizing vibrators offering USER_THEM no reprieve from their sweet sensation!`, + }, + ], }, nochastity: { single: [`USER_TAG carefully removes USER_THEIR VAR_C2 and turns it off. Freedom from the torment!`], both: [`USER_TAG carefully removes USER_THEIR vibrator and turns them off. Freedom from the torment!`] }, }, @@ -2939,10 +3141,25 @@ const texts_vibe = { discard: { single: { keyholder: [`USER_TAG tries to put the key in USER_THEIR belt to change the settings on the VAR_C2, but the key slips and falls somewhere. It's nowhere to be seen.`], clone: [`USER_TAG tries to put the key in USER_THEIR belt to change the settings on the VAR_C2, but the key slips and falls on the floor. The pieces are scattered about.`] } }, nodiscard: { single: [`USER_TAG tries to put the key in USER_THEIR belt to adjust the VAR_C2, but the key slips! Thankfully, USER_THEY didn't lose it!`] }, }, - nofumble: { single: [`USER_TAG puts the key in USER_THEIR belt, unlocking it and adjusting the VAR_C2 to VAR_C3 power! USER_THEY_CAP then closeUSER_S and lockUSER_S USER_THEMSELF back up.`] }, + nofumble: { single: [`USER_TAG puts the key in USER_THEIR belt, unlocking it and adjusting the VAR_C2 to VAR_C3 power! USER_THEY_CAP then closeUSER_S and lockUSER_S USER_THEMSELF back up.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG disables the magic in USER_THEIR seal, removing it before adding a VAR_C2 set to VAR_C3! USER_THEY_CAP then replaceUSER_S and reactivateUSER_S the seal.`, + }, + ] + }, }, // No public access to self belt - nokey: [`USER_TAG prods at USER_THEIR belt, trying to open it to play with a vibe, but the belt is locked tightly!`], + nokey: [`USER_TAG prods at USER_THEIR belt, trying to open it to play with a vibe, but the belt is locked tightly!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tries to slip past USER_THEIR seal to play with a vibe, but the seal's magics deny USER_THEM access!`, + }, + ], }, nochastity: { single: [`USER_TAG adjusts USER_THEIR VAR_C2 and sets it to VAR_C3! The toy buzzes gently!`] }, }, @@ -2953,10 +3170,25 @@ const texts_vibe = { discard: { single: { keyholder: [`USER_TAG tries to put the key in USER_THEIR belt to add a VAR_C2, but the key slips and falls somewhere. It's nowhere to be seen.`], clone: [`USER_TAG tries to put the key in USER_THEIR belt to add a VAR_C2, but the key slips and vanishes. There's a loud crack as it lands on the floor.`] } }, nodiscard: { single: [`USER_TAG tries to put the key in USER_THEIR belt to add a VAR_C2, but the key slips! Thankfully, USER_THEY didn't lose it!`] }, }, - nofumble: { single: [`USER_TAG puts the key in USER_THEIR belt, unlocking it before adding a VAR_C2 set to VAR_C3! USER_THEY_CAP then closeUSER_S and lockUSER_S USER_THEMSELF back up.`] }, + nofumble: { single: [`USER_TAG puts the key in USER_THEIR belt, unlocking it before adding a VAR_C2 set to VAR_C3! USER_THEY_CAP then closeUSER_S and lockUSER_S USER_THEMSELF back up.`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG disables the magic in USER_THEIR seal, removing it before adding a VAR_C2 set to VAR_C3! USER_THEY_CAP then replaceUSER_S and reactivateUSER_S the seal.`, + }, + ] + }, }, // No public access to self belt - nokey: [`USER_TAG prods at USER_THEIR belt, trying to open it to play with a vibe, but the belt is locked tightly!`], + nokey: [`USER_TAG prods at USER_THEIR belt, trying to open it to play with a vibe, but the belt is locked tightly!`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tries to slip past USER_THEIR seal to play with a vibe, but the seal's magics deny USER_THEM access!`, + }, + ], }, nochastity: { single: [`USER_TAG carefully inserts a VAR_C2 set to VAR_C3! The toy buzzes gently!`] }, }, @@ -3209,7 +3441,14 @@ const texts_timelock = { timelockengage: { everyoneaccess: { self: { - chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock's magic wards away USER_THEIR hands but others may be able to do things to USER_THEM...`], + chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock's magic wards away USER_THEIR hands but others may be able to do things to USER_THEM...`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tweaks the magics of USER_THEIR chastity seal, locking it in time! The magic now wards away USER_THEIR hands but others may still be able to do things to USER_THEM...`, + }, + ], chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock's magic wards away USER_THEIR hands but others may be able to do things to USER_THEM...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock's magic wards away USER_THEIR hands but others may be able to do things to USER_THEM...`], }, @@ -3225,14 +3464,54 @@ const texts_timelock = { }, }, keyholderaccess: { - self: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, + self: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tweaks the magics of USER_THEIR chastity seal, locking it in time! The magic now wards away everyone's hands until the changes fade away...`, + }, + ], + chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, khother: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "VAR_C1" on it as it begins to count down...`], chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "VAR_C1" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "VAR_C1" on it as it begins to count down...`] }, - other: { chastitybelt: [`USER_TAG puts a timelock on TARGET_TAG's chastity belt, locking it firmly! The timelock reads "TARGET_TAG" on it as it begins to count down...`], chastitybra: [`USER_TAG puts a timelock on TARGET_TAG's chastity bra, locking it firmly! The timelock reads "TARGET_TAG" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on TARGET_TAG's collar, locking it firmly! The timelock reads "TARGET_TAG" on it as it begins to count down...`] }, + other: { chastitybelt: [`USER_TAG puts a timelock on TARGET_TAG's chastity belt, locking it firmly! The timelock reads "TARGET_TAG" on it as it begins to count down...`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tweaks the magics of USER_THEIR chastity seal, locking it in time! The magic now wards away all but TARGET_TAG's hands until the changes fade away...`, + }, + ], + chastitybra: [`USER_TAG puts a timelock on TARGET_TAG's chastity bra, locking it firmly! The timelock reads "TARGET_TAG" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on TARGET_TAG's collar, locking it firmly! The timelock reads "TARGET_TAG" on it as it begins to count down...`] }, }, noaccess: { - self: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, - khother: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, - other: { chastitybelt: [`USER_TAG puts a timelock on TARGET_TAG's chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], chastitybra: [`USER_TAG puts a timelock on TARGET_TAG's chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on TARGET_TAG's collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, + self: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tweaks the magics of USER_THEIR chastity seal, locking it in time! The magic now wards away everyone's hands until the changes fade away...`, + }, + ], + chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, + khother: { chastitybelt: [`USER_TAG puts a timelock on USER_THEIR chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tweaks the magics of USER_THEIR chastity seal, locking it in time! The magic now wards away everyone's hands until the changes fade away...`, + }, + ], + chastitybra: [`USER_TAG puts a timelock on USER_THEIR chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on USER_THEIR collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, + other: { chastitybelt: [`USER_TAG puts a timelock on TARGET_TAG's chastity belt, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`, + { + only: (t) => { + return getChastity(t.interactionuser.id)?.chastitytype.includes("seal"); + }, + text: `USER_TAG tweaks the magics of USER_THEIR chastity seal, locking it in time! The magic now wards away everyone's hands until the changes fade away...`, + }, + ], + chastitybra: [`USER_TAG puts a timelock on TARGET_TAG's chastity bra, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`], collar: [`USER_TAG puts a timelock on TARGET_TAG's collar, locking it firmly! The timelock reads "No Access" on it as it begins to count down...`] }, }, }, }; @@ -3355,7 +3634,26 @@ const texts_eventfunctions = { applyingOutfit: { wearable: { add: [`The Costumer Mimic pulls out a VAR_C1 from its internal storage and begins to dress USER_TAG in it!`, `The Costumer Mimic produces a VAR_C1 from within itself and slips it onto USER_TAG!`, `The Costumer Mimic's tentacles fish out a VAR_C1 from its storage and begins to dress USER_TAG in it!`] }, mitten: { replace: [`The Costumer Mimic removes the VAR_C1 from USER_TAG's hands, replacing it with a pair of VAR_C2 and securing them tightly.`], add: [`The Costumer Mimic grabs USER_TAG's wrists, holding them steady as it installs a pair of VAR_C1 on USER_THEM and secures them tightly.`] }, - chastitybelt: { replace: [`The Costumer Mimic rips off the VAR_C1 that USER_TAG is wearing, storing it away before locking a VAR_C2 in its place.`], add: [`The Costumer Mimic locks a VAR_C2 onto USER_TAG, sealing away USER_THEIR chastity.`] }, + chastitybelt: { + replace: [ + `The Costumer Mimic rips off the VAR_C1 that USER_TAG is wearing, storing it away before locking a VAR_C2 in its place.`, + { + only: (t) => { + return t.c2.includes("seal"); + }, + text: `The Costumer Mimic rips off the VAR_C1 that USER_TAG is wearing, storing it away before applying a VAR_C2 in its place.`, + }, + ], + add: [ + `The Costumer Mimic locks a VAR_C2 onto USER_TAG, sealing away USER_THEIR chastity.`, + { + only: (t) => { + return t.c2.includes("seal"); + }, + text: `The Costumer Mimic presses a VAR_C2 onto USER_TAG, activating it and sealing away USER_THEIR chastity.`, + }, + ] + }, chastitybra: { replace: [`The Costumer Mimic picks the locking mechanism on USER_TAG's VAR_C1, dragging it into its storage. But USER_THEY gets no moment to enjoy the freedom as the mimic traps USER_THEIR breasts in a VAR_C2.`], add: [`The Costumer Mimic wraps a VAR_C2 around USER_TAG's chest, locking away USER_THEIR breasts.`] }, collar: { replace: [`The Costumer Mimic forces USER_TAG to lean forward as it removes USER_THEIR VAR_C1, consuming it as it instead secures a VAR_C2 around USER_THEIR throat.`], add: [`USER_TAG is forced to lean forward as the Costumer Mimic moves USER_THEIR hair out of the way and wraps a VAR_C2 around USER_THEIR throat.`] }, headwear: { add: [`The Costumer Mimic produces a VAR_C1 from within itself and secures it onto USER_TAG's head.`] },