From 7df3916ea12dcd8f6e9763a3dd1c5b029bed24b8 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 23 Jun 2019 12:52:47 +0100 Subject: Extract orgasm control into a module --- scripts/toy.groovy | 134 +------------------------------------ scripts/toy/orgasmControl.groovy | 141 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+), 133 deletions(-) create mode 100644 scripts/toy/orgasmControl.groovy (limited to 'scripts') diff --git a/scripts/toy.groovy b/scripts/toy.groovy index 7ca5beb..82427ac 100644 --- a/scripts/toy.groovy +++ b/scripts/toy.groovy @@ -296,122 +296,6 @@ return new Object() { } return null; }; - // Return whether toy came or not - def mightCum = { time, lenient = false, reason = "without permission" -> - final taken = showButtonG("Sorry, ${dommeTitle()}, I'm cumming $reason", "cumming", time); - if (taken < time) { - playBackgroundSound(null); - if (lenient && taken < 2) { - present(null, [ - ["Awww.", "Damn."], - ["That was close;", "I'll let you have that one;"], - ["And I was looking forward to punishing you.", "No punishment this time."]]); - } - else { - present(null, [ - ["Bah!", "Pfft. I'm very disappointed in you."], - ["Ruin it.", "Don't touch it."]]); - sessionAborted = CUM; - adjustPunish(80); - } - adjustPunish(taken * 10); - wait(10); - present([DRESSED], [["Clean up your mess!"]]); - showButtonG("Yes, ${dommeTitle()}", "ok"); - wait(10); - showButtonG("Cleaned up, ${dommeTitle()}, back", "back"); - return true; - } - return false; - }; - // Return whether toy came or not, despite being denied - def cumChanceDenied = { lenient = false -> - present([TEASE], [ - ["Stop!", "Nope!", "Haha! No!"], - ["Let go.", "Hands off!", "Hands behind your back."], - ["Not this time.", "Maaaaybe next time, toy."]]); - return mightCum(15, lenient); - }; - def cumChanceCountdown = { - present([TEASE], [ - ["OK, toy, I'm going to count you down.", "Would you like a countdown, toy?"], - ["Get stroking!", "Jerk it!"]]); - if (mightCum(5 + getRandom(5))) return true; - present([TITS], []); - def numbers = ""; - for (def n = 10; n > 0; n--) { - numbers += "${n}... "; - show(numbers); - mightCum(1, false, "too soon"); - if (getRandom(100) > 85 || !can(CUM)) { - return cumChanceDenied(); - } - } - present([TITS], [ - ["Cum, cum", "Cum for me"], - ["you little slut.", "my lucky toy.", "you dirty boy."]]); - wait(10); - showButtonG("Thank you, ${dommeTitle()}.", "ok"); - return true; - }; - def cumChanceWindow = { - present([TEASE], [ - ["OK, toy, I'm going to give you a chance to cum.", "Would you like a small chance to cum, toy?"], - ["Get stroking!", "Stroke it, you'll need to be close!"], - ["You won't get long.", "You might not get long.", "Wait for my say so..."]]); - if (mightCum(15 + getRandom(60), false, "too soon")) return true; - if (getRandom(5) > 0 || !can(CUM)) { - return cumChanceDenied(); - } - present([TITS], [ - ["Cum, cum", "Cum for me"], - ["you little slut.", "my lucky toy.", "you dirty boy."]]); - def w = 4 + getRandom(4); - if (showButtonG("Cumming, ${dommeTitle()}", "cumming", w) == w) { - w = 3; - present(null, [ - ["Quickly now!", "Hurry!"]]); - if (showButtonG("Cumming, ${dommeTitle()}", "cumming", w) == w) { - present([TEASE], [ - ["Stop!", "Let go.", "Hands off!"], - ["Time's up!", "You had your chance."]]); - return mightCum(15, true, "too late"); - } - } - wait(10); - showButtonG("Thank you, ${dommeTitle()}.", "ok"); - return true; - }; - def cumChanceRuin = { - present([TEASE], [ - ["Stroke!", "Jerk it."], - ["Get close to the edge, toy...", "Get yourself close..."]]); - if (mightCum(5 + getRandom(10), false, "too soon")) return true; - if (getRandom(5) > 0 || !can(CUM)) { - return cumChanceDenied(); - } - for (def n = 3 + getRandom(6); n >= 0; n--) { - present([TITS], [ - ["Try to cum!"]]); - def w = 3 + getRandom(8); - if (showButtonG("Cumming, ${dommeTitle()}", "cumming", w) < w) { - present([TEASE], [ - ["Hands off!", "Leave it."], - ["Let it all ooze out.", "You're not getting a proper release."]]); - wait(10); - showButtonG("Thank you, ${dommeTitle()}.", "ok"); - return true; - } - if (n > 0) { - present([TITS], [ - ["Stop!", "Not now!", "Wait!"], - ["Hands off!", "Hands by your side."]]); - w = (w - 2) + getRandom(8); - if (mightCum(w, true, "but it's ruined")) return true; - } - } - return cumChanceDenied(true); - }; def clampPulls = { amount -> getRandom(1 + amount).times { if (getRandom(2)) { @@ -559,19 +443,6 @@ return new Object() { }; // Post - def postCum = { - if (stateIs(CHASTE)) return; - present([TEASE], [ - ["How about I let you cum?", "Maybe I should let you cum."], - ["Would you like that?", "Let some of that frustration out?"]]); - wait(getRandom(5) + 5); - def ways = [cumChanceRuin, cumChanceWindow, cumChanceCountdown]; - if (ways[getRandom(ways.size())]()) { - // Once toy has cum, revoke permission for a while - revokePermission(CUM); - } - }; - // Play def playNothing = { (getRandom(3) + 2).times { @@ -979,10 +850,6 @@ return new Object() { 'playNothing': playNothing, 'playBondage': playBondage, 'playSuck': playSuck, - 'postCum': postCum, - 'postPermitCum': { - addEventIfMissing(CUM, getTime() + (DAY * 2) + getRandom(DAY * 2), PERMIT, CUM); // 2 - 4 days from now - }, ]; final addActivity = { String name, func -> activityList[name] = func; @@ -1427,6 +1294,7 @@ return new Object() { * scripts/toy/confession.groovy * scripts/toy/imagery.groovy * scripts/toy/intro.groovy + * scripts/toy/orgasmControl.groovy * scripts/toy/sleep.groovy * scripts/toy/social.groovy * scripts/toy/tease.groovy diff --git a/scripts/toy/orgasmControl.groovy b/scripts/toy/orgasmControl.groovy new file mode 100644 index 0000000..dc5214e --- /dev/null +++ b/scripts/toy/orgasmControl.groovy @@ -0,0 +1,141 @@ +{ toy -> + // Return whether toy came or not + toy.metaClass.mightCum { time, lenient = false, reason = "without permission" -> + final taken = showButtonG("Sorry, ${dommeTitle()}, I'm cumming $reason", "cumming", time); + if (taken < time) { + playBackgroundSound(null); + if (lenient && taken < 2) { + present(null, [ + ["Awww.", "Damn."], + ["That was close;", "I'll let you have that one;"], + ["And I was looking forward to punishing you.", "No punishment this time."]]); + } + else { + present(null, [ + ["Bah!", "Pfft. I'm very disappointed in you."], + ["Ruin it.", "Don't touch it."]]); + sessionAborted = CUM; + adjustPunish(80); + } + adjustPunish(taken * 10); + pause(10); + present([DRESSED], [["Clean up your mess!"]]); + showButtonG("Yes, ${dommeTitle()}", "ok"); + pause(10); + showButtonG("Cleaned up, ${dommeTitle()}, back", "back"); + return true; + } + return false; + }; + + // Return whether toy came or not, despite being denied + toy.metaClass.cumChanceDenied { lenient = false -> + present([TEASE], [ + ["Stop!", "Nope!", "Haha! No!"], + ["Let go.", "Hands off!", "Hands behind your back."], + ["Not this time.", "Maaaaybe next time, toy."]]); + return mightCum(15, lenient); + }; + + toy.metaClass.cumChanceCountdown { + present([TEASE], [ + ["OK, toy, I'm going to count you down.", "Would you like a countdown, toy?"], + ["Get stroking!", "Jerk it!"]]); + if (mightCum(5 + getRandom(5))) return true; + present([TITS], []); + def numbers = ""; + for (def n = 10; n > 0; n--) { + numbers += "${n}... "; + show(numbers); + mightCum(1, false, "too soon"); + if (getRandom(100) > 85 || !can(CUM)) { + return cumChanceDenied(); + } + } + present([TITS], [ + ["Cum, cum", "Cum for me"], + ["you little slut.", "my lucky toy.", "you dirty boy."]]); + pause(10); + showButtonG("Thank you, ${dommeTitle()}.", "ok"); + return true; + }; + + toy.metaClass.cumChanceWindow { + present([TEASE], [ + ["OK, toy, I'm going to give you a chance to cum.", "Would you like a small chance to cum, toy?"], + ["Get stroking!", "Stroke it, you'll need to be close!"], + ["You won't get long.", "You might not get long.", "Wait for my say so..."]]); + if (mightCum(15 + getRandom(60), false, "too soon")) return true; + if (getRandom(5) > 0 || !can(CUM)) { + return cumChanceDenied(); + } + present([TITS], [ + ["Cum, cum", "Cum for me"], + ["you little slut.", "my lucky toy.", "you dirty boy."]]); + def w = 4 + getRandom(4); + if (showButtonG("Cumming, ${dommeTitle()}", "cumming", w) == w) { + w = 3; + present(null, [ + ["Quickly now!", "Hurry!"]]); + if (showButtonG("Cumming, ${dommeTitle()}", "cumming", w) == w) { + present([TEASE], [ + ["Stop!", "Let go.", "Hands off!"], + ["Time's up!", "You had your chance."]]); + return mightCum(15, true, "too late"); + } + } + pause(10); + showButtonG("Thank you, ${dommeTitle()}.", "ok"); + return true; + }; + + toy.metaClass.cumChanceRuin { + present([TEASE], [ + ["Stroke!", "Jerk it."], + ["Get close to the edge, toy...", "Get yourself close..."]]); + if (mightCum(5 + getRandom(10), false, "too soon")) return true; + if (getRandom(5) > 0 || !can(CUM)) { + return cumChanceDenied(); + } + for (def n = 3 + getRandom(6); n >= 0; n--) { + present([TITS], [ + ["Try to cum!"]]); + def w = 3 + getRandom(8); + if (showButtonG("Cumming, ${dommeTitle()}", "cumming", w) < w) { + present([TEASE], [ + ["Hands off!", "Leave it."], + ["Let it all ooze out.", "You're not getting a proper release."]]); + pause(10); + showButtonG("Thank you, ${dommeTitle()}.", "ok"); + return true; + } + if (n > 0) { + present([TITS], [ + ["Stop!", "Not now!", "Wait!"], + ["Hands off!", "Hands by your side."]]); + w = (w - 2) + getRandom(8); + if (mightCum(w, true, "but it's ruined")) return true; + } + } + return cumChanceDenied(true); + }; + + toy.metaClass.postCum { + if (stateIs(CHASTE)) return; + present([TEASE], [ + ["How about I let you cum?", "Maybe I should let you cum."], + ["Would you like that?", "Let some of that frustration out?"]]); + pause(getRandom(5) + 5); + def ways = [cumChanceRuin, cumChanceWindow, cumChanceCountdown]; + if (ways[getRandom(ways.size())]()) { + // Once toy has cum, revoke permission for a while + revokePermission(CUM); + } + }; + + toy.addActivity("postCum", { toy.postCum() }); + toy.addActivity("postPermitCum", { + // 2 - 4 days from now + toy.addEventIfMissing(CUM, getTime() + (DAY * 2) + getRandom(DAY * 2), PERMIT, CUM); + }); +} -- cgit v1.2.3