Random Giver Prim - Second Life Wiki

Random Giver Prim

From Second Life Wiki

Second Life Wiki > LSL Portal > Library > Random Giver Prim
Jump to: navigation, search

This prim will randomly choose an item from inside its contents and present users with multiple randomized ways of getting that item. the item is never shown and is completely hidden from the users. guess right or match up and win.

//*THE ADVANCE MYSTERY PRIM IS A RANDOM GAME/GIVER SCRIPT WRITTEN BY DAMIAN DARKWYR.*//
 
 
 
//*NOTECARD STUFFS*//
string note = "_config";//the name of the notecard we will fetch our setting from.
key read;//we need this to read the notecard
integer line = 0;//which line of the notecard we are reading
 
 
dodata(string data)//function to read the data card
{
    list break = llParseString2List(data,["="],[]);//break the string on the line into a list so we can use it
    string a1a = llList2String(break,0);//eveything before the =
    string b2b = llList2String(break,1);//everything after the =
    if(a1a == "use_random_number")
    {
        use_random_number = (integer)b2b;
    }else if(a1a == "use_random_letter")
    {
        use_random_letter = (integer)b2b;
    }else if(a1a == "use_random_sequence")
    {
        use_random_sequence = (integer)b2b;
    }else if(a1a == "use_numerology")
    {
        use_numerology = (integer)b2b;
    }else if(a1a == "use_channel_output")
    {
        use_channel_output = (integer)b2b;
    }else if(a1a == "channel")
    {
        channel = (integer)b2b;
    }else if(a1a == "use_notify_owner")
    {
        use_notify_owner = (integer)b2b;
    }else if(a1a == "time_reset_minutes")
    {
        time_reset_minutes = (integer)b2b;
    }else if(a1a == "amount_per_guess")
    {
        amount_per_guess = (integer)b2b;
    }
}
//*NOTECARD STUFFS*//
 
 
 
 
dotouch(key id)//function for when someone touches this prim
{
    integer winner = 0;//we currently do not have a winner
    string out = "\n";//text output for user
    if(use_random_letter==1)//if we are using the random letter game
    {
        if(llToUpper(llGetSubString(llKey2Name(id),0,0))==name || llToUpper(llGetSubString(llKey2Name(id),-1,-1))==name)
        {//if the person who touched this prim has a first name that starts with the random letter or a last name that ends with the random letter we have a winner
            winner = 1;
        }else
        {
            out += "your name does not start with or end with "+name+"\n";
        }
    }
 
    if(use_random_sequence==1)//if we are using the random sequence game
    {//if the person who touched this prim has a name that contains the random sequence of letters we have a winner.
        if(llSubStringIndex(llToUpper(llKey2Name(id)),castcount)!=-1)
        {
            winner = 1;
        }else
        {
            out += "your name does not contain "+castcount+"\n";
        }
    }
 
    if(use_numerology==1)//if we are using teh random numerology game
    {//if the person who touched this prims name adds up numerologically to the random number we chose we have a winner.
        if(get_numerics(llToLower(llKey2Name(id))) == numericnumber)
        {
            winner = 1;
        }else
        {
            out += "your numerology number is "+(string)get_numerics(llToLower(llKey2Name(id)))+" not "+(string)numericnumber+"\n";
        }
    }
    if(winner == 1)//if we have a winner
    {
        llSay(0,"CONGRATZ!!!!!!!!!!! YOU WIN");//tell the world
        payout(id);//give out the prize
        if(1==1)state get_rand;//refresh our credentials
    }else//if not tell the user they didnt win and why
    {
        if(use_random_number)
        {
            out += "if you still want this prize you can always pay me "+(string)amount_per_guess+"L and try to guess my hidden number.";
        }
        llSay(0,"sorry but\n"+out);
    }
}
 
