[Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Webteases are great, but what if you're in the mood for a slightly more immersive experience? Chat about Tease AI and other offline tease software.

Moderator: 1885

GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by GodDragon »

markus wrote: Mon Sep 20, 2021 9:40 pm Sorry, I didn't played for a while, not sure where that happened.
Thanks for the files!
Didn't you play due to bugs/anything missing?
User avatar
markus
Explorer At Heart
Explorer At Heart
Posts: 863
Joined: Tue Nov 18, 2008 11:09 pm

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by markus »

GodDragon wrote: Tue Sep 21, 2021 2:50 pm Didn't you play due to bugs/anything missing?
Mostly because I'm too busy writing my own Tai-Software. (Sorry, but I coudn't resist to mention it :innocent: :lol: :whistle: ) )

Serious now:
Well, one reason was the bug which stopped the session (I had send you the logs, should be solved now I guess).
But to be honest, it started to become too much repetitive for my taste.
There were always very good parts in every session (everything which was new), but those modules which came often, like the positions i.e.,... they would need more variations.

Also those modules should maybe count how often you explain the rules of a game, ... I might be horny while playing, but my brain is not that much of a mess that I need to get explained what an arrow and it's color means over and over again when I play it on a regular basis. ;-)
Let's say explain it 3 times, with 3 different text, and after that it should be enough and jump right into the action. ... Or maybe a one-liner asking 'Do you need a little reminder of how this works?' could do it as well.

Please don't get me wrong here, it's still an amazing project, and I understand that it is an alpha version, but I think it would need more finetuning and more content,... while I'm at the content, ... maybe I would have to play more often to unlock some of that, I guess so,... but (just another guess) it seems it's designed like 'The more toys you have, the more content you have'.... that's fair enough as it is a design decision, but leaves those users without many toys behind a little bit (again, it's Ok that way, no criticism, it's better to have a personality which is designed for many toys and be good in those parts than having a personality which tries to be everybodys darling and failing in overall.)

So, I think I will wait for another major/big update on Spicy before I'll try it again, sorry.

Best greetings,
Markus
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by GodDragon »

markus wrote: Tue Sep 21, 2021 7:23 pm
GodDragon wrote: Tue Sep 21, 2021 2:50 pm Didn't you play due to bugs/anything missing?
Mostly because I'm too busy writing my own Tai-Software. (Sorry, but I coudn't resist to mention it :innocent: :lol: :whistle: ) )

Serious now:
Well, one reason was the bug which stopped the session (I had send you the logs, should be solved now I guess).
But to be honest, it started to become too much repetitive for my taste.
There were always very good parts in every session (everything which was new), but those modules which came often, like the positions i.e.,... they would need more variations.

Also those modules should maybe count how often you explain the rules of a game, ... I might be horny while playing, but my brain is not that much of a mess that I need to get explained what an arrow and it's color means over and over again when I play it on a regular basis. ;-)
Let's say explain it 3 times, with 3 different text, and after that it should be enough and jump right into the action. ... Or maybe a one-liner asking 'Do you need a little reminder of how this works?' could do it as well.

Please don't get me wrong here, it's still an amazing project, and I understand that it is an alpha version, but I think it would need more finetuning and more content,... while I'm at the content, ... maybe I would have to play more often to unlock some of that, I guess so,... but (just another guess) it seems it's designed like 'The more toys you have, the more content you have'.... that's fair enough as it is a design decision, but leaves those users without many toys behind a little bit (again, it's Ok that way, no criticism, it's better to have a personality which is designed for many toys and be good in those parts than having a personality which tries to be everybodys darling and failing in overall.)

So, I think I will wait for another major/big update on Spicy before I'll try it again, sorry.

Best greetings,
Markus
Hey, thanks for the feedback. That helps a lot. Do you mind telling me which toys you own?
As you've guessed Spicy gets better and better the more toys you own. It's a less solely stroking and edging focused personality. Actually the positions only come up every like third session for me, because if you aren't limited by the toys and hard limits there are a lot of things that can happen.
But I can see how depending on your collection of toys it can get quite repetitive. I will see what I can do about that in future updates. :yes:
User avatar
markus
Explorer At Heart
Explorer At Heart
Posts: 863
Joined: Tue Nov 18, 2008 11:09 pm

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by markus »

GodDragon wrote: Tue Sep 21, 2021 9:25 pm Do you mind telling me which toys you own?
I've played the intro twice, in the first run I had only clothespins, icyhot and riding crop (does it ask for shoelace, if so, then I said yes to that, too.)
In the second run I've thought of what could be simulated, had these:
- clothespins
- nippleclamps
- cloverclamps
- parachute
- icyhot
- riding crop
- ball stretcher
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by GodDragon »

markus wrote: Wed Sep 22, 2021 6:39 pm
GodDragon wrote: Tue Sep 21, 2021 9:25 pm Do you mind telling me which toys you own?
I've played the intro twice, in the first run I had only clothespins, icyhot and riding crop (does it ask for shoelace, if so, then I said yes to that, too.)
In the second run I've thought of what could be simulated, had these:
- clothespins
- nippleclamps
- cloverclamps
- parachute
- icyhot
- riding crop
- ball stretcher
I see why you are having issues. Not having like a collar, dildo, buttplug, chastity device, magic wand etc. will limit her modules by a lot :-O I mean other personalities are more focused on plain stroking, edging and stuff like that. I have quite a few of these modules as well, but I didn't want to make Spicy as plain and more targeted at people that were like getting bored by other personalities and their limited repertoire and ability to deal with most toys.
mondany
Explorer
Explorer
Posts: 35
Joined: Sat Aug 12, 2017 8:58 pm

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by mondany »

