Dialog Based Sounds Vendor

Written by Kitsune
//Dialog Based sounds vendor by Kenny Jackson
 
//NOTES:
//1.) All sounds in the vendor will have the same price.
//2.) Set the price by changing the vendor description.
//(example. If you want the price of all the sounds in the vendor to be L$50 set the vendor description to 50.)
//3.) After adding new sounds to the vendor or changing the price or vendor name hit the RESET button to update the script. Only the owner will see the RESET button.
//4.) Just drop this script and the sounds your selling into a prim
//5.) Click the prim to get the dialog.
//6.) If your going to have more than 1 of these in a small area make sure to have a different channel number on each of them or all the vendors in the area will respond to the others dialogs.
//Kenny Jackson
 
integer price;
string wrong = "Sorry, that is not the correct price";
string over = "You have overpaid, here is your change";
string thank = "Thank you for your purchase";
integer finished = FALSE;
integer n = 0;
integer i;
list sounds;
integer CHANNEL = 123456;
string soundName;
string GNAME;
string Vname;
 
default
{
    state_entry()
    {
      while(!finished)
        {
            soundName = llGetInventoryName(INVENTORY_SOUND, n);
            if(soundName == "")
            {
                finished = TRUE;
                Vname = llGetObjectName();
                price = (integer)llGetObjectDesc();
 
                state debtperm;
            }
            else
            {
               sounds = sounds + soundName;
                n++;
            }
          }
        }
}
state debtperm
{
 state_entry()
    {
        //Do some initialization here
        llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
    }
    run_time_permissions(integer permissions)
    {
        //Only wait for payment if the owner agreed to pay out money
        if (permissions)
        {
            llSetText("Initailized Successfully...", <0,1,0>,1);
            state next;
        }
    }
}
state ready
{
    on_rez(integer start_param)
    {
        llResetScript();
    }
 
    state_entry()
    {
     GNAME = llList2String(sounds, i);
 
     llListen(CHANNEL, "",  "", "");
    }
 
    listen(integer channel, string name, key id, string message)
    {
        if(channel == CHANNEL && message == "Reset")
        {
            llSetText("Resetting...", <1,0,0>, 1);
            llResetScript();
 
        }
 
        if(channel == CHANNEL && message == "Next")
        {
          i++;
 
          if(i >= n)
          {
          i = 0;
          state next;
 
          }
          else
          {
          state next;
          }
 
        }
        if(channel == CHANNEL && message == "Back")
        {
          i--;
 
          if(i < 0)
          {
          i = n - 1;
          state next;
 
          }
          else
          {
          state next;
          }
        }
        if(channel == CHANNEL && message == "Play")
        {
         llPlaySound(GNAME, 1);
         state next;
        }
 
    }
    touch_start(integer total_number)
    {
        if(llDetectedKey(0) == llGetOwner())
        {
        llDialog(llDetectedKey(0),"1.) Choose Next/Back to scroll through sounds.\n2.) Press Play to hear a sound.\n3.) Right Click and Pay to buy!", ["Back", "Next", "Play", "Reset"], CHANNEL);
         }
         else
         {
        llDialog(llDetectedKey(0),"1.) Choose Next/Back to scroll through sounds.\n2.) Press Play to hear a sound.\n3.) Right Click and Pay to buy!", ["Back", "Next", "Play"], CHANNEL);
         }
    }
 
    money(key id, integer amount)
    {
        if(amount < price)
        {
            llSay(0, wrong);
            llGiveMoney(id, amount);
        }
        if(amount > price)
        {
            llSay(0, over);
            llGiveMoney(id, amount - price);
            llGiveInventory(id, GNAME);
        }
        if(amount == price)
        {
            llSay(0, thank);
            llGiveInventory(id, GNAME);
        }
    }
}
state next
{
    state_entry()
    {
        GNAME = llList2String(sounds, i);
        llSetText(".:" + Vname + ":.\nClick for a dialog!\nSound Name: " + GNAME + "\nPrice: L$" + (string)price, <1,1,1>, 1);
        state ready;
    }
}