integer use_random_number = 1;//do we want to use random number guessing game?
integer use_random_letter = 1;//do we want to use the random letter lucky chair type game?
integer use_random_sequence = 1;//do we want to use the random sequence of characters?
integer use_numerology = 1;//do we want to use numerology to pick winners?
integer use_channel_output = 1;//do we want to shout on channels when someone wins a prize?
integer channel = -999;//the channel we will shout on IF we are shouting on channels
integer use_notify_owner = 1;//do we want to tell our owner when we give out prizes?
integer time_reset_minutes = 15;//how often do we need to reset and pick new random credentials?
integer amount_per_guess = 1;//how much money does it cost per guess for the random number guessing game?
 
 
 
dorandletter()//function to pick a random character
{
    integer purely_random = 0;
    integer i = 0;
    if(use_random_letter == 1)
    {
        do{
            llSetText("PICKING A RANDOM LETTER....\n["+llGetSubString(charmap,purely_random,purely_random)+"]",<1,1,1>,1);
            purely_random = llFloor(llFrand(llStringLength(charmap)));
            i++;
        }while(i < 100);
        name = llGetSubString(charmap,purely_random,purely_random);
    }
}
dorandsequence()//function to pick a random sequence of characters.
{
    integer purely_random = 0;
    integer i = 0;
    if(use_random_sequence == 1)
    {
        i=0;
        castcount = "";
        purely_random=0;
        do{
            llSetText("PICKING A CHAR SEQUENCE ",<1,1,1>,1);
            purely_random = llFloor(llFrand(llStringLength(charmap)));
            castcount += llGetSubString(charmap,purely_random,purely_random);
            i++;
        }while(i<3);
    }
}
dorandomnumber()//function to pick a random number 0 - 100
{
    integer purely_random = 0;
    integer i = 0;
    if(use_random_number == 1)
    {
        llSetPayPrice(PAY_HIDE,[amount_per_guess,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
        i=0;
        do{
            llSetText("PICKING A RANDOM GUESSING NUMBER \n["+(string)llFloor(llFrand(100))+"]",<1,1,1>,1);
            randomnumber = llFloor(llFrand(100));
            i++;
        }while(i < 100);
    }else
    {
        llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
    }
}
dorandomnumerology()//function to pick a random number 0-9 for the numerology game
{
    integer purely_random = 0;
    integer i = 0;
    if(use_numerology == 1)
    {
        i=0;
        do{
            llSetText("PICKING A RANDOM NUMEROLOGY NUMBER \n["+(string)llFloor(llFrand(llGetListLength(numbers)))+"]",<1,1,1>,1);
            numericnumber = llFloor(llFrand(llGetListLength(numbers)));
            i++;
        }while(i < 100);
    }
}
dorandominventory()//function to pick a random inventory item to give out.
{
    integer purely_random = 0;
    integer i = 0;
    do{
        purely_random = llFloor(llFrand(llGetInventoryNumber(INVENTORY_ALL)));
        string n = llGetInventoryName(INVENTORY_ALL,purely_random);
        if(n!=llGetScriptName() && n!="_config")
        {
            llSetText("PICKING A RANDOM ITEM \n["+n+"]",<1,1,1>,1);
            item = n;
        }
        i++;
    }while(i < 100);
}
string name;//the letter we have picked at random
string castcount;//the sequence of letters we picked at random
string item;//the random inventory item we are giving away
integer randomnumber;//the random number we picked for the guessing game
integer numericnumber;//the randomly picked numerology number
integer lis;//listen even handler
integer chan = 0;//channel to listen on for user input on the guessing game
key listenid;//the user who paid us to play the guessing game we need to listen to that person only
string charmap = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//list of characters in the form of a string. i like this.
list numbers = [0,1,2,3,4,5,6,7,8,9];//list of numerology numbers
list letters = ["aku","blv","cmw","dnx","eoy","fpz","gq","hr","is","jt"];//list of numerologically ordered letters. numbers get converted to teh actuall number later
random_contains()//fetch all our randomness
{
    dorandletter();//get the letter
    dorandsequence();//get the letters
    dorandomnumber();//get teh number
    dorandomnumerology();//get the mystical stuff
    dorandominventory();//grab an item
    string sep = "\n";
    string line1 = "If your Name Starts OR Ends with the Letter "+name;
    string line2 = "Or your name contains the partial phrase "+castcount;
    string line3 = "OR if your numerology number for your avatar matches "+(string)numericnumber;
    string line4 = "Touch me for the Mystery Prize inside.";
    string line5 = "OR pay me "+(string)amount_per_guess+"L and guess my random number.\nhint it is between 0 and 100";
    string out;
    if(use_random_letter == 1)
    {
        out += line1+sep;
    }
    if(use_random_sequence == 1)
    {
        out += line2+sep;
    }
    if(use_numerology == 1)
    {
        out += line3+sep;
    }
    out += line4+sep;
    if(use_random_number == 1)
    {
        out += line5;
    }
    //create teh text and float it
    llSetText(out,<1,1,1>,1);
}
relis()//function to remove and reset a listener for chat
{
    llListenRemove(lis);
    lis = llListen(chan,"","","");
}
payout(key id)//function to give out the item to the winner.
{
    llParticleSystem([
    PSYS_PART_FLAGS, 0 | PSYS_PART_EMISSIVE_MASK | 
    PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | 
    PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK,
    PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_EXPLODE,
    PSYS_PART_MAX_AGE,10.0,
    PSYS_PART_START_COLOR,<1.00,1.00,1.00>,
    PSYS_PART_END_COLOR,<0.15,0.15,0.15>,
    PSYS_PART_START_SCALE,<0.04,0.04,0.04>,
    PSYS_PART_END_SCALE,<1.11,1.11,1.11>,
    PSYS_SRC_BURST_RATE,0.01,
    PSYS_SRC_ACCEL,<0.0,0.0,0.0>,
    PSYS_SRC_BURST_PART_COUNT,9000,
    PSYS_SRC_BURST_RADIUS,0.0,
    PSYS_SRC_BURST_SPEED_MIN,1.0,
    PSYS_SRC_BURST_SPEED_MAX,1.0,
    PSYS_SRC_TARGET_KEY,(key)"",
    PSYS_SRC_INNERANGLE,1.55,
    PSYS_SRC_OUTERANGLE,1.54,
    PSYS_SRC_OMEGA,<2,2,2>,
    PSYS_SRC_MAX_AGE,10.0,
    PSYS_SRC_TEXTURE,"11f44bae-9a98-5ede-102e-26b3910d4062",//diamond texture use it for otehr stuff if ya want
    PSYS_PART_START_ALPHA,1.0,
    PSYS_PART_END_ALPHA,0.0
    ]);//do the big ole particle explosion full of diamonds
    llGiveInventory(id,item);//give the item to the winner
    llSleep(3.0);//take a short break
    llParticleSystem([]);//kill the particles
    if(use_channel_output == 1)//if we are allowed to talk on channels do that now
    {
        llSay(channel,"MYSTERY_PAYOUT|"+(string)id);
    }
 
    if(use_notify_owner)//if we are allowed to tell our owner about the winner do that now
    {
        llInstantMessage(llGetOwner(),"gave "+item+" to "+llKey2Name(id));
    }
}
integer get_numerics(string name)//function to convert a name to a number numerologically
{    
    //this is based on the 0-9 setup
    //0123456789
    //abcdefghij
    //klmnopqrst
    //uvwxyz
    integer your_number;
    integer i = 0;
    do
    {
        string l = llGetSubString(name,i,i);
        integer x = 0;
        while(x < llGetListLength(letters))
        {
            integer ficl = llSubStringIndex(llList2String(letters,x),l);
            if(ficl != -1)
            {
                your_number = your_number + llList2Integer(numbers,x);
            }else
            {
                your_number = your_number + (integer)l;
            }
            x++;
        }
        //llOwnerSay("yournum:"+(string)your_number);
        i++;
    }while(i<llStringLength(name));
    @makesingle;
    if(llStringLength((string)your_number) > 1)
    {
        integer trueout = 0;
        integer a = 0;
        do
        {
            trueout = trueout + (integer)llGetSubString((string)your_number,a,a);
            a++;
        }while(a < llStringLength((string)your_number));
        your_number = 0;
        your_number = your_number + trueout;
        //llOwnerSay("yournum:"+(string)your_number);
    }else
    {
        jump done;
    }
    jump makesingle;
    @done;
    return your_number;
}
 
//*Color Gradient code from Eric Quine's Color Shifter v4.5 with light script*//
vector color = <1, 0, 0>;
float colorStep = 0.03;
getNextColor()
{
    // red -> yellow
    if (color.x >= 1 && color.y < 1 && color.z <= 0) {
        color.y += colorStep;
    }
    // yellow -> green
    else if (color.x > 0 && color.y >= 1 && color.z <= 0) {
        color.x -= colorStep;
    }
    // green -> cyon
    else if (color.x <= 0 && color.y >= 1 && color.z < 1) {
        color.z += colorStep;
    }
    // cyan -> blue
    else if (color.x <= 0 && color.y > 0 && color.z >= 1) {
        color.y -= colorStep;
    }
    // blue -> violet
    else if (color.x < 1 && color.y <= 0 && color.z >= 1) {
        color.x += colorStep;
    }
    // violet -> red
    else if (color.x >= 1 && color.y <= 0 && color.z > 0) {
        color.z -= colorStep;
    }
}
//*Color Gradient code from Eric Quine's Color Shifter v4.5 with light script*//
default
{
    on_rez(integer sp)
    {
        llResetScript();
    }
    changed(integer c)
    {
        if(c & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    state_entry()
    {
        llSetTexture("75514350-0a83-9207-a6ce-9e4d174b10b9",ALL_SIDES);//? texture mysterious ooooooo lol this is a question mark texture that is the default myster prim texture. you can change that here if you like
        llSetText("CONFIGURING MYSTERY SYSTEM...",<1,1,1>,1);
        line = 0;
        read = llGetNotecardLine(note,line);
    }
    dataserver(key id,string data)
    {
        if(id == read)
        {
            if(data != EOF)
            {
                if(llGetSubString(data,0,0)!="#" && llGetSubString(data,0,1)!="//" && data != "" && data!=" ")
                {
                    dodata(data);
                }
                read = llGetNotecardLine(note,++line);
            }else
            {
                state get_rand;
            }
        }
    }
}
state get_rand
{
    on_rez(integer sp)
    {
        llResetScript();
    }
    changed(integer c)
    {
        if(c & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    state_entry()
    {
        llListenRemove(lis);
        random_contains();
        state running;
    }
}
state running
{
    on_rez(integer sp)
    {
        llResetScript();
    }
    changed(integer c)
    {
        if(c & CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    state_entry()
    {
        llResetTime();
        llSetTimerEvent(1.0);
    }
    money(key id,integer amount)
    {
        llSay(0,"type your guess in chat and lets see if you win!!!! good luck.");
        listenid = id;
        relis();
    }
    listen(integer c,string n,key id,string m)
    {
        if(id == listenid)
        {
            if(m == (string)randomnumber)
            {
                llSay(0,"CONGRATZ!!!!!!!!!!! YOU WIN");
                payout(id);
                state get_rand;
            }else
            {
                //this is to help the player guess the number. over under and what not so they can guess again and try to get closer to the real number
                string outout = "";
                integer in = (integer)m;
                if(in > randomnumber)outout = "OVER";
                else if(in < randomnumber)outout = "UNDER";
                llSay(0,"SORRY, THAT'S NOT MY NUMBER. TRY AGAIN IF YOU WANT. YOUR NUMBER WAS "+outout+" MY NUMBER");
                llListenRemove(lis);
            }
        }
    }
    timer()
    {
        float time = llGetTime();
        if((integer)time % (60*time_reset_minutes) == 0)
        {
            state get_rand;
        }else if((integer)time % 1 == 0)
        {
            getNextColor();
            llSetColor(color, ALL_SIDES);//this uses Eric Quine's Color Shifter
        }
    }
    touch_start(integer total_number)
    {
        dotouch(llDetectedKey(0));
    }
}


and for the notecard. name the note card _config and add....

use_random_number=1 use_random_letter=1 use_random_sequence=1 use_numerology=1 use_channel_output=1 channel=-999 use_notify_owner=1 time_reset_minutes=5 amount_per_guess=1