i believe this is an error in AnalDepth.js

Code: Select all

else if (dildo.diameter < getVar(VARIABLE.MAX_ANAL_LENGTH))
Should be checking length vs max length, not diameter
GodDragon
Explorer At Heart
Explorer At Heart
Posts: 795
Joined: Sun Jun 11, 2017 4:30 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by GodDragon »

mondany wrote: Mon Sep 27, 2021 7:36 am i believe this is an error in AnalDepth.js

Code: Select all

else if (dildo.diameter < getVar(VARIABLE.MAX_ANAL_LENGTH))
Should be checking length vs max length, not diameter
You are right :-D
User avatar
subcuir
Explorer
Explorer
Posts: 6
Joined: Wed Mar 27, 2019 9:39 pm
Gender: Male
Sexual Orientation: Straight
I am a: Slave

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by subcuir »

Hello,

I get this error:
Trying to run module AssWorship from category 6 and was in previous module is false
Exception in thread "Thread-29" java.lang.NullPointerException
at me.goddragon.teaseai.api.picture.PictureSet.getRandomPictureForTagStates(PictureSet.java:88)
at me.goddragon.teaseai.api.picture.PictureSet.getRandomPictureForTagStates(PictureSet.java:54)

How can this be solved?

Thank You,

Subcuir
Ingvald_Alex
Explorer
Explorer
Posts: 70
Joined: Mon Mar 22, 2021 8:02 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by Ingvald_Alex »

subcuir wrote: Thu Sep 30, 2021 8:26 pm Hello,

I get this error:
Trying to run module AssWorship from category 6 and was in previous module is false
Exception in thread "Thread-29" java.lang.NullPointerException
at me.goddragon.teaseai.api.picture.PictureSet.getRandomPictureForTagStates(PictureSet.java:88)
at me.goddragon.teaseai.api.picture.PictureSet.getRandomPictureForTagStates(PictureSet.java:54)

How can this be solved?

Thank You,

Subcuir
Hello! You don't have images tagged like this:

***.jpg TagAss
***.jpg TagAss
***.jpg TagAss

You can also add TagAss to another images like this:
***.jpg TagFullyDressed TagAss
***.jpg TagFullyDressed TagAss
***.jpg TagFullyDressed TagAss
TheBoiiiWhoLived
Explorer
Explorer
Posts: 17
Joined: Tue Apr 13, 2021 9:34 am

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by TheBoiiiWhoLived »

Hey,
first of all: Great work!

I am currently trying to extend some of the modules regarding aspects that i really like (maybe some of them are against the basic idea but well :) )

In case somebody is interested or has some adaptions/modifications/improvements, feel free!

I will just post them here as spoiler.

