From 7b96ca15fa71f403f2367220805b8b8ae691e79d Mon Sep 17 00:00:00 2001 From: Pyrotech Date: Wed, 18 Feb 2026 00:36:22 +0000 Subject: [PATCH 1/5] Initial implementation of the False Calm Seal. --- chastity/belt/belt_seal_falsecalm.js | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 chastity/belt/belt_seal_falsecalm.js diff --git a/chastity/belt/belt_seal_falsecalm.js b/chastity/belt/belt_seal_falsecalm.js new file mode 100644 index 0000000..79f55f4 --- /dev/null +++ b/chastity/belt/belt_seal_falsecalm.js @@ -0,0 +1,51 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getToys, getBaseToy } = require("../../functions/toyfunctions"); +const { getArousal, addArousal } = require("../../functions/vibefunctions") + +// Seal of False Calm +// This Seal locks arousal at 0, while tracking what the strongest vibe they are wearing is and storing an arousal value relative to that every minute that is applied on being unequipped +// No Increase to denial when worn +exports.denialCoefficient = (data) => { return 1 } +// Arousal locked to 0 +exports.maxArousal = (data) => { return 0 } + +// Events +// Randomly reduce the level of arousal by a random percentage, then reduce by a further 10% +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) ?? 0); + if (!getUserVar(data.userID, "stasis_timer") || getUserVar(data.userID, "stasis_timer") == undefined) setUserVar(data.userID, "stasis_timer", Date.now()); +} + +exports.onUnequip = (data) => { + // Add All Stored Arousal at once + addArousal(data.userID, getUserVar(data.userID, "base_arousal")); + setUserVar(data.userID, "base_arousal", undefined); + setUserVar(data.userID, "stasis_timer", undefined); +} + +exports.afterArousalChange = (data) => { + if(Date.now() > (getUserVar(data.userID, "stasis_timer") + 60000)){ + // Add one quarter of the highest vibe intensity as arousal to the base value, or reduce it by 1 with a floor of 0 if no vibe present~ + let vibeIntensity = 0; + if(getToys(data.userID).length > 0) + { + vibeIntensity = getToys(data.userID).reduce((a,b)=>a.intensity>b.intensity?a:b).intensity ?? 0; + } + + if(vibeIntensity > 0) + { + setUserVar(data.userID, "base_arousal", getUserVar(data.userID, "base_arousal") + (vibeIntensity / 4)); + } + else + { + setUserVar(data.userID, "base_arousal", Math.max(getUserVar(data.userID, "base_arousal") - 1, 0)); + } + setUserVar(data.userID, "stasis_timer", Date.now()) + } +} + +// Tags +exports.tags = ["seal"] +// Name +exports.name = "Seal of False Calm" \ No newline at end of file From 7783c794aef3d3ad78d8a132b38e58c72fcf3f39 Mon Sep 17 00:00:00 2001 From: Pyrotech Date: Wed, 18 Feb 2026 00:56:50 +0000 Subject: [PATCH 2/5] Initial Cyclical Seal Belt --- chastity/belt/belt_seal_cyclical.js | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 chastity/belt/belt_seal_cyclical.js diff --git a/chastity/belt/belt_seal_cyclical.js b/chastity/belt/belt_seal_cyclical.js new file mode 100644 index 0000000..3669f4d --- /dev/null +++ b/chastity/belt/belt_seal_cyclical.js @@ -0,0 +1,37 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getToys, getBaseToy } = require("../../functions/toyfunctions"); +const { clearArousal, getArousal, addArousal } = require("../../functions/vibefunctions") + +// Seal of Cyclical Time +// This Seal resets the wearer to their initial state every 3 minutes +// No Increase to denial when worn +exports.denialCoefficient = (data) => { return 1 } + +// Events +// Randomly reduce the level of arousal by a random percentage, then reduce by a further 10% +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) ?? 0); + if (!getUserVar(data.userID, "stasis_timer") || getUserVar(data.userID, "stasis_timer") == undefined) setUserVar(data.userID, "stasis_timer", Date.now()); +} + +exports.onUnequip = (data) => { + // Add All Stored Arousal at once + addArousal(data.userID, getUserVar(data.userID, "base_arousal")); + setUserVar(data.userID, "base_arousal", undefined); + setUserVar(data.userID, "stasis_timer", undefined); +} + +exports.afterArousalChange = (data) => { + if(Date.now() > (getUserVar(data.userID, "stasis_timer") + 180000)){ + // Reset Wearer to initial state every 3 mins~ + setUserVar(data.userID, "stasis_timer", Date.now()) + clearArousal(data.userID); + addArousal(data.userID, getUserVar(data.userID, "base_arousal")); + } +} + +// Tags +exports.tags = ["seal"] +// Name +exports.name = "Seal of Cyclical Time" \ No newline at end of file From a43516b0fb29b115aff7aa44f547411a22a20718 Mon Sep 17 00:00:00 2001 From: Pyrotech Date: Wed, 18 Feb 2026 01:44:27 +0000 Subject: [PATCH 3/5] Updated to utilise functiontick instead of piggybacking on other functions --- chastity/belt/belt_seal_cyclical.js | 10 ------- chastity/belt/belt_seal_falsecalm.js | 21 --------------- eventfunctions/chastity/belt_seal_cyclical.js | 13 ++++++++++ .../chastity/belt_seal_falsecalm.js | 26 +++++++++++++++++++ 4 files changed, 39 insertions(+), 31 deletions(-) create mode 100644 eventfunctions/chastity/belt_seal_cyclical.js create mode 100644 eventfunctions/chastity/belt_seal_falsecalm.js diff --git a/chastity/belt/belt_seal_cyclical.js b/chastity/belt/belt_seal_cyclical.js index 3669f4d..c8d250f 100644 --- a/chastity/belt/belt_seal_cyclical.js +++ b/chastity/belt/belt_seal_cyclical.js @@ -1,5 +1,4 @@ const { getUserVar, setUserVar } = require("../../functions/usercontext") -const { getToys, getBaseToy } = require("../../functions/toyfunctions"); const { clearArousal, getArousal, addArousal } = require("../../functions/vibefunctions") // Seal of Cyclical Time @@ -22,15 +21,6 @@ exports.onUnequip = (data) => { setUserVar(data.userID, "stasis_timer", undefined); } -exports.afterArousalChange = (data) => { - if(Date.now() > (getUserVar(data.userID, "stasis_timer") + 180000)){ - // Reset Wearer to initial state every 3 mins~ - setUserVar(data.userID, "stasis_timer", Date.now()) - clearArousal(data.userID); - addArousal(data.userID, getUserVar(data.userID, "base_arousal")); - } -} - // Tags exports.tags = ["seal"] // Name diff --git a/chastity/belt/belt_seal_falsecalm.js b/chastity/belt/belt_seal_falsecalm.js index 79f55f4..80665e9 100644 --- a/chastity/belt/belt_seal_falsecalm.js +++ b/chastity/belt/belt_seal_falsecalm.js @@ -24,27 +24,6 @@ exports.onUnequip = (data) => { setUserVar(data.userID, "stasis_timer", undefined); } -exports.afterArousalChange = (data) => { - if(Date.now() > (getUserVar(data.userID, "stasis_timer") + 60000)){ - // Add one quarter of the highest vibe intensity as arousal to the base value, or reduce it by 1 with a floor of 0 if no vibe present~ - let vibeIntensity = 0; - if(getToys(data.userID).length > 0) - { - vibeIntensity = getToys(data.userID).reduce((a,b)=>a.intensity>b.intensity?a:b).intensity ?? 0; - } - - if(vibeIntensity > 0) - { - setUserVar(data.userID, "base_arousal", getUserVar(data.userID, "base_arousal") + (vibeIntensity / 4)); - } - else - { - setUserVar(data.userID, "base_arousal", Math.max(getUserVar(data.userID, "base_arousal") - 1, 0)); - } - setUserVar(data.userID, "stasis_timer", Date.now()) - } -} - // Tags exports.tags = ["seal"] // Name diff --git a/eventfunctions/chastity/belt_seal_cyclical.js b/eventfunctions/chastity/belt_seal_cyclical.js new file mode 100644 index 0000000..167a338 --- /dev/null +++ b/eventfunctions/chastity/belt_seal_cyclical.js @@ -0,0 +1,13 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { clearArousal, getArousal, addArousal } = require("../../functions/vibefunctions") + +let functiontick = async function(userid) { + // Reset Wearer to initial state every 3 mins~ + if(Date.now() > (getUserVar(userid, "stasis_timer") + 180000)){ + setUserVar(userid, "stasis_timer", Date.now()) + clearArousal(userid); + addArousal(userid, getUserVar(userid, "base_arousal")); + } +} + +exports.functiontick = functiontick; \ No newline at end of file diff --git a/eventfunctions/chastity/belt_seal_falsecalm.js b/eventfunctions/chastity/belt_seal_falsecalm.js new file mode 100644 index 0000000..ca77874 --- /dev/null +++ b/eventfunctions/chastity/belt_seal_falsecalm.js @@ -0,0 +1,26 @@ +const { getUserVar, setUserVar } = require("../../functions/usercontext") +const { getToys, getBaseToy } = require("../../functions/toyfunctions"); + +let functiontick = async function(userid) { + // Update every minute + if(Date.now() > (getUserVar(userid, "stasis_timer") + 60000)){ + // Add one quarter of the highest vibe intensity as arousal to the base value, or reduce it by 1 with a floor of 0 if no vibe present~ + let vibeIntensity = 0; + if(getToys(userid).length > 0) + { + vibeIntensity = getToys(userid).reduce((a,b)=>a.intensity>b.intensity?a:b).intensity ?? 0; + } + + if(vibeIntensity > 0) + { + setUserVar(userid, "base_arousal", getUserVar(userid, "base_arousal") + (vibeIntensity / 4)); + } + else + { + setUserVar(userid, "base_arousal", Math.max(getUserVar(userid, "base_arousal") - 1, 0)); + } + setUserVar(userid, "stasis_timer", Date.now()) + } +} + +exports.functiontick = functiontick; \ No newline at end of file From e280b1e22dacd5e6e3035ea27b3d54e17c23e1c7 Mon Sep 17 00:00:00 2001 From: Pyrotech Date: Mon, 23 Feb 2026 01:31:59 +0000 Subject: [PATCH 4/5] Removed Stasis Timer and converted FunctionTick() to apply the effects of all toys worn --- chastity/belt/belt_seal_falsecalm.js | 2 -- .../chastity/belt_seal_falsecalm.js | 31 +++++++++---------- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/chastity/belt/belt_seal_falsecalm.js b/chastity/belt/belt_seal_falsecalm.js index 80665e9..867ff92 100644 --- a/chastity/belt/belt_seal_falsecalm.js +++ b/chastity/belt/belt_seal_falsecalm.js @@ -14,14 +14,12 @@ exports.maxArousal = (data) => { return 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) ?? 0); - if (!getUserVar(data.userID, "stasis_timer") || getUserVar(data.userID, "stasis_timer") == undefined) setUserVar(data.userID, "stasis_timer", Date.now()); } exports.onUnequip = (data) => { // Add All Stored Arousal at once addArousal(data.userID, getUserVar(data.userID, "base_arousal")); setUserVar(data.userID, "base_arousal", undefined); - setUserVar(data.userID, "stasis_timer", undefined); } // Tags diff --git a/eventfunctions/chastity/belt_seal_falsecalm.js b/eventfunctions/chastity/belt_seal_falsecalm.js index ca77874..37d36ad 100644 --- a/eventfunctions/chastity/belt_seal_falsecalm.js +++ b/eventfunctions/chastity/belt_seal_falsecalm.js @@ -1,25 +1,22 @@ const { getUserVar, setUserVar } = require("../../functions/usercontext") const { getToys, getBaseToy } = require("../../functions/toyfunctions"); +const { getBotOption } = require("../../functions/configfunctions.js"); let functiontick = async function(userid) { - // Update every minute - if(Date.now() > (getUserVar(userid, "stasis_timer") + 60000)){ - // Add one quarter of the highest vibe intensity as arousal to the base value, or reduce it by 1 with a floor of 0 if no vibe present~ - let vibeIntensity = 0; - if(getToys(userid).length > 0) - { - vibeIntensity = getToys(userid).reduce((a,b)=>a.intensity>b.intensity?a:b).intensity ?? 0; - } + //Tickrate Modifier + tickMod = (getBotOption("bot-timetickrate") / 60000) - if(vibeIntensity > 0) - { - setUserVar(userid, "base_arousal", getUserVar(userid, "base_arousal") + (vibeIntensity / 4)); - } - else - { - setUserVar(userid, "base_arousal", Math.max(getUserVar(userid, "base_arousal") - 1, 0)); - } - setUserVar(userid, "stasis_timer", Date.now()) + if(getToys(userid).length > 0) + { + // Calc Impact of Toys and increment Base_Arousal + getToys(userid).forEach(toy => { + setUserVar(userid, "base_arousal", getUserVar(userid, "base_arousal") + (getBaseToy(toy.type).calcVibeEffect(toy) * tickMod)) + }); + } + else + { + // Slow Decrement of Arousal if no Toys + setUserVar(userid, "base_arousal", Math.max(getUserVar(userid, "base_arousal") - tickMod, 0)); } } From 72596f72b9f8e6bff61db0568b891cdd1851885c Mon Sep 17 00:00:00 2001 From: Enraa Date: Sun, 22 Feb 2026 18:16:19 -0800 Subject: [PATCH 5/5] Update belt_seal_falsecalm.js --- eventfunctions/chastity/belt_seal_falsecalm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eventfunctions/chastity/belt_seal_falsecalm.js b/eventfunctions/chastity/belt_seal_falsecalm.js index 37d36ad..c941572 100644 --- a/eventfunctions/chastity/belt_seal_falsecalm.js +++ b/eventfunctions/chastity/belt_seal_falsecalm.js @@ -10,7 +10,7 @@ let functiontick = async function(userid) { { // Calc Impact of Toys and increment Base_Arousal getToys(userid).forEach(toy => { - setUserVar(userid, "base_arousal", getUserVar(userid, "base_arousal") + (getBaseToy(toy.type).calcVibeEffect(toy) * tickMod)) + setUserVar(userid, "base_arousal", getUserVar(userid, "base_arousal") + (getBaseToy(toy.type).calcVibeEffect({ userID: userid, intensity: toy.intensity }) * tickMod)) }); } else