{ toy -> final toys = [:]; toy.metaClass.addToy { String ssName, String toyState, String name, String removeReq, removeReqFunc = null, removeFunc = null, tags = [] -> if (!has(ssName)) { return; } toys[toyState] = [ name: name, remFunc: removeFunc ]; toy.addRequestable("un$toyState".toString(), removeReq, removeReqFunc ?: { toy.requestRelease(toyState) }, { toy.stateIs(toyState) }) }; toy.metaClass.removeToy { state, imageSpec -> if (!stateIs(state)) return; final customRem = toys[state].remFunc; if (customRem) { customRem(imageSpec); } else { final toyName = toys[state].name; present(imageSpec, [ ["OK,"], ["you may remove your $toyName.", "the $toyName can come off.", "take the $toyName off."]]); showButtonG("Thank you, ${dommeTitle()}", "ok"); pause(5); showButtonGT("Removed, ${dommeTitle()}", "removed", 20, 1); } set(state, false); removeEvent("$RELEASEFROM-$state"); }; toy.metaClass.releaseFrom { rt, arg, name -> if (!rt || !sessionSummon([DRESSED])) { addEvent(name, getTime() + 300, RELEASEFROM, arg); return; } removeToy(arg, [DRESSED]); showLounge(); }; toy.metaClass.requestRelease { toyState -> adjustPunish(5); present([DRESSED], [ ["Really?", "Disappointing."], ["You wish to be un-$toyState?"]]); if (getBoolean(null)) { adjustPunish(10); if (getRandom(100) > getPunish()) { present([DRESSED], [["No.", "You may not."], ["Not yet.", "Not until later."]]); } else { present([DRESSED], [["Hmm, very well.", "If you must."]]); set(toyState, false); removeEvent("$RELEASEFROM-$toyState"); } } else { present([DRESSED], [["Good boy."]]); } showButtonG("Thank you, ${dommeTitle()}", "ok"); showLounge(); }; toy.metaClass.anyToys { return toys.any { s, t -> stateIs(s) }; } toy.metaClass.backgroundRemoveAllToys { // Assume toy will release himself toys.findAll { s, t -> stateIs(s) }.each { removeEvent("$RELEASEFROM-$it"); set(it, false); }; } toy.metaClass.removeAllToys { imageSpec, probKeep = 0 -> def toRemove = toys.keySet().findAll { s -> stateIs(s) }.toList(); Collections.shuffle(toRemove); toRemove.each { toyState -> if (getRandom(100) >= probKeep) { removeToy(toyState, [DRESSED]); } else { addEvent("$RELEASEFROM-$toyState", getTime() + 100 + getRandom(10 * (getPunish() + 1)), RELEASEFROM, toyState); adjustPunish(-5); } } } toy.addNamedEvent(toy.RELEASEFROM, { name, arg, schedTime, rt -> toy.releaseFrom(rt, arg, name) }); return null; }