Extended Feet module (3 play styles, fast, game, default), also copied it to NoChastity folder.
Spoiler: show
{
if (!FEET_LIMIT.isAllowed() || isInChastity() && !hasMagicWand()) {
runModuleCategory(CATEGORY_TEASE);
} else if (tryRunModuleFetchId(getDefaultModulesSinceRun(), MODULE.EDGING)) {
if(getVar(VARIABLE.FEET_WORSHIPS_DONE, 0) === 0) {
sendMessage('I feel like trying something new %Grin%');
sendMessage('I already know you are a feet kind of guy');
sendMessage('Getting off on worshipping a woman\'s beautiful feet');

if(VERBAL_HUMILIATION_LIMIT.isAllowed()) {
sendMessage('I mean it\'s probably the only thing you get to see anyway %Lol%');
}

sendMessage('And who would judge, right?');
sendMessage('Feet can be quite nice');
sendMessage('Don\'t let society fool you');
sendMessage('There is nothing wrong with feet %Wicked%');

sendMessage('And since there a lot of feet out there that require some worshipping, cleaning and massages');
sendMessage('I think we should put your submissive energy towards dealing with some of that');
sendMessage('You sadly can\'t really massage or clean the feet in front of you');
sendMessage('But you can at least learn to worship and value them properly %EmoteHappy%');
sendMessage('If I was there with you you\'d be on your knees kissing my feet a lot %Moan%');
sendMessage('Making them feel real good after a long stressful day at work');
sendMessage('So better prepare you for the future that lies ahead');

if(VERBAL_HUMILIATION_LIMIT.isAllowed()) {
sendMessage('Other women would probably have you do the same %Wicked%');
sendMessage('Because what else are you useful for? %Lol%');
}

sendMessage('So what I need you to do is create folder containing images of feet. Optionally you can use the tag tool to tag them as well');
sendMessage('Like image tags as face, ass etc.');
sendMessage('But it\'s not a must');
sendMessage('I just need you to create and fill a folder with a few files of feet');
sendMessage('Get them or reddit or similar');
sendMessage('Or maybe you already have one you naughty %SlaveName% %Grin%');

sendMessage('I\'ll wait till you have found at least 5 pictures');
sendMessage('Make sure to pick your favourites %Grin%');
sendMessage('And then tell me once you are done');

waitForDone(100000);

sendMessage('Great!');
sendMessage('Now go ahead and select the folder you want to use');


while(true) {
delVar(VARIABLE.FEET_WORSHIP_FOLDER);

const RunnableClass = Java.type('java.lang.Runnable');
let CustomRunnable = Java.extend(RunnableClass, {
run: function () {
let directory = getFolderFromSelector('Feet Image Folder');
setVar(VARIABLE.FEET_WORSHIP_FOLDER, directory.getAbsolutePath());
}
});
runGui(new CustomRunnable());

while(!isVar(VARIABLE.FEET_WORSHIP_FOLDER)) {
sleep(100, "MILLISECONDS");
}

let directory = new java.io.File(getVar(VARIABLE.FEET_WORSHIP_FOLDER));

if(sendYesOrNoQuestion('Are you sure the folder ' + directory.getPath() + ' is correct?')) {
break;
} else {
sendMessage('Then pick again %EmoteHappy%');
}
}

sendMessage('Now that\'s done...');
sendMessage('Let\'s not waste anymore time %Grin%');
} else {
sendMessage('I feel like we should have you look at some more feet');
sendMessage('And make you worship them real good %Grin%');

sendMessage('Let\'s start with adding 5 new images to the folder');
sendMessage('Go ahead, find some, place them in the folder and tell me once you are done');
waitForDone(100000);
}

let files = PictureHandler.handler.getTaggedPicturesExact(new java.io.File(getVar(VARIABLE.FEET_WORSHIP_FOLDER)));

incrementVar(VARIABLE.FEET_WORSHIPS_DONE, 1);

if(isInChastity()) {
readyForVibratingCage();
}

let edgesToDoTotal = Math.max(25, getMood() + getStrictnessForCharacter()*14);

CURRENT_EDGE_MODE = EDGE_MODE.SKIP_TAUNTS;
//Min 13, max is 24 with worst mood and strictness 2
let caseSwitch = Math.floor(Math.random() * (100 - 0) + 0);

if (caseSwitch > 50)
{
// Endurance
edgesToDoTotal = Math.floor(Math.random() * (50 - 20) + 20)

sendMessage("Lets play a feet endurance game!");

while(edgesToDoTotal > 0) {
lockImages();
let resultingFile = random(files).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'),0);

let edgesToDo = 1;

//Decrease the total before we decrease the edgesToDo down to 0
edgesToDoTotal -= edgesToDo;


while(edgesToDo > 0) {
sleep(1);
startEdging();
edgesToDo--;
}

if(isChance(25 + MOOD.TEASE.getChanceBooster())) {
sendMessage('I think we should do one last edge %Grin%');
sendMessage('And I think you should hold that edge');
sendMessage('To show me how much you worship these feet');
startEdging(getEdgeHoldSeconds());
edgesToDoTotal -= 1;
}

sendMessage('%LetEdgeFade%');
sleep(randomInteger(2, 5));
sendMessage('%Now% %Grin%');
}
}
else if (caseSwitch >0)
{
edgesToDoTotal = Math.floor(Math.random() * (30 - 15) + 15)
sendMessage("Let the feet game begin!:)");

while(edgesToDoTotal > 0) {
lockImages();
let resultingFile = random(files).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'));

let edgesToDo = randomInteger(2, 5);;

//Decrease the total before we decrease the edgesToDo down to 0
edgesToDoTotal -= edgesToDo;

sendMessage(random('I think ' + edgesToDo + ' edges will be sufficient', 'I think they are worth ' + edgesToDo + ' edges', 'I think you should pay tribute with ' + edgesToDo + ' edges',
'They are at least worth ' + edgesToDo + ' edges', 'Let\'s do ' + edgesToDo + ' edges for them', 'Let\'s worship them with ' + edgesToDo + ' edges'));

while(edgesToDo > 0) {
sleep(randomInteger(3, 5));
startEdging();
edgesToDo--;
}

if(isChance(25 + MOOD.TEASE.getChanceBooster())) {
sendMessage('I think we should do one last edge %Grin%');
sendMessage('And I think you should hold that edge');
sendMessage('To show me how much you worship these feet');
startEdging(getEdgeHoldSeconds());
edgesToDoTotal -= 1;
}

sendMessage('%LetEdgeFade%');
sleep(randomInteger(4, 5));
sendMessage('%Now% %Grin%');
}
}
else
{
while(edgesToDoTotal > 0) {
lockImages();
let resultingFile = random(files).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'));

let edgesToDo = randomInteger(2, 5);

//Decrease the total before we decrease the edgesToDo down to 0
edgesToDoTotal -= edgesToDo;

sendMessage(random('I think ' + edgesToDo + ' edges will be sufficient', 'I think they are worth ' + edgesToDo + ' edges', 'I think you should pay tribute with ' + edgesToDo + ' edges',
'They are at least worth ' + edgesToDo + ' edges', 'Let\'s do ' + edgesToDo + ' edges for them', 'Let\'s worship them with ' + edgesToDo + ' edges'));

while(edgesToDo > 0) {
sleep(randomInteger(3, 8));
startEdging();
edgesToDo--;
}

if(isChance(25 + MOOD.TEASE.getChanceBooster())) {
sendMessage('I think we should do one last edge %Grin%');
sendMessage('And I think you should hold that edge');
sendMessage('To show me how much you worship these feet');
startEdging(getEdgeHoldSeconds());
edgesToDoTotal -= 1;
}

sendMessage('%LetEdgeFade%');
sleep(randomInteger(5, 20));
sendMessage('%Now% %Grin%');
}
}






unlockImages();

sendMessage('I think that\'s enough for now %Grin%');

sendMessage('I don\'t want to break %MyCock% poor %Cock%');

if(isChance(25)) {
sendMessage('Neither do I want to break your mind');
sendMessage('Even though it sounds like fun %Wicked%');
}

if(isChance(25)) {
sendMessage('I hope you enjoyed worshipping these feet');
sendMessage('Because it\'s definitely not the last time you are gonna do that for me %EmoteHappy%');
}

CURRENT_EDGE_MODE = EDGE_MODE.NORMAL;
}
}
Surprise Countdown End in AllOrgasms (and referenced it in allowed, denied, ruined)
Spoiler: show
{
let orgasmType = getVar(VARIABLE.ORGASM_CATEGORY_TODAY);
let countdownCount = randomInteger(3, 8);
let feetfiles = PictureHandler.handler.getTaggedPicturesExact(new java.io.File(getVar(VARIABLE.FEET_WORSHIP_FOLDER)));

sendMessage("Lets play a nice little game to end this session %GeneralTime%, %SlaveName%");
sendMessage(random("I'm going to count you down", "Let me count you down", "I'll do a countdown"));
sendMessage(random("Get ready to cum when I get to zero", "I want you to spill your load when I get to zero", "You should shoot out that disgusting cum when I get to zero"));

sendMessage("Start stroking");

readyForStroking();
startStroking(randomInteger(80, 150));


sendMessage("Are you excited already, %SlaveName%? %Grin%");
sendMessage(random("Here we go", "Let\'s do this", "Let\'s get started %Grin%", "Here it comes %Grin%"));

let countdownId = 0;
lockImages();
showTeaseImage(3);
sendMessage("Lets go Bitch! %Lol$",0);
let reallyCum=0;
let reallyCumAsked=0;

while(countdownCount>0)
{
let feetChance=isChance(20);
if (feetChance)
{
sendMessage(random("Feet time! %Lol%","Time for some feet action %SlaveName% %Lol%"));
}
let countNumber = randomInteger(4,8);
let countCurrent = 10;
while (countNumber>0)
{
if (feetChance)
{
let resultingFile = random(feetfiles).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'),1);
}
else
{
showTeaseImage();
if (isChance(5))
{
sendMessage(random("%Lol%", "%Hot%", "%Moan%"));
}
}
sendMessage(countCurrent.toString(), randomInteger(1,3));
let chance = isChance(10);
if (chance)
{
sleep(randomInteger(3,5));
}

countNumber--;
countCurrent--;

let tauntChance = isChance(10);
if (tauntChance)
{
sendMessage(random("All that matters right now is building up an incredible orgasm","All that " + random("sperm ", "cum ", "jizz ") + "in %MyYour% %Balls% is just screaming to get out %Giggles%","It's going to feel " + random("so fucking good ", "so damn good ", "incredible ") + "when you " + random("finally climax", "explode", "blow that hot load")));
}

}
countdownCount--;

if (countdownCount===0)
{
while(countCurrent>0)
{
if (orgasmType === ORGASM_CATEGORY_DENIED) {
sendMessage("Stop stroking", 0);
sendMessage("I changed my mind %Lol%");
sendMessage("Sorry, %SlaveName% %Lol%");
}
showTeaseImage();
sendMessage(countCurrent.toString(), randomInteger(1,4));
let chance = isChance(10);
if (chance)
{
sleep(randomInteger(3,5));
}
countCurrent--;
if (countCurrent === 0)
{
if (orgasmType === ORGASM_CATEGORY_DENIED) {
sendMessage("Stop stroking", 0);
sendMessage("I changed my mind %Lol%");
sendMessage("Sorry, %SlaveName% %Lol%");
} else if (orgasmType === ORGASM_CATEGORY_RUINED) {
sendMessage("0", 0);

startEdging(0, true, EDGE_END_RUIN);
waitForCumAnswer();

if (shouldCEI()) {
sendEatInstructions();
}

sendMessage("I hope that ruined orgasm hurt... a lot %Grin%");
} else if (orgasmType === ORGASM_CATEGORY_ALLOWED) {
sendMessage('ZERO!', 0);
startEdging(0, true, EDGE_END_ORGASM);
waitForCumAnswer();

if (shouldCEI()) {
sendEatInstructions();
}

sendMessage('That was intense %Grin%');
}
}
}

}
else
{

let edgechance = isChance(50);

if (edgechance)
{
sendMessage(random("Well, I enjoy this way too much. Get to the edge first, right now. I wanna do it again %SlaveName%", "Wow this is fun. I completely forgot where I stopped. Lets edge and start again %SlaveName%", "Phew, this is intense. Maybe you should load up some more first, %SlaveName%"));
startEdging();
sendMessage('%LetEdgeFade%');
sendMessage('I know you ' + random('enjoy this', 'love edging for me', 'want nothing more than to edge for me') + ', %SlaveName%');
let edgechance2 = isChance(30);
if (edgechance2)
{
sendMessage(random("Haha, lets do it one more time, %SlaveName% %Lol%","You are doing great %SlaveName%! Show me your skills again please %Grin%"));
startEdging();
sendMessage('%LetEdgeFade%');
}
}
else
{
sendMessage(random("Well, I enjoy this way too much. I wanna do it again %SlaveName% %Grin%", "Wow this is fun. I completely forgot where I stopped. Lets start again %SlaveName% %Lol%", "Phew, this is intense. Maybe you should load up some more first, %SlaveName%"));
sendMessage("Feel how hard and sensitive %MyYour% %Cock% is");
stopStroking();
unlockImages();
}
unlockImages();
sendMessage("Time to calm down for a little, %SlaveName% %Grin%");
stopStroking();
sendMessage("This isn't going as you hoped, is it? %Lol%");

sleep(randomInteger(10,20));
startStroking(randomInteger(80, 150));
lockImages();
showTeaseImage();
sleep(randomInteger(10,15));
}
}
unlockImages();

}
iiilllililiill
Explorer
Explorer
Posts: 24
Joined: Thu Mar 12, 2020 8:35 pm

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by iiilllililiill »

