summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2019-06-23 12:39:24 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2019-06-23 12:39:24 +0100
commit973154c8252821c58996cab2c28068824c0137ea (patch)
tree57e6c800216304e629cc80542ab30d03742bbaaf
parentExtract chastity into a module (diff)
downloadtoy-973154c8252821c58996cab2c28068824c0137ea.zip
Extract teasing into a module
-rw-r--r--scripts/toy.groovy183
-rw-r--r--scripts/toy/tease.groovy192
2 files changed, 193 insertions, 182 deletions
diff --git a/scripts/toy.groovy b/scripts/toy.groovy
index 538c639..7ca5beb 100644
--- a/scripts/toy.groovy
+++ b/scripts/toy.groovy
@@ -296,45 +296,6 @@ return new Object() {
}
return null;
};
- def harden = { imageSpec ->
- expose(imageSpec);
- present(imageSpec, [
- ["I want to see you hard.", "I need you hard now, very hard."],
- ["Stroke it, slowly...", "Slow worship strokes..."],
- ["don't edge...", "no edging..."],
- ["and do NOT cum.", "and definitely no cumming."],
- ["Not yet.", "Maybe soon."]]);
- playBackgroundSound("toy/90bpm.mp3", 2); //45sec
- if (showButtonG("Hard, ${dommeTitle()}", "hard", 60) == 60) {
- playBackgroundSound(null);
- present(imageSpec, [
- ["What's taking so long!?", "Come on!", "Don't disappoint me."],
- ["Slap it about a bit!.", "Get it hard, now!", "Pinch your nipples."]]);
- playBackgroundSound("toy/165bpm.mp3");
- if (showButtonG("Hard, ${dommeTitle()}", "hard", 30) == 30) {
- playBackgroundSound("toy/180bpm.mp3");
- if (showButtonG("Hard, ${dommeTitle()}", "hard", 30) == 30) {
- sessionAborted = SOFT;
- present(imageSpec, [
- ["Bah!", "Pathetic!"],
- ["That's no good to me!", "How do I have fun with that!?"]]);
- adjustPunish(100);
- showButtonG("Sorry, ${dommeTitle()}", "sorry");
- }
- }
- }
- playBackgroundSound(null);
- };
- def expose = { imageSpec ->
- if (sessionToys[COCK]) return;
- if (!stateIs(NAKED)) {
- present(imageSpec, [
- ["Get that cock out, toy;", "Let's see that cock of mine."],
- ["I want to torment it.", "It's playtime!"]]);
- wait(10);
- }
- sessionToys[COCK] = getTime();
- };
// 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);
@@ -451,121 +412,6 @@ return new Object() {
}
return cumChanceDenied(true);
};
- def edge = { amount, imageSpec ->
- def allowedTime = 128;
- (getRandom(amount) + 2).times {
- if (sessionAborted) return;
- present(imageSpec, [
- ["Stroke to edge now, toy...", "Edge!"],
- ["Don't cum.", "No cumming.", "No accidents though."]]);
- showButtonGT("Edging, ${dommeTitle()}", "edging", allowedTime + 20, 1);
- if (getRandom(2) == 1) {
- present(imageSpec, [
- ["Hold it...", "And hold...", "Keeping going..."]]);
- if (mightCum(getRandom(20) + 5)) return;
- }
- present(imageSpec, [
- ["Hands off!", "Stop!"]]);
- if (mightCum(getRandom(5) + 5)) return;
- allowedTime /= 2;
- };
- };
- def strokes = { amount, imageSpec ->
- def tags = present(imageSpec, [
- ["Stroke to the beat, toy.", "Follow the beat.", "Beat it!"],
- ["No cumming unless I say so...", "Don't cum without my say so,"],
- ["Tell me if you get too close.", "so tell me if you're edging.", "I don't want any messes."]]);
- final BEATS = [
- // bpm:30, len:60 ],
- [ bpm:90, len:45 ],
- [ bpm:165, len:30 ],
- [ bpm:180, len:30 ],
- [ bpm:240, len:20 ],
- ];
- def sto = loadInteger("toy.strokeTeaseOffset");
- def edges = 0;
- def itr = 0;
- (getRandom(amount) + 5).times {
- if (sessionAborted) return;
- switch (itr) {
- case 2:
- final cmt = imageTagsComment(tags);
- if (cmt) {
- show(cmt);
- }
- break;
- case 4:
- present(null, [
- ["Don't stop stroking!", "Keep jerking.", "Keep stroking."]]);
- break;
- }
- itr += 1;
- def beatNo = getRandom(BEATS.size());
- def beat = BEATS[beatNo];
- playBackgroundSound("toy/${beat.bpm}bpm.mp3", 10); // Lots, to cover offset
- def len = getRandom(Math.max(5, beat.len + (sto * beatNo)));
- if (showButtonG("Edging, ${dommeTitle()}", "edging", len) < len) {
- sto -= 1;
- edges += 1;
- itr = 0;
- playBackgroundSound(null);
- switch (getRandom(3)) {
- case 0:
- present(imageSpec, [
- ["Stop!", "Let go!", "Hands off!"]]);
- if (mightCum(getRandom(8) + 10)) return;
- break;
- case 1:
- present(imageSpec, [
- ["Careful now...", "No accidents..."],
- ["slow it down...", "slowly now..."]]);
- playBackgroundSound("toy/30bpm.mp3");
- if (mightCum(getRandom(20) + 5)) {
- playBackgroundSound(null);
- return;
- }
- case 2:
- switch(getSelectedValue("Would you like to cum, toy?", [
- gagText("Please, ${dommeTitle()}, may I cum!?", "yes"),
- gagText("No, ${dommeTitle()}, please torment me more!", "no")
- ])) {
- case 0:
- if (can(CUM)) {
- present(imageSpec, [
- ["Maybe...", "Perhaps.", "We'll see."]]);
- }
- else {
- present(imageSpec, [
- ["No you may not!", "Nope.", "Not a chance."]]);
- adjustPunish(5);
- }
- break;
- case 1:
- present(imageSpec, [
- ["Good boy.", "Very well.", "OK then!"]]);
- adjustPunish(-5);
- break;
- }
- if (mightCum(getRandom(8) + 5)) {
- playBackgroundSound(null);
- return;
- }
- playBackgroundSound(null);
- }
- tags = present(imageSpec, [
- ["Back to stroking, toy...", "Get to it again...."],
- ["follow the beat..."],
- ["no accidents.", "and concentrate."]]);
- }
- else {
- playBackgroundSound(null);
- }
- }
- if (edges == 0) {
- sto += 1;
- }
- save("toy.strokeTeaseOffset", sto);
- }
def clampPulls = { amount ->
getRandom(1 + amount).times {
if (getRandom(2)) {
@@ -614,15 +460,6 @@ return new Object() {
return amount;
};
// Pre-tease
- def preEdge = {
- if (stateIs(CHASTE)) return;
- harden([DRESSED]);
- edge(4, [DRESSED]);
- present([DRESSED], [
- ["And relax...", "Hands off..."],
- ["cool down a little.", "but keep it hard for me!", "for now!"]]);
- wait(getRandom(5) + 5);
- };
def preGag = {
if (stateIs(GAGGED)) return 1.2;
if (!has(BALLGAG)) return;
@@ -722,11 +559,6 @@ return new Object() {
};
// Post
- def postEdge = {
- if (stateIs(CHASTE)) return;
- if (!can(EDGE)) return;
- edge(6, [TEASE]);
- };
def postCum = {
if (stateIs(CHASTE)) return;
present([TEASE], [
@@ -741,16 +573,6 @@ return new Object() {
};
// Play
- def playStrokes = {
- preRelease();
- harden([TITS]);
- strokes(15, [TITS]);
- };
- def playEdges = {
- preRelease();
- harden([TITS]);
- edge(6, [TITS]);
- };
def playNothing = {
(getRandom(3) + 2).times {
show(imageTagsComment(showImage([TITS])));
@@ -1146,13 +968,10 @@ return new Object() {
final activityList = [
'intSqueeze': intSqueeze,
'intClamps': intClamps,
- 'preEdge': preEdge,
'preGag': preGag,
'preStrip': preStrip,
'preCollar': preCollar,
'preClamps': preClamps,
- 'playStrokes': playStrokes,
- 'playEdges': playEdges,
'playKneel': playKneel,
'playBeatBalls': playBeatBalls,
'playBeatCock': playBeatCock,
@@ -1530,7 +1349,6 @@ return new Object() {
}
save("toy.availability", p2);
};
- setDefault("toy.strokeTeaseOffset", 0);
setDefault("toy.punishment", 0);
execEvents(false);
setupEvents();
@@ -1611,6 +1429,7 @@ return new Object() {
* scripts/toy/intro.groovy
* scripts/toy/sleep.groovy
* scripts/toy/social.groovy
+ * scripts/toy/tease.groovy
* images/toy/ancilla/corset/1.jpg
* images/toy/ancilla/corset/10.jpg
* images/toy/ancilla/corset/11.jpg
diff --git a/scripts/toy/tease.groovy b/scripts/toy/tease.groovy
new file mode 100644
index 0000000..4fa42d9
--- /dev/null
+++ b/scripts/toy/tease.groovy
@@ -0,0 +1,192 @@
+{ toy ->
+ toy.metaClass.preEdge {
+ if (stateIs(CHASTE)) return;
+ harden([DRESSED]);
+ edge(4, [DRESSED]);
+ present([DRESSED], [
+ ["And relax...", "Hands off..."],
+ ["cool down a little.", "but keep it hard for me!", "for now!"]]);
+ pause(getRandom(5) + 5);
+ };
+
+ toy.metaClass.postEdge {
+ if (stateIs(CHASTE)) return;
+ if (!can(EDGE)) return;
+ edge(6, [TEASE]);
+ };
+
+ toy.metaClass.harden { imageSpec ->
+ expose(imageSpec);
+ present(imageSpec, [
+ ["I want to see you hard.", "I need you hard now, very hard."],
+ ["Stroke it, slowly...", "Slow worship strokes..."],
+ ["don't edge...", "no edging..."],
+ ["and do NOT cum.", "and definitely no cumming."],
+ ["Not yet.", "Maybe soon."]]);
+ playBackgroundSound("toy/90bpm.mp3", 2); //45sec
+ if (showButtonG("Hard, ${dommeTitle()}", "hard", 60) == 60) {
+ playBackgroundSound(null);
+ present(imageSpec, [
+ ["What's taking so long!?", "Come on!", "Don't disappoint me."],
+ ["Slap it about a bit!.", "Get it hard, now!", "Pinch your nipples."]]);
+ playBackgroundSound("toy/165bpm.mp3");
+ if (showButtonG("Hard, ${dommeTitle()}", "hard", 30) == 30) {
+ playBackgroundSound("toy/180bpm.mp3");
+ if (showButtonG("Hard, ${dommeTitle()}", "hard", 30) == 30) {
+ sessionAborted = SOFT;
+ present(imageSpec, [
+ ["Bah!", "Pathetic!"],
+ ["That's no good to me!", "How do I have fun with that!?"]]);
+ adjustPunish(100);
+ showButtonG("Sorry, ${dommeTitle()}", "sorry");
+ }
+ }
+ }
+ playBackgroundSound(null);
+ };
+
+ toy.metaClass.expose { imageSpec ->
+ if (sessionToys[COCK]) return;
+ if (!stateIs(NAKED)) {
+ present(imageSpec, [
+ ["Get that cock out, toy;", "Let's see that cock of mine."],
+ ["I want to torment it.", "It's playtime!"]]);
+ pause(10);
+ }
+ sessionToys[COCK] = getTime();
+ };
+
+ toy.metaClass.edge { amount, imageSpec ->
+ def allowedTime = 128;
+ (getRandom(amount) + 2).times {
+ if (sessionAborted) return;
+ present(imageSpec, [
+ ["Stroke to edge now, toy...", "Edge!"],
+ ["Don't cum.", "No cumming.", "No accidents though."]]);
+ showButtonGT("Edging, ${dommeTitle()}", "edging", allowedTime + 20, 1);
+ if (getRandom(2) == 1) {
+ present(imageSpec, [
+ ["Hold it...", "And hold...", "Keeping going..."]]);
+ if (mightCum(getRandom(20) + 5)) return;
+ }
+ present(imageSpec, [
+ ["Hands off!", "Stop!"]]);
+ if (mightCum(getRandom(5) + 5)) return;
+ allowedTime /= 2;
+ };
+ };
+
+ toy.metaClass.strokes { amount, imageSpec ->
+ def tags = present(imageSpec, [
+ ["Stroke to the beat, toy.", "Follow the beat.", "Beat it!"],
+ ["No cumming unless I say so...", "Don't cum without my say so,"],
+ ["Tell me if you get too close.", "so tell me if you're edging.", "I don't want any messes."]]);
+ final BEATS = [
+ // bpm:30, len:60 ],
+ [ bpm:90, len:45 ],
+ [ bpm:165, len:30 ],
+ [ bpm:180, len:30 ],
+ [ bpm:240, len:20 ],
+ ];
+ def sto = loadInteger("toy.strokeTeaseOffset");
+ def edges = 0;
+ def itr = 0;
+ (getRandom(amount) + 5).times {
+ if (sessionAborted) return;
+ switch (itr) {
+ case 2:
+ final cmt = imageTagsComment(tags);
+ if (cmt) {
+ show(cmt);
+ }
+ break;
+ case 4:
+ present(null, [
+ ["Don't stop stroking!", "Keep jerking.", "Keep stroking."]]);
+ break;
+ }
+ itr += 1;
+ def beatNo = getRandom(BEATS.size());
+ def beat = BEATS[beatNo];
+ playBackgroundSound("toy/${beat.bpm}bpm.mp3", 10); // Lots, to cover offset
+ def len = getRandom(Math.max(5, beat.len + (sto * beatNo)));
+ if (showButtonG("Edging, ${dommeTitle()}", "edging", len) < len) {
+ sto -= 1;
+ edges += 1;
+ itr = 0;
+ playBackgroundSound(null);
+ switch (getRandom(3)) {
+ case 0:
+ present(imageSpec, [
+ ["Stop!", "Let go!", "Hands off!"]]);
+ if (mightCum(getRandom(8) + 10)) return;
+ break;
+ case 1:
+ present(imageSpec, [
+ ["Careful now...", "No accidents..."],
+ ["slow it down...", "slowly now..."]]);
+ playBackgroundSound("toy/30bpm.mp3");
+ if (mightCum(getRandom(20) + 5)) {
+ playBackgroundSound(null);
+ return;
+ }
+ case 2:
+ switch(getSelectedValue("Would you like to cum, toy?", [
+ gagText("Please, ${dommeTitle()}, may I cum!?", "yes"),
+ gagText("No, ${dommeTitle()}, please torment me more!", "no")
+ ])) {
+ case 0:
+ if (can(CUM)) {
+ present(imageSpec, [
+ ["Maybe...", "Perhaps.", "We'll see."]]);
+ }
+ else {
+ present(imageSpec, [
+ ["No you may not!", "Nope.", "Not a chance."]]);
+ adjustPunish(5);
+ }
+ break;
+ case 1:
+ present(imageSpec, [
+ ["Good boy.", "Very well.", "OK then!"]]);
+ adjustPunish(-5);
+ break;
+ }
+ if (mightCum(getRandom(8) + 5)) {
+ playBackgroundSound(null);
+ return;
+ }
+ playBackgroundSound(null);
+ }
+ tags = present(imageSpec, [
+ ["Back to stroking, toy...", "Get to it again...."],
+ ["follow the beat..."],
+ ["no accidents.", "and concentrate."]]);
+ }
+ else {
+ playBackgroundSound(null);
+ }
+ }
+ if (edges == 0) {
+ sto += 1;
+ }
+ save("toy.strokeTeaseOffset", sto);
+ }
+
+ toy.metaClass.playStrokes {
+ preRelease();
+ harden([TITS]);
+ strokes(15, [TITS]);
+ };
+
+ toy.metaClass.playEdges {
+ preRelease();
+ harden([TITS]);
+ edge(6, [TITS]);
+ };
+
+ toy.setDefault("toy.strokeTeaseOffset", 0);
+ toy.addActivity("playStrokes", { toy.playStrokes() });
+ toy.addActivity("playEdges", { toy.playEdges() });
+ toy.addActivity("preEdge", { toy.preEdge() });
+}