From 4ef3eb65a074fc953ebfa11e40f044333a90b29d Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 1 Dec 2018 14:15:46 +0000 Subject: Add possibility to cum without permission Includes start of basic behavioural functions --- scripts/toy.groovy | 71 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 14 deletions(-) (limited to 'scripts') diff --git a/scripts/toy.groovy b/scripts/toy.groovy index 43458e1..b4836ce 100644 --- a/scripts/toy.groovy +++ b/scripts/toy.groovy @@ -169,6 +169,9 @@ def can = {i -> loadBoolean("toy.permission.$i") == true}; def is = {i -> loadBoolean("toy.state.$i") == true}; def set = {i, s -> save("toy.state.$i", s)}; def positioned = { i -> loadString("toy.position") == i }; +def adjustPunish = { p -> save("toy.punishment", getPunish() + p); }; +def getPunish = { loadInteger("toy.punishment"); }; +def sessionAborted = null; def gagText = { t -> if (!is(GAGGED)) return t; return t.split(/\s+/) @@ -216,8 +219,26 @@ def expose = { imageSpec -> wait(10); } }; +def mightCum = { time -> + if (showButtonG("Sorry, misstress, I'm cumming without permission", time) < time) { + playBackgroundSound(null); + sessionAborted = CUM; + present(null, [ + ["Bah!", "Pfft. I'm very disappointed in you."], + ["Ruin it.", "Don't touch it."]]); + adjustPunish(100); + wait(10); + present([DRESSED], [["Clean up your mess!"]]); + showButtonG("Yes, misstress"); + wait(10); + showButtonG("Cleaned up, misstress, back"); + return true; + } + return false; +}; def edge = { amount, imageSpec -> (getRandom(amount) + 2).times { + if (sessionAborted) return; present(imageSpec, [ ["Stroke to edge now, toy...", "Edge!"], ["Don't cum.", "No cumming.", "No accidents though."]]); @@ -225,11 +246,11 @@ def edge = { amount, imageSpec -> if (getRandom(2) == 1) { present(imageSpec, [ ["Hold it...", "And hold...", "Keeping going..."]]); - wait(getRandom(20) + 5); + if (mightCum(getRandom(20) + 5)) return; } present(imageSpec, [ ["Hands off!", "Stop!"]]); - wait(getRandom(5) + 5); + if (mightCum(getRandom(5) + 5)) return; }; }; def strokes = { amount, imageSpec -> @@ -247,6 +268,7 @@ def strokes = { amount, imageSpec -> def sto = loadInteger("toy.strokeTeaseOffset"); def edges = 0; (getRandom(amount) + 5).times { + if (sessionAborted) return; def beatNo = getRandom(BEATS.size()); def beat = BEATS[beatNo]; playBackgroundSound("toy/${beat.bpm}bpm.mp3", 10); // Lots, to cover offset @@ -259,15 +281,14 @@ def strokes = { amount, imageSpec -> case 0: present(imageSpec, [ ["Stop!", "Let go!", "Hands off!"]]); - wait(getRandom(8) + 10); + if (mightCum(getRandom(8) + 10)) return; break; case 1: present(imageSpec, [ ["Careful now...", "No accidents..."], ["slow it down...", "slowly now..."]]); playBackgroundSound("toy/30bpm.mp3"); - wait(getRandom(20) + 5); - playBackgroundSound(null); + if (mightCum(getRandom(20) + 5)) return; case 2: switch(getSelectedValue("Would you like to cum, toy?", [ gagText("Please, mistress, may I cum!?"), @@ -282,7 +303,7 @@ def strokes = { amount, imageSpec -> ["Good boy.", "Very well.", "OK then!"]]); break; } - wait(getRandom(8) + 5); + if (mightCum(getRandom(8) + 5)) return; } present(imageSpec, [ ["Back to stroking, toy...", "Get to it again...."], @@ -554,19 +575,33 @@ def sessionSummon = { imageSpec -> def sessionPlay = { def play = { amount, activities -> (getRandom(amount) + 1).times { - activities[getRandom(activities.size())](); + if (!sessionAborted) { + activities[getRandom(activities.size())](); + } }; }; play(3, [preRelease, preEdge, preGag, preClamps, preCollar, preStrip]); play(3, [playStrokes, playEdges, playNothing]); play(2, [postEdge, postCum, postChastity]); }; -def sessionRelease = { - present([DRESSED], [ - ["Ahhh,", "OK,"], - ["I'm done with you for now.", "That was fun... for me at least."]]); +def sessionRelease = { goodToy -> + if (goodToy) { + present([DRESSED], [ + ["Ahhh,", "OK,"], + ["I'm done with you for now.", "That was fun... for me at least."]]); + } + else { + present([DRESSED], [ + ["I don't ask much of you, toy."]]); + } wait(getRandom(10) + 5); if (is(CUFFED) || is(COLLARED) || is(CLAMPED) || is(GAGGED)) { + if (!goodToy) { + present([DRESSED], [ + ["I should leave you like that.", "I suppose you still want letting free?"], + ["Maybe.", "Let me ponder on it."]]); + wait(getRandom(20) + 20); + } present([DRESSED], [ ["You may release yourself", "Free yourself"]]); wait(getRandom(5) + 5); @@ -581,17 +616,24 @@ def sessionRelease = { wait(getRandom(10) + 15); set(NAKED, false); } - present([DRESSED], [ - ["Off you go.", "You may leave."]]); + if (goodToy) { + present([DRESSED], [ + ["Off you go.", "You may leave."]]); + } + else { + present([DRESSED], [ + ["Get out of my sight.", "Go!"]]); + } wait(10); setImage(null); + sessionAborted = null; show(null); }; def playtime = { dress([[DRESSED,nTEASE],[DRESSED,TEASE],[TITS]]); if (sessionSummon([DRESSED,nTEASE])) { sessionPlay(); - sessionRelease(); + sessionRelease(sessionAborted == null); } } def bedtime = { @@ -664,6 +706,7 @@ def setupInitial = { } save("toy.version", VERSION); setDefault("toy.strokeTeaseOffset", 0); + setDefault("toy.punishment", 0); setupPlans(); }; def setupShowState = { -- cgit v1.2.3