Hello Mr.GodDragon, is there a way to remove a folder from the image path of a genre?

Also, is there a way to get Spicy to give me more pain tasks, particularly spanking?

Thank you for your work

P.S. How do I get a membership to spankzchoir? I know I'm meant to buy an account in the shop, but I don't have the option to. Do I have to wait until Spicy brings it up and that will give me access?
Spielers
Explorer At Heart
Explorer At Heart
Posts: 309
Joined: Mon Jan 09, 2017 8:26 pm
Gender: Male
Sexual Orientation: Straight
I am a: Submissive

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by Spielers »

the program hang on by
Spoiler: show
05:08:33 pm INFO: Send stroking taunt
05:08:47 pm CHAT: 05:08 pm Princess: You should stop now
05:08:47 pm INFO: End of stroking interval
05:08:47 pm INFO: Chance for special session: 40
05:08:47 pm INFO: Calculating mood for 983 and strictness 0
05:08:47 pm INFO: Calculating mood for 983 and strictness 0
05:08:47 pm INFO: Calculating mood for 983 and strictness 0
05:08:47 pm INFO: Calculating mood for 983 and strictness 0
05:08:47 pm INFO: Anger high, reducing tease chance
05:08:47 pm INFO: Choosing module based on the following chances:
05:08:47 pm INFO: Tease: 55
05:08:47 pm INFO: Sissy: 0
05:08:47 pm INFO: Pain: 50
05:08:47 pm INFO: Slave: 50
05:08:47 pm INFO: Humiliation: 50
05:08:47 pm INFO: Selector is 127
05:08:47 pm INFO: Pushed 2 to result 2
05:08:47 pm INFO: Trying to run module \Session\Modules\Slave\Neutral\PositionTraining.js
05:08:48 pm INFO: Trying to run module PositionTraining from category 4 and was in previous module is false
05:08:48 pm INFO: Trying to run module \Session\Modules\Slave\Neutral\LickTraining.js
05:08:48 pm INFO: Trying to run module LickTraining from category 4 and was in previous module is false
05:08:48 pm INFO: Unable to find module for category Slave to run
05:08:48 pm INFO: Stuck in module Slave loop . Trying tease now
05:08:48 pm INFO: Pushed 3 to result 3
05:08:48 pm INFO: Pushed 7 to result 10
05:08:48 pm INFO: Pushed 1 to result 11
05:08:48 pm INFO: Trying to run module \Session\Modules\Tease\NoChastity\AssWorship.js
05:08:48 pm INFO: Trying to run module AssWorship from category 6 and was in previous module is false
Exception in thread "Thread-7" java.lang.NullPointerException
at me.goddragon.teaseai.api.picture.PictureSet.getRandomPictureForTagStates(PictureSet.java:88)
at me.goddragon.teaseai.api.picture.PictureSet.getRandomPictureForTagStates(PictureSet.java:54)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$406$871AA$\^eval\_.showDommeTaggedImageForPictureTag(<eval>:33)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$402$\^eval\_.:scopeCall(<eval>)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$402$\^eval\_.:program(<eval>:10)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:171)
at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$391$2711A$\^eval\_.runModuleCategory(<eval>:72)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$400$3095AAAA$\^eval\_.tryRunModule(<eval>:105)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$399$2850AA$\^eval\_.tryRunModuleFetchId(<eval>:80)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$401$\^eval\_.:program(<eval>:4)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:171)
at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$391$2711A$\^eval\_.runModuleCategory(<eval>:72)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$400$3095AAAA$\^eval\_.tryRunModule(<eval>:105)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$399$2850AA$\^eval\_.tryRunModuleFetchId(<eval>:80)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$397$\^eval\_.:program(<eval>:6)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:171)
at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$391$2711A$\^eval\_.runModuleCategory(<eval>:72)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$316$\^eval\_.:scopeCall-12(<eval>)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$316$\^eval\_.:program(<eval>:225)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:171)
at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$284$\^eval\_.:program(<eval>:91)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:171)
at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$Recompilation$276$5149$\^eval\_.startSession(<eval>:131)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$268$\^eval\_.:program(<eval>:38)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.evalScript(ScriptHandler.java:171)
at me.goddragon.teaseai.api.scripts.nashorn.RunFunction.call(RunFunction.java:30)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.linker.JSObjectLinker.jsObjectScopeCall(JSObjectLinker.java:254)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$50$\^eval\_.:scopeCall(<eval>)
at jdk.scripting.nashorn.scripts/jdk.nashorn.internal.scripts.Script$50$\^eval\_.:program(<eval>:147)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:655)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:513)
at jdk.scripting.nashorn/jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:527)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:456)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:413)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:409)
at jdk.scripting.nashorn/jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:157)
at java.scripting/javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:249)
at me.goddragon.teaseai.api.scripts.ScriptHandler.runScript(ScriptHandler.java:190)
at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:144)
at me.goddragon.teaseai.api.scripts.ScriptHandler.startPersonality(ScriptHandler.java:126)
at me.goddragon.teaseai.api.session.Session$1.run(Session.java:41)
it looks like the programm is lokking for images with the tag eval. Butt it is not possible to set this tag in the settings under media tagging.
TheBoiiiWhoLived
Explorer
Explorer
Posts: 17
Joined: Tue Apr 13, 2021 9:34 am

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by TheBoiiiWhoLived »

