summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/toy.groovy207
1 files changed, 114 insertions, 93 deletions
diff --git a/scripts/toy.groovy b/scripts/toy.groovy
index 17453fa..b500188 100644
--- a/scripts/toy.groovy
+++ b/scripts/toy.groovy
@@ -27,9 +27,9 @@ final CHASTE = "chaste", COLLARED = "collared", CUFFED = "cuffed", CLAMPED = "cl
final REDRESS = "redress";
final TOYTOYS = [CUFFED, COLLARED, CLAMPED, GAGGED];
final RELEASEFROM = "releaseFrom";
-// toy.plan.<name>.{start|end|friend} UTC times
-final LUNCH = "lunch", SHOPPING = "shopping", PARTY = "party";
-final START = "start", END = "end", FRIEND = "friend";
+final LUNCH = "lunch", SHOPPING = "shopping", PARTY = "party", SLEEPING = "sleeping";
+final BEDTIME = "bedtime", WAKEUP = "wakeup";
+final BEGINPLAN = "beginPlan", ENDPLAN = "endPlan";
final FRIENDS = [ "Tori", "Sophie", "Krystal" ];
// toy.position
final KNEELING = "kneeling", ALLFOURS = "allfours", STANDING = "standing";
@@ -1151,6 +1151,7 @@ def playWait = {
wait(20 + getRandom(20));
};
def playSchedule = { lastPlay ->
+ if (getAway()) return;
if (lastPlay < getTime() - (4 * HOUR)) {
addEventIfMissing(PLAY, getTime() + 120 + getRandom(480), PLAY, true); // 2-10mins
}
@@ -1175,9 +1176,13 @@ def playEvent = { rt = true, first = true ->
playSchedule(getTime());
showLounge();
}
-def bedtime = {
+def sleepSchedule = {
+ def t = (int)(getDay() + localTimeOffset() + (25.1 * HOUR) + getRandom((int)HOUR));
+ addEventIfMissing(SLEEPING, t, BEDTIME);
+};
+def bedtime = { rt, schedTime ->
dress([[LINGERIE,nTITS]]);
- if (sessionSummon([LINGERIE,nTITS])) {
+ if (rt && sessionSummon([LINGERIE,nTITS])) {
preStrip([LINGERIE,nTITS]);
def toys = TOYTOYS.findAll { t -> is(t) };
Collections.shuffle(toys);
@@ -1195,7 +1200,18 @@ def bedtime = {
removeEvent("$RELEASEFROM-$it");
set(it, false);
};
- exit();
+ setAway(SLEEPING);
+ def t = schedTime + (6 * (int)HOUR) + getRandom(2 * (int)HOUR);
+ addEvent(SLEEPING, t, WAKEUP);
+ removeEvent(PLAY);
+ if (rt) {
+ exit();
+ }
+};
+def wakeup = { rt ->
+ setAway(null);
+ playSchedule(loadInteger("toy.lastPlay") ?: 0);
+ sleepSchedule();
};
def redress = { rt ->
if (!rt || !sessionSummon([DRESSED])) {
@@ -1352,22 +1368,22 @@ def confess = {
// Setup
// Plans - cannot overlap
def setupPlan = { plan, float startmin, float startmax, float endmin, float endmax ->
- def timeWindow = { float min, float max -> (int)((min * HOUR) + getRandom((int)((max - min) * HOUR))) };
- // Unplanned or past
- if (getTime() > loadInteger("toy.plan.${plan}.${END}")) {
- def day = getDay() + ((getRandom(3) + 1) * DAY);
- save("toy.plan.${plan}.${FRIEND}", FRIENDS[getRandom(FRIENDS.size())]);
- save("toy.plan.${plan}.${START}", day + timeWindow(startmin, startmax));
- save("toy.plan.${plan}.${END}", day + timeWindow(endmin, endmax));
- }
+ def timeWindow = { float min, float max -> (int)((min * HOUR) + localTimeOffset() + getRandom((int)((max - min) * HOUR))) };
+ final friendName = FRIENDS[getRandom(FRIENDS.size())];
+ def day = getDay() + ((getRandom(3) + 1) * DAY);
+ addEventIfMissing(plan, day + timeWindow(startmin, startmax), BEGINPLAN,
+ [friendName: friendName, returnTime: day + timeWindow(endmin, endmax)]);
}
def setupPlans = {
+ save("toy.plan", null);
setupPlan(LUNCH, 11.5, 12.5, 13.0, 14.0)
setupPlan(SHOPPING, 14.5, 15.5, 16.0, 18.0)
setupPlan(PARTY, 19, 20, 22.0, 25.0)
};
def setupEvents = {
playSchedule(loadInteger("toy.lastPlay") ?: 0);
+ sleepSchedule();
+ setupPlans();
};
def setDefault = { prop, val ->
if (loadString(prop) == null) {
@@ -1384,10 +1400,10 @@ def readNote = {
def plannedCheck = { plan ->
return (getTime() > loadInteger("toy.plan.${plan}.${START}") && getTime() < loadInteger("toy.plan.${plan}.${END}"));
}
-def beginPlan = { plan ->
+def beginPlan = { rt, plan, args ->
+ addEvent(plan, args.returnTime, ENDPLAN, args.friendName);
dress([[DRESSED,nTEASE], [DRESSED,TEASE]]);
- save("toy.owner.outfitTime", loadInteger("toy.plan.${plan}.${END}"));
- if (sessionSummon([DRESSED,nTEASE])) {
+ if (rt && sessionSummon([DRESSED,nTEASE])) {
present([DRESSED,nTEASE], [
[ "I'm going out now, toy.", "$plan time!" ],
[ "Will you be good while I'm gone?", "You will behave as I expect?" ]]);
@@ -1399,16 +1415,34 @@ def beginPlan = { plan ->
present([DRESSED,TEASE], [
[ "Back later!", "See you soon, toy" ]]);
wait(5);
- exit();
}
- if (has(CHASTITY)) {
+ else if (has(CHASTITY)) {
leaveNote("I want you in chastity until I return!", CHASTE);
}
- adjustPunish(5);
- exit();
+ setAway(plan);
+ removeEvent(PLAY);
+ if (rt) {
+ exit();
+ }
+};
+def endPlan = { rt, plan ->
+ save("toy.owner.outfitTime", getTime());
+ setAway(null);
+ if (rt && sessionSummon([DRESSED])) {
+ present([DRESSED], [["Hello, toy!"], ["I'm back home now."]]);
+ wait(10);
+ showLounge();
+ }
+ readNote();
+ playSchedule(getTime());
+ setupPlans();
};
// Initial - basic checks and defaults
namedEvents = [
+ bedtime: { name, arg, schedTime, rt -> bedtime(rt, schedTime) },
+ wakeup: { name, arg, schedTime, rt -> wakeup(rt) },
+ beginPlan: { name, arg, schedTime, rt -> beginPlan(rt, name, arg) },
+ endPlan: { name, arg, schedTime, rt -> endPlan(rt, name) },
play: { name, arg, schedTime, rt -> playEvent(rt, arg) },
releaseFrom: { name, arg, schedTime, rt -> releaseFrom(rt, arg, name) },
redress: { name, arg, schedTime, rt -> redress(rt) },
@@ -1464,7 +1498,6 @@ def setupInitial = {
save("toy.version", VERSION);
setDefault("toy.strokeTeaseOffset", 0);
setDefault("toy.punishment", 0);
- setupPlans();
execEvents(false);
setupEvents();
};
@@ -1489,10 +1522,13 @@ def setupShowState = {
showButton("OK");
};
def setupShowCalendar = {
+ final events = loadEvents();
show(
[LUNCH, SHOPPING, PARTY].collect {
- def s = loadInteger("toy.plan.${it}.${START}");
- def f = loadString("toy.plan.${it}.${FRIEND}");
+ final event = events[it];
+ if (!event) return "";
+ def s = event.time;
+ def f = event.arg.friendName;
def timeStr = localTimeOf(s).format(soonFormatter);
return "$it with $f on $timeStr.\n".capitalize();
}.join());
@@ -1520,85 +1556,70 @@ def tidyAvail = {
}
save("toy.availability", p2);
};
-if (localTime() > 25.75 || localTime() < 7.5) { // 1:45am - 7:30am
- show("Mistress is sleeping...");
- wait(10);
- exit();
-}
-if (plannedCheck(LUNCH) || plannedCheck(SHOPPING) || plannedCheck(PARTY)) {
- showLounge();
- def note = loadString("toy.note");
- def noteInstr = loadString("toy.noteInstr");
- if (note) {
- show("Mistress is out... but you find a note:\n$note");
- showButton("OK");
- if (noteInstr) {
- set(noteInstr, true);
- }
- readNote();
- }
- else {
- show("Mistress is out...");
- wait(10);
- }
- while (plannedCheck(LUNCH) || plannedCheck(SHOPPING) || plannedCheck(PARTY)) {
- wait(5);
- }
- execEvents(false);
- if (sessionSummon([DRESSED])) {
- present([DRESSED], [["Hello, toy!"], ["I'm back home now."]]);
- wait(10);
- showLounge();
- }
-}
-else {
- leaveNote(null, null);
-}
setupInitial();
tidyAvail();
-final cycleTime = 6;
+final cycleTime = 60;
showLounge();
while (true) {
- show("Mistress will summon you when required.");
- if (showButton("Please, Miss?", cycleTime) < cycleTime) {
- def opts = [
- [ lbl: "Calendar", act: setupShowCalendar ],
- [ lbl: "Confess", act: confess ],
- ];
- if (is("DEBUG")) {
- opts.push([ lbl: "Status", act: setupShowState ]);
- opts.push([ lbl: "Play", act: playEvent, arg: true ]);
- opts.push([ lbl: "Begin plan", act: beginPlan, arg: LUNCH ]);
+ def away = getAway();
+ def e = nextEvent(loadEvents());
+ if (!e) return "toy"; // Force restart, should create some events
+
+ if (away) {
+ def note = loadString("toy.note");
+ def noteInstr = loadString("toy.noteInstr");
+ if (note) {
+ show("Mistress is away ($away)... but you find a note:\n$note");
+ showButton("OK");
+ if (noteInstr) {
+ set(noteInstr, true);
+ }
+ readNote();
}
- if (is(NAKED)) {
- opts.push([ lbl: "May I wear clothes", act: requestClothes ]);
+ else {
+ show("Mistress is away ($away)...");
+ }
+ if (e && e.event && e.event.time > getTime()) {
+ wait(e.event.time - getTime());
}
- TOYTOYS.findAll { is(it) }.each {
- opts.push([ lbl: "May I be un-$it".toString(), act: requestRelease, arg: it ]);
- };
- opts.push([ lbl: "Back", act: null ]);
- def opt = getSelectedValue("Yes, toy?", opts.collect { it.lbl });
- def act = opts[opt].act;
- if (act)
- act(opts[opt].arg);
- else
- return "toy";
- }
- else if (localTime() > 25.75) { // 1:45am
- bedtime();
- }
- else if (plannedCheck(LUNCH)) {
- beginPlan(LUNCH);
- }
- else if (plannedCheck(SHOPPING)) {
- beginPlan(SHOPPING);
}
- else if (plannedCheck(PARTY)) {
- beginPlan(PARTY);
+ else {
+ if (is("DEBUG")) {
+ def timeStr = localTimeOf(e.event.time).format(soonFormatter);
+ show("$e.name: $timeStr -> ${e.event.func}(${e.event.arg})");
+ }
+ else {
+ show("Mistress will summon you when required.");
+ }
+ final waitTime = Math.min(cycleTime, e.event.time - getTime());
+ final clickTime = showButton("Please, Miss?", waitTime);
+ if (clickTime < waitTime) {
+ def opts = [
+ [ lbl: "Calendar", act: setupShowCalendar ],
+ [ lbl: "Confess", act: confess ],
+ ];
+ if (is("DEBUG")) {
+ opts.push([ lbl: "Status", act: setupShowState ]);
+ opts.push([ lbl: "Play", act: playEvent, arg: true ]);
+ }
+ if (is(NAKED)) {
+ opts.push([ lbl: "May I wear clothes", act: requestClothes ]);
+ }
+ TOYTOYS.findAll { is(it) }.each {
+ opts.push([ lbl: "May I be un-$it".toString(), act: requestRelease, arg: it ]);
+ };
+ opts.push([ lbl: "Back", act: null ]);
+ def opt = getSelectedValue("Yes, toy?", opts.collect { it.lbl });
+ def act = opts[opt].act;
+ if (act)
+ act(opts[opt].arg);
+ else
+ return "toy";
+ }
+ addAvail(clickTime);
}
execEvents(true);
- addAvail(cycleTime);
}