summaryrefslogtreecommitdiff
path: root/scripts/toy.groovy
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/toy.groovy')
-rw-r--r--scripts/toy.groovy71
1 files changed, 57 insertions, 14 deletions
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 = {