TheBoiiiWhoLived wrote: Mon Oct 04, 2021 11:01 am Hey,
first of all: Great work!

I am currently trying to extend some of the modules regarding aspects that i really like (maybe some of them are against the basic idea but well :) )

In case somebody is interested or has some adaptions/modifications/improvements, feel free!

I will just post them here as spoiler.

Extended Feet module (3 play styles, fast, game, default), also copied it to NoChastity folder.
Spoiler: show
{
if (!FEET_LIMIT.isAllowed() || isInChastity() && !hasMagicWand()) {
runModuleCategory(CATEGORY_TEASE);
} else if (tryRunModuleFetchId(getDefaultModulesSinceRun(), MODULE.EDGING)) {
if(getVar(VARIABLE.FEET_WORSHIPS_DONE, 0) === 0) {
sendMessage('I feel like trying something new %Grin%');
sendMessage('I already know you are a feet kind of guy');
sendMessage('Getting off on worshipping a woman\'s beautiful feet');

if(VERBAL_HUMILIATION_LIMIT.isAllowed()) {
sendMessage('I mean it\'s probably the only thing you get to see anyway %Lol%');
}

sendMessage('And who would judge, right?');
sendMessage('Feet can be quite nice');
sendMessage('Don\'t let society fool you');
sendMessage('There is nothing wrong with feet %Wicked%');

sendMessage('And since there a lot of feet out there that require some worshipping, cleaning and massages');
sendMessage('I think we should put your submissive energy towards dealing with some of that');
sendMessage('You sadly can\'t really massage or clean the feet in front of you');
sendMessage('But you can at least learn to worship and value them properly %EmoteHappy%');
sendMessage('If I was there with you you\'d be on your knees kissing my feet a lot %Moan%');
sendMessage('Making them feel real good after a long stressful day at work');
sendMessage('So better prepare you for the future that lies ahead');

if(VERBAL_HUMILIATION_LIMIT.isAllowed()) {
sendMessage('Other women would probably have you do the same %Wicked%');
sendMessage('Because what else are you useful for? %Lol%');
}

sendMessage('So what I need you to do is create folder containing images of feet. Optionally you can use the tag tool to tag them as well');
sendMessage('Like image tags as face, ass etc.');
sendMessage('But it\'s not a must');
sendMessage('I just need you to create and fill a folder with a few files of feet');
sendMessage('Get them or reddit or similar');
sendMessage('Or maybe you already have one you naughty %SlaveName% %Grin%');

sendMessage('I\'ll wait till you have found at least 5 pictures');
sendMessage('Make sure to pick your favourites %Grin%');
sendMessage('And then tell me once you are done');

waitForDone(100000);

sendMessage('Great!');
sendMessage('Now go ahead and select the folder you want to use');


while(true) {
delVar(VARIABLE.FEET_WORSHIP_FOLDER);

const RunnableClass = Java.type('java.lang.Runnable');
let CustomRunnable = Java.extend(RunnableClass, {
run: function () {
let directory = getFolderFromSelector('Feet Image Folder');
setVar(VARIABLE.FEET_WORSHIP_FOLDER, directory.getAbsolutePath());
}
});
runGui(new CustomRunnable());

while(!isVar(VARIABLE.FEET_WORSHIP_FOLDER)) {
sleep(100, "MILLISECONDS");
}

let directory = new java.io.File(getVar(VARIABLE.FEET_WORSHIP_FOLDER));

if(sendYesOrNoQuestion('Are you sure the folder ' + directory.getPath() + ' is correct?')) {
break;
} else {
sendMessage('Then pick again %EmoteHappy%');
}
}

sendMessage('Now that\'s done...');
sendMessage('Let\'s not waste anymore time %Grin%');
} else {
sendMessage('I feel like we should have you look at some more feet');
sendMessage('And make you worship them real good %Grin%');

sendMessage('Let\'s start with adding 5 new images to the folder');
sendMessage('Go ahead, find some, place them in the folder and tell me once you are done');
waitForDone(100000);
}

let files = PictureHandler.handler.getTaggedPicturesExact(new java.io.File(getVar(VARIABLE.FEET_WORSHIP_FOLDER)));

incrementVar(VARIABLE.FEET_WORSHIPS_DONE, 1);

if(isInChastity()) {
readyForVibratingCage();
}

let edgesToDoTotal = Math.max(25, getMood() + getStrictnessForCharacter()*14);

CURRENT_EDGE_MODE = EDGE_MODE.SKIP_TAUNTS;
//Min 13, max is 24 with worst mood and strictness 2
let caseSwitch = Math.floor(Math.random() * (100 - 0) + 0);

if (caseSwitch > 50)
{
// Endurance
edgesToDoTotal = Math.floor(Math.random() * (50 - 20) + 20)

sendMessage("Lets play a feet endurance game!");

while(edgesToDoTotal > 0) {
lockImages();
let resultingFile = random(files).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'),0);

let edgesToDo = 1;

//Decrease the total before we decrease the edgesToDo down to 0
edgesToDoTotal -= edgesToDo;


while(edgesToDo > 0) {
sleep(1);
startEdging();
edgesToDo--;
}

if(isChance(25 + MOOD.TEASE.getChanceBooster())) {
sendMessage('I think we should do one last edge %Grin%');
sendMessage('And I think you should hold that edge');
sendMessage('To show me how much you worship these feet');
startEdging(getEdgeHoldSeconds());
edgesToDoTotal -= 1;
}

sendMessage('%LetEdgeFade%');
sleep(randomInteger(2, 5));
sendMessage('%Now% %Grin%');
}
}
else if (caseSwitch >0)
{
edgesToDoTotal = Math.floor(Math.random() * (30 - 15) + 15)
sendMessage("Let the feet game begin!:)");

while(edgesToDoTotal > 0) {
lockImages();
let resultingFile = random(files).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'));

let edgesToDo = randomInteger(2, 5);;

//Decrease the total before we decrease the edgesToDo down to 0
edgesToDoTotal -= edgesToDo;

sendMessage(random('I think ' + edgesToDo + ' edges will be sufficient', 'I think they are worth ' + edgesToDo + ' edges', 'I think you should pay tribute with ' + edgesToDo + ' edges',
'They are at least worth ' + edgesToDo + ' edges', 'Let\'s do ' + edgesToDo + ' edges for them', 'Let\'s worship them with ' + edgesToDo + ' edges'));

while(edgesToDo > 0) {
sleep(randomInteger(3, 5));
startEdging();
edgesToDo--;
}

if(isChance(25 + MOOD.TEASE.getChanceBooster())) {
sendMessage('I think we should do one last edge %Grin%');
sendMessage('And I think you should hold that edge');
sendMessage('To show me how much you worship these feet');
startEdging(getEdgeHoldSeconds());
edgesToDoTotal -= 1;
}

sendMessage('%LetEdgeFade%');
sleep(randomInteger(4, 5));
sendMessage('%Now% %Grin%');
}
}
else
{
while(edgesToDoTotal > 0) {
lockImages();
let resultingFile = random(files).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'));

let edgesToDo = randomInteger(2, 5);

//Decrease the total before we decrease the edgesToDo down to 0
edgesToDoTotal -= edgesToDo;

sendMessage(random('I think ' + edgesToDo + ' edges will be sufficient', 'I think they are worth ' + edgesToDo + ' edges', 'I think you should pay tribute with ' + edgesToDo + ' edges',
'They are at least worth ' + edgesToDo + ' edges', 'Let\'s do ' + edgesToDo + ' edges for them', 'Let\'s worship them with ' + edgesToDo + ' edges'));

while(edgesToDo > 0) {
sleep(randomInteger(3, 8));
startEdging();
edgesToDo--;
}

if(isChance(25 + MOOD.TEASE.getChanceBooster())) {
sendMessage('I think we should do one last edge %Grin%');
sendMessage('And I think you should hold that edge');
sendMessage('To show me how much you worship these feet');
startEdging(getEdgeHoldSeconds());
edgesToDoTotal -= 1;
}

sendMessage('%LetEdgeFade%');
sleep(randomInteger(5, 20));
sendMessage('%Now% %Grin%');
}
}






unlockImages();

sendMessage('I think that\'s enough for now %Grin%');

sendMessage('I don\'t want to break %MyCock% poor %Cock%');

if(isChance(25)) {
sendMessage('Neither do I want to break your mind');
sendMessage('Even though it sounds like fun %Wicked%');
}

if(isChance(25)) {
sendMessage('I hope you enjoyed worshipping these feet');
sendMessage('Because it\'s definitely not the last time you are gonna do that for me %EmoteHappy%');
}

CURRENT_EDGE_MODE = EDGE_MODE.NORMAL;
}
}
Surprise Countdown End in AllOrgasms (and referenced it in allowed, denied, ruined)
Spoiler: show
{
let orgasmType = getVar(VARIABLE.ORGASM_CATEGORY_TODAY);
let countdownCount = randomInteger(3, 8);
let feetfiles = PictureHandler.handler.getTaggedPicturesExact(new java.io.File(getVar(VARIABLE.FEET_WORSHIP_FOLDER)));

sendMessage("Lets play a nice little game to end this session %GeneralTime%, %SlaveName%");
sendMessage(random("I'm going to count you down", "Let me count you down", "I'll do a countdown"));
sendMessage(random("Get ready to cum when I get to zero", "I want you to spill your load when I get to zero", "You should shoot out that disgusting cum when I get to zero"));

sendMessage("Start stroking");

readyForStroking();
startStroking(randomInteger(80, 150));


sendMessage("Are you excited already, %SlaveName%? %Grin%");
sendMessage(random("Here we go", "Let\'s do this", "Let\'s get started %Grin%", "Here it comes %Grin%"));

let countdownId = 0;
lockImages();
showTeaseImage(3);
sendMessage("Lets go Bitch! %Lol$",0);
let reallyCum=0;
let reallyCumAsked=0;

while(countdownCount>0)
{
let feetChance=isChance(20);
if (feetChance)
{
sendMessage(random("Feet time! %Lol%","Time for some feet action %SlaveName% %Lol%"));
}
let countNumber = randomInteger(4,8);
let countCurrent = 10;
while (countNumber>0)
{
if (feetChance)
{
let resultingFile = random(feetfiles).getFile();
showImage(resultingFile);

sendMessage(random('Look at those beautiful feet', 'Stare a these beautiful feet', 'Let\'s worship these feet for now', 'Doesn\'t she have beautiful feet?',
'Let\'s dedicate some edges to these feet', 'Let\'s worship these feet properly', 'Let\'s focus on these nice feet for now', 'Let\'s make you suffer for these feet',
'Let\'s make you pay your tribute for these feet'),1);
}
else
{
showTeaseImage();
if (isChance(5))
{
sendMessage(random("%Lol%", "%Hot%", "%Moan%"));
}
}
sendMessage(countCurrent.toString(), randomInteger(1,3));
let chance = isChance(10);
if (chance)
{
sleep(randomInteger(3,5));
}

countNumber--;
countCurrent--;

let tauntChance = isChance(10);
if (tauntChance)
{
sendMessage(random("All that matters right now is building up an incredible orgasm","All that " + random("sperm ", "cum ", "jizz ") + "in %MyYour% %Balls% is just screaming to get out %Giggles%","It's going to feel " + random("so fucking good ", "so damn good ", "incredible ") + "when you " + random("finally climax", "explode", "blow that hot load")));
}

}
countdownCount--;

if (countdownCount===0)
{
while(countCurrent>0)
{
if (orgasmType === ORGASM_CATEGORY_DENIED) {
sendMessage("Stop stroking", 0);
sendMessage("I changed my mind %Lol%");
sendMessage("Sorry, %SlaveName% %Lol%");
}
showTeaseImage();
sendMessage(countCurrent.toString(), randomInteger(1,4));
let chance = isChance(10);
if (chance)
{
sleep(randomInteger(3,5));
}
countCurrent--;
if (countCurrent === 0)
{
if (orgasmType === ORGASM_CATEGORY_DENIED) {
sendMessage("Stop stroking", 0);
sendMessage("I changed my mind %Lol%");
sendMessage("Sorry, %SlaveName% %Lol%");
} else if (orgasmType === ORGASM_CATEGORY_RUINED) {
sendMessage("0", 0);

startEdging(0, true, EDGE_END_RUIN);
waitForCumAnswer();

if (shouldCEI()) {
sendEatInstructions();
}

sendMessage("I hope that ruined orgasm hurt... a lot %Grin%");
} else if (orgasmType === ORGASM_CATEGORY_ALLOWED) {
sendMessage('ZERO!', 0);
startEdging(0, true, EDGE_END_ORGASM);
waitForCumAnswer();

if (shouldCEI()) {
sendEatInstructions();
}

sendMessage('That was intense %Grin%');
}
}
}

}
else
{

let edgechance = isChance(50);

if (edgechance)
{
sendMessage(random("Well, I enjoy this way too much. Get to the edge first, right now. I wanna do it again %SlaveName%", "Wow this is fun. I completely forgot where I stopped. Lets edge and start again %SlaveName%", "Phew, this is intense. Maybe you should load up some more first, %SlaveName%"));
startEdging();
sendMessage('%LetEdgeFade%');
sendMessage('I know you ' + random('enjoy this', 'love edging for me', 'want nothing more than to edge for me') + ', %SlaveName%');
let edgechance2 = isChance(30);
if (edgechance2)
{
sendMessage(random("Haha, lets do it one more time, %SlaveName% %Lol%","You are doing great %SlaveName%! Show me your skills again please %Grin%"));
startEdging();
sendMessage('%LetEdgeFade%');
}
}
else
{
sendMessage(random("Well, I enjoy this way too much. I wanna do it again %SlaveName% %Grin%", "Wow this is fun. I completely forgot where I stopped. Lets start again %SlaveName% %Lol%", "Phew, this is intense. Maybe you should load up some more first, %SlaveName%"));
sendMessage("Feel how hard and sensitive %MyYour% %Cock% is");
stopStroking();
unlockImages();
}
unlockImages();
sendMessage("Time to calm down for a little, %SlaveName% %Grin%");
stopStroking();
sendMessage("This isn't going as you hoped, is it? %Lol%");

sleep(randomInteger(10,20));
startStroking(randomInteger(80, 150));
lockImages();
showTeaseImage();
sleep(randomInteger(10,15));
}
}
unlockImages();

}
I updated both of my CountdownEnd and FeetWorship versions, in case someone is interested feel free to pm.

Moreover, I built a python script to automatically remove the "failed images" from the Downloaded Images folder, and consequently remove the error URL from the associated tumblr URL files and remove the entry in ImageTags. I usually run this while playing or to clean up before/after a session. In the end, I hope that my URL files only contain working images by removing the faulty entries step-by-step.

If someone is interested, feel free to ask.

Would be great to get the community going so that everyone could do an additional module to drive the variety up. Would love it. I am currently planning to extending the modules step-by-step myself too if I find some spare time.
lockedkeyless
Explorer
Explorer
Posts: 26
Joined: Wed Apr 03, 2019 5:06 pm

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by lockedkeyless »

Is there a way to get rid of or reduce the time between sessions. I finally got it working after many months of failing to figure out how to get ai java working. I would love to try it out. I have a variable schedule and would love to be able to make it accomodate a little.
Ingvald_Alex
Explorer
Explorer
Posts: 70
Joined: Mon Mar 22, 2021 8:02 pm
Gender: Male
Sexual Orientation: Straight
I am a: Switch

Re: [Tease AI Java] Spicy (Open Alpha | 16.12 | v0.1.5.1)

Post by Ingvald_Alex »

Hello!I'm doimg like this:
Settings --> Personality --> Uncheck "Only supported variables" --> Find "lastteasesession" and --> change Value on a date before.
Post Reply