Difference between revisions of "User:Fred Gandt/Scripts/Continued 2"

From Second Life Wiki
Jump to: navigation, search
m (cleaning up headings)
(replaced old and crazy door script with new game (for fun) script)
Line 137: Line 137:
 
}</syntaxhighlight>
 
}</syntaxhighlight>
  
=== Swingin' Door ===
+
=== What's my Build? ===
 +
A simple but fun game for groups to play. Players take turns building their interpretation of a suggested word or phrase, then the other players make guesses in local chat until one is correct. The player who correctly guesses what is being built becomes the new builder and the game continues.
  
'''DUE FOR AN UPDATE''' Sucks a bit. Works but could be so much better.
+
* Up to 9 notecards containing lists of words or phrases can be added.
 +
** One word or phrase per line.
 +
** No empty lines.
 +
** Add alternative spellings (''i.e.'' "colour" and "color") or meanings (''i.e.'' "truck", "lorry" and "van") together on the same line, separated by pipes (this is a pipe --> "{{!}}").
 +
** Punctuation listed in the script will be stripped from the words and phrases.
 +
*** Unfortunately, LSL has no [https://en.wikipedia.org/wiki/Regular_expression RegEx] and as such it is impractical to except alternatives that aren't explicitly added to the cards. An LSL parser capable of regex like deduction would be horrible, so without utilising a remote server (a possible update), the alternatives need to cover everything reasonable to expect. There is an option for the owner to  be told the word or phrase being built (after which they will be excluded from that round), and it's recommended if the script is reading from a card containing potentially contentious phrases with many possible alternatives.
 +
* Menu operated from touch.
 +
* Two scripts; one is tiny.
  
*I have included as many conditions in the link_messaging conditions as I could to help keep the potential for conflict with other scripts used in any [[LINK_SET]] with this script down to a very unlikely level. If you have other scripts issuing or receiving [[link_message]]s in the same link_set as this script and in those other scripts there are few conditions to be met within the link_message event, add conditions to exclude unwanted reaction to this scripts issues of link_messages. Or something like that anyway. Long story short...Scripts can talk to each other. Make sure the messages go where they are supposed to go.
+
==== Main script ====
 +
<syntaxhighlight lang="lsl2">// V1 - Hardly tested //
  
*Doors made with this script do not need to be configured by changing anything in the script or in a notecard (a notecard is used to set security lists of allowed and disallowed agents). There is a simple dialog menu system for all config options. To activate the menu click on the door and hold the mouse button down until the menu shows. On laggy regions this may take a few seconds, be patient.
+
key owner;
 +
key nc_line_id;
 +
key num_of_nc_lines_id;
 +
key current_builder = NULL_KEY;
  
*Features can be changed in Self (the door that gives you the menu), Local (double doors) or Global (all doors in a link set).
+
integer query_id;
 +
integer channel;
 +
integer num_of_ncs;
 +
integer private_listen_id;
 +
integer public_listen_id;
 +
integer line_index;
 +
integer owner_knows;
  
*Consecutively linked doors (at this time 3 doors won't function well as a local set) regard each other as Local, perfect for making double doors, either both acting as one folding door or each acting as one 1/2 of a double set of doors. All doors linked to the same set regard each other as Global.
+
string notecard;
 +
string current_word;
 +
string word_or_phrase;
  
*Double sets of double doors can now be configured. So two sets of folding doors can be operated as one set of four doors. This is done without using a permanently open listen so is relatively lagless. Four doors need to be linked in order - Child door of one set of folding doors > Root of that set > Child of the other set of folding doors > Root of that set (the last door selected becoming the temporary root of all four). Then bring up the menu from one of the root-to-be doors (either outside door) and choose "DDD" (stands for Double Double Doors). Grant two scripts permissions when asked and the doors will reconfigure them selves in around 5 seconds. Give 10 to be sure they have finished. Now you can treat each set of folding doors as a local set.
+
list notecards;
 +
list dialog_list;
 +
list shuffled_line_numbers;
 +
list current_alts;
 +
list punctuation = [ ".", ",", "!", "?", ";", ":", "-", "\"" ]; // Must not contain pipes --> |
  
*'''DOUBLE DOUBLE DOORS WILL BREAK IF TAKEN AND RE-REZZED. I'LL ATTEMPT TO FIX THIS ISSUE SOON.'''
+
integer frequency() {
 +
    channel = ( integer )( llFrand( -1073741824.0 ) - 1073741824.0 );
 +
    return channel;
 +
}
  
*For Whitelist and Blacklist security include a notecard in the doors something like the example below. If doors are linked together in any of the many possible ways only one of the doors needs to have the Whitelist/Blacklist NC.
+
removeListen( integer id ) {
 +
    llListenRemove( id );
 +
    if ( id == private_listen_id ) {
 +
        llSetTimerEvent( 0.0 );
 +
    }
 +
}
  
*The following notecard example contains two important words - "Whitelist" & "Blacklist". The whitelist is those who you allow to use the door when against the general public it is locked. If the door is deadlocked only the owner can operate it. The blacklist is those who may NEVER use the door. You do not need to add yourself to the whitelist (owner oddly enough may always use the door). Names are cAsE & speelign sensitive.
+
ownerDialog( string msg ) {
 +
    if ( msg == "" ) {
 +
        msg = "Select a notecard, hear the current " + word_or_phrase + " or reset the game.";
 +
    }
 +
    private_listen_id = llListen( channel = frequency(), llKey2Name( owner ), owner, "" );
 +
    llDialog( owner, "\n" + msg, [ "CANCEL", llList2String( [ "START", "TELL" ], current_word != "" ), "RESET" ] + dialog_list, channel );
 +
    llSetTimerEvent( 20.0 );
 +
}
  
*There is a group option to allow members of the group the door is set to (not deeded) to use it when it is otherwise locked (not deadlocked). If group is set on the door both those on the whitelist and those wearing the correct group tag may use the door. Anyone on the blacklist will still be banned even if they are wearing the right group tag.
+
publicListen() {
 +
    public_listen_id = llListen( PUBLIC_CHANNEL, "", "", "" );
 +
}
  
*'''When linking doors be careful to -'''
+
getLine() {
 +
    nc_line_id = llGetNotecardLine( notecard, --line_index );
 +
    if ( !line_index ) {
 +
        ownerDialog( "We've reached the end of the last notecard; please select another to continue." );
 +
    }
 +
}
  
:*Not make any door the root of more than a linkset you wish to act as a door. If a door is a root every child prim linked to it will move with the door.
+
announce( string str ) {
 +
    llSay( PUBLIC_CHANNEL, str );
 +
}
  
:*Not link doors to a strangely angled root prim. When building ALWAYS try to make your root prim zero rotation when linking.
+
string agentName( key id ) {
 +
    string name = llGetDisplayName( id );
 +
    if ( name == "" ) {
 +
        name = llKey2Name( id );
 +
    }
 +
    return name;
 +
}
  
:*Reset the script in any door edited to a strange rotation (i.e. 45degrees on the Y axis). Once linked to a build as a child prim the whole build can be rotated without resetting door scripts.
+
mia( integer index ) {
 +
    removeListen( public_listen_id );
 +
    key temp_builder = current_builder;
 +
    string temp_word = current_word;
 +
    current_builder = NULL_KEY;
 +
    current_word = "";
 +
    announce( llList2String( [ "The current builder", agentName( temp_builder ) ], index ) + " has " +
 +
              llList2String( [ "left the region", "given the game away" ], index ) +
 +
              ", so a new builder must take their place by touching me.\nThe " + word_or_phrase + " was \"" + temp_word + "\"." );
 +
}
  
:*When making folding doors, consider which should be the root and which the child. The child should be the door that is not hinged on the wall.
+
string trim( string str ) {
 +
    return llStringTrim( str, STRING_TRIM );
 +
}
  
<pre>Whitelist
+
string dL2S( list lst ) {
Fred Flintstone
+
    return llDumpList2String( lst, " " );
Elmer Fudd
+
}
Rank Xerox
+
Blacklist
+
The Joker
+
Miss Crabapple
+
M Linden</pre>
+
  
<syntaxhighlight lang="lsl2">// V2 //
+
string cleanString( string str ) {
+
  return llToLower( trim( dL2S( llParseString2List( dL2S( llParseString2List( str, punctuation, [] ) ), [ "  " ], [] ) ) ) );   
// THERE IS NO NEED FOR THE AVERAGE USER TO CHANGE ANYTHING IN THE SCRIPT.
+
}
// THE SCRIPT WILL TAKE CARE OF ALMOST EVERYTHING. USE THE MENU TO CHANGE SETTINGS.
+
+
+
// I designed it to be dragged and dropped into a fresh prim. This will create the basic door.
+
// Re-texture and color as you like. Re-shaping may cause problems...
+
// ...(rotations are around the true center of the prim (this is a path-cut door) on it's local Z axis).
+
+
+
// DIALOG MENU FOR ALL USER SETTINGS OPTIONS
+
// Touch and hold the mouse button until a blue drop-down dialog shows for config options.
+
+
+
// The next few lines could be altered by you without harming the script (within reason).
+
+
list angle_list = ["150", "180", "210", "90", "105", "120", "45", "60", "75"]; // More options coming. Max number 9 options.
+
+
list time_list = ["16", "18", "20", "10", "12", "14", "4", "6", "8"]; // Auto closure times. Max number 9 options.
+
+
key LL_Brazillian_Rosewood = "a25bebc8-4739-453d-d44e-fc522cf95488"; // Start texture. Sets as door is created.
+
+
key Door_Opening = "99236139-075b-3057-7c6f-0f68bb2af001"; // Door sounds (if replacing consider the length).
+
+
key Door_Closing = "43e46041-25fa-0a03-7be8-78297f579d53";
+
   
+
key Doorbell = "213aae54-6093-7fcc-118f-3039a5435986"; // Door bell sound.
+
+
// FROM HERE ON DO NOT CHANGE ANYTHING UNLESS YOU KNOW WHAT YOU ARE DOING.
+
+
+
integer notecard_length;
+
+
integer sound_on = TRUE;
+
+
string dia_msg = "\n";
+
+
list dia_buttons = [];
+
+
list whitelist = [];
+
   
+
list blacklist = [];
+
+
float angle = 90.0;
+
+
integer permission;
+
+
integer url_count;
+
+
integer count_NCL;
+
+
string owner_name;
+
+
float time = 6.0;
+
+
string addressee;
+
+
integer dia_chan;
+
+
integer dia_lis;
+
+
integer t_count;
+
+
integer aligned;
+
  
integer sat_on;
+
list trimList( list lst ) {
+
     integer length = llGetListLength( lst );
integer global;
+
    while ( length ) {
+
         --length;
integer locked;
+
         lst = llListReplaceList( lst, [ trim( llList2String( lst, length ) ) ], length, length );
+
string my_url;
+
+
integer group;
+
+
integer local;
+
+
integer emile;
+
+
key my_buddy;
+
+
integer IGAN;
+
+
integer DDDC;
+
+
integer dead;
+
+
integer open;
+
+
integer DDD;
+
+
integer DTB;
+
+
integer nop;
+
+
key bell_id;
+
+
integer mln;
+
+
key my_key;
+
+
string NCN;
+
+
key rrruid;
+
+
key owner;
+
+
key ruid;
+
+
key NoNL;
+
+
key NCK;
+
+
key OLC;
+
+
key NL;
+
+
+
+
OperateDoor(integer o, integer lm, integer h, integer t)
+
{
+
     if(nop >= 2 && (!lm) && (!t))
+
    {
+
         if(!h)
+
         llMessageLinked(LINK_ALL_OTHERS, dia_chan, owner_name, owner);
+
        else if(h)
+
        llMessageLinked(LINK_ALL_OTHERS, dia_chan, "DSAH", owner);
+
 
     }
 
     }
     if(sound_on)
+
     return lst;
    {
+
        key door_sound;
+
        if(o)
+
        door_sound = Door_Closing;
+
        else
+
        door_sound = Door_Opening;
+
        llPlaySound(door_sound, 1.0);
+
    }
+
    float d;
+
    float a = angle;
+
    vector v = (llRot2Euler(llGetLocalRot())*RAD_TO_DEG);
+
    float x = v.x;
+
    float y = v.y;
+
    float z = v.z;
+
    if(llFabs(x) < 1.0)
+
    d = 1.0;
+
    else
+
    d = -1.0;
+
    if(o)
+
    {
+
        if(llFabs(x) < 1.0)
+
        d = -1.0;
+
        else
+
        d = 1.0;
+
        a = -angle;
+
        llSetTimerEvent(0.0);
+
    }
+
    else
+
    llSetTimerEvent(time);
+
    if(aligned)
+
    {
+
        llTargetOmega(<0.0,0.0,d>, (angle/90.0), 1.0);
+
        llSleep(1.5);
+
        llTargetOmega(ZERO_VECTOR, 0.0, 0.0);
+
    }
+
    llSetLocalRot(llEuler2Rot(<x,y,(z + a)>*DEG_TO_RAD));
+
    open = (!open);
+
 
}
 
}
+
 
TouchMeAllOver(key id, integer t, integer te)
+
integer ncNoBuilder() {
{
+
     return notecard != "" && current_builder == NULL_KEY;
     if(t && id == owner)
+
}
    {
+
 
        global = FALSE;
+
start( key id ) {
        local = FALSE;
+
    current_builder = id;
        dia_msg = "\n\"Global\" - Instruct all doors linked to this.
+
    getLine();
        \n\"Local\" - Instruct only locally linked doors.
+
}
        \n\"Self\" - Instruct only this door.";
+
 
        dia_buttons = ["Self", "Local", "CANCEL", "Global"];
+
default {
        if(nop == 4)
+
    on_rez( integer param ) {
        dia_buttons += ["-", "DDD"];
+
         llResetScript();
        dia_lis = llListen(dia_chan, owner_name, owner, "");
+
         llDialog(owner, dia_msg, dia_buttons, dia_chan);
+
 
     }
 
     }
     if(te)
+
     changed( integer change ) {
    {
+
         if ( change & ( CHANGED_OWNER | CHANGED_INVENTORY ) ) {
         if(t_count < 10)
+
             llResetScript();
        {
+
            if(!dead)
+
            {
+
                if(!Whitelist(id))
+
                {
+
                    bell_id = id;
+
                    OLC = llRequestAgentData(owner, DATA_ONLINE);
+
                    return;
+
                }
+
            }
+
            else
+
            {
+
                if(id != owner)
+
                return;
+
            }
+
            if(DDD && (mln == 1))
+
            llHTTPRequest(my_url, [HTTP_METHOD, "POST"], "OTFD");
+
             OperateDoor(open, FALSE, FALSE, FALSE);
+
 
         }
 
         }
        t_count = 0;
 
 
     }
 
     }
}
+
    state_entry() {
+
        owner = llGetOwner();
integer Whitelist(key id)
+
         num_of_ncs = llGetInventoryNumber( INVENTORY_NOTECARD );
{
+
         if ( num_of_ncs ) {
    integer w = TRUE;
+
             string nc;
    integer index;
+
             while ( num_of_ncs ) {
    if(id == NULL_KEY)
+
                notecards += [ nc = llGetInventoryName( INVENTORY_NOTECARD, --num_of_ncs ) ];
    {
+
                dialog_list += [ llGetSubString( nc, 0, 23 ) ];
        whitelist = [];
+
             }
         blacklist = [];
+
            ownerDialog( "" );
        count_NCL = 0;
+
        NCN = llGetInventoryName(INVENTORY_NOTECARD, 0);
+
         if(llStringLength(NCN))
+
        {
+
             IGAN = TRUE;
+
             NCK = llGetInventoryKey(NCN);
+
            llMessageLinked(LINK_ALL_OTHERS, dia_chan, "IGAN", NCK);
+
             NoNL = llGetNumberOfNotecardLines(NCN);
+
 
         }
 
         }
        else
 
        {
 
            IGAN = FALSE;
 
            if(nop > 1)
 
            llMessageLinked(LINK_ALL_OTHERS, dia_chan, "IGAN", owner);
 
        }
 
        llOwnerSay("Door Ready");
 
 
     }
 
     }
     else
+
     touch_start( integer nd ) {
    {
+
         key toucher;
         if(id != owner)
+
         while ( nd ) {
         {
+
             toucher = llDetectedKey( --nd );
            if(locked)
+
            if ( toucher == owner ) {
             {
+
                 ownerDialog( "" );
                index = llListFindList(whitelist, [llKey2Name(id)]);
+
            } else if ( ncNoBuilder() ) {
                if(index == -1)
+
                 start( toucher );
                 w = FALSE;
+
                if(group && (!w))
+
                 {
+
                    if(llSameGroup(id))
+
                    w = TRUE;
+
                }
+
 
             }
 
             }
            index = llListFindList(blacklist, [llKey2Name(id)]);
 
            if(index != -1)
 
            w = FALSE;
 
 
         }
 
         }
 
     }
 
     }
     return w;
+
     listen( integer chan, string name, key id, string msg ) {
}
+
         if ( chan && id == owner ) {
+
            removeListen( private_listen_id );
GetCracking()
+
            if ( msg != "CANCEL" ) {
{
+
                integer index;
    owner = llGetOwner();
+
                if ( msg == "RESET" ) {
    dia_chan = (-1*llAbs(((integer)("0x" + llGetSubString(((string)owner), -9, -3)))));
+
                    llResetScript();
    owner_name = llKey2Name(owner);
+
                } else if ( msg == "START" ) {
    nop = llGetNumberOfPrims();
+
                    if ( notecard == "" ) {
    mln = llGetLinkNumber();
+
                        ownerDialog( "You need to select a notecard to play with first." );
    my_key = llGetLinkKey(mln);
+
                    } else if ( current_builder ) {
    GetAligned(nop, mln);
+
                        ownerDialog( llKey2Name( current_builder ) + " has already started the game." );
}
+
                    } else {
+
                        start( owner );
GetAligned(integer p, integer l)
+
                    }
{
+
                } else if ( msg == "TELL" ) {
    vector myrot = (llRot2Euler(llGetRot())*RAD_TO_DEG);
+
                    owner_knows = TRUE;
    vector rootrot = (llRot2Euler(llGetRootRotation())*RAD_TO_DEG);
+
                    llOwnerSay( current_word );
    integer mrx = llRound(llFabs(myrot.x));
+
                 } else if ( ~( index = llListFindList( dialog_list, [ msg ] ) ) ) {
    integer mry = llRound(llFabs(myrot.y));
+
                     num_of_nc_lines_id = llGetNumberOfNotecardLines( notecard = llList2String( notecards, index ) );
    integer rrx = llRound(llFabs(rootrot.x));
+
    integer rry = llRound(llFabs(rootrot.y));
+
    if(p > 1 && l != 1)
+
    {
+
         if((mrx == rrx && mry == rry))
+
        aligned = TRUE;
+
        else if((mrx == (rrx + 180) && mry == rry))
+
        aligned = TRUE;
+
        else if((mrx == (rrx - 180) && mry == rry))
+
        aligned = TRUE;
+
        else if((mrx == rrx && mry == (rry + 180)))
+
        aligned = TRUE;
+
        else if((mrx == rrx && mry == (rry - 180)))
+
        aligned = TRUE;
+
        else if((mrx == (rrx + 180) && mry == (rry + 180)))
+
        aligned = TRUE;
+
        else if((mrx == (rrx + 180) && mry == (rry - 180)))
+
        aligned = TRUE;
+
        else if((mrx == (rrx - 180) && mry == (rry - 180)))
+
        aligned = TRUE;
+
        else if((mrx == (rrx - 180) && mry == (rry + 180)))
+
        aligned = TRUE;
+
        else
+
        aligned = FALSE;
+
    }
+
    else
+
    {
+
        if((!mrx) && (!mry))
+
        aligned = TRUE;
+
        else if((mrx == 180) && (mry == 180))
+
        aligned = TRUE;
+
        else if((!mrx) && (mry == 180))
+
        aligned = TRUE;
+
        else if((mrx == 180) && (!mry))
+
        aligned = TRUE;
+
        else
+
        {
+
            aligned = FALSE;
+
            llSleep(0.2);
+
            llMessageLinked(LINK_ALL_OTHERS, dia_chan, "MA", owner);
+
        }
+
    }
+
}
+
+
StringControl(string s, integer g, integer l, integer lm)
+
{
+
    if(s == "SoundOff")
+
    sound_on = FALSE;
+
    else if(s == "SoundOn")
+
    sound_on = TRUE;
+
    else if(s == "UnLock")
+
    locked = FALSE;
+
    else if(s == "Lock")
+
    locked = TRUE;
+
    else if(s == "GroupOff")
+
    group = FALSE;
+
    else if(s == "GroupOn")
+
    group = TRUE;
+
    else if(s == "UnDead")
+
    dead = FALSE;
+
    else if(s == "DeadLock")
+
    dead = TRUE;
+
    else if(s == "NoAuto")
+
    time = 0.0;
+
    else if(s != "-")
+
    {
+
        float m = ((float)s);
+
        if(m > 20.0)
+
        angle = m;
+
        else
+
        time = m;
+
    }
+
    if(!lm)
+
    {
+
        string w;
+
        if(g)
+
        w = "globules" + s;
+
        else if(l)
+
        w = "homies" + s;
+
        llMessageLinked(LINK_ALL_OTHERS, dia_chan, w, owner);
+
    }
+
}
+
+
DoubleDoubleDoors(integer l, integer d)
+
{
+
    if(!d)
+
    {
+
        DTB = TRUE;
+
        if(l == 3)
+
        my_buddy = llGetLinkKey(4);
+
        else
+
        my_buddy = llGetLinkKey(2);
+
        llMessageLinked(LINK_ALL_OTHERS, dia_chan, "DOTHIS", my_buddy);
+
    }
+
}
+
+
default
+
{
+
    on_rez(integer param)
+
    {
+
        GetCracking();
+
        Whitelist(NULL_KEY);
+
    }
+
    state_entry()
+
    {
+
        llSitTarget(<0.0,0.0,0.1>, ZERO_ROTATION); // To guard against action when triggering the changed event.
+
        GetCracking();
+
        vector pos = llGetPos();
+
        llSetPrimitiveParams([9, 0, 0, <0.125, 0.375, 0.0>, 0.0, ZERO_VECTOR, <1.0, 1.0, 0.0>, ZERO_VECTOR,
+
                              17, 0, LL_Brazillian_Rosewood, <2.0, 0.1, 0.0>, <0.5, 0.025, 0.0>, 0.0,
+
                              17, 1, LL_Brazillian_Rosewood, <2.0, 1.0, 0.0>, <0.5, 0.0, 0.0>, 0.0,
+
                              17, 2, LL_Brazillian_Rosewood, <0.05, 1.0, 0.0>, <0.0125, 0.0, 0.0>, 0.0,
+
                              17, 3, LL_Brazillian_Rosewood, <2.0, 0.1, 0.0>, <0.5, -0.025, 0.0>, 0.0,
+
                              17, 4, LL_Brazillian_Rosewood, <0.05, 1.0, 0.0>, ZERO_VECTOR, 0.0,
+
                              17, 5, LL_Brazillian_Rosewood, <1.0, 1.0, 0.0>, ZERO_VECTOR, 0.0,
+
                              19, ALL_SIDES, 1, 13,
+
                              7, <3.0, 0.2, 3.0>]);
+
        Whitelist(NULL_KEY);
+
    }
+
    listen(integer chan, string name, key id, string msg)
+
    {
+
        llListenRemove(dia_lis);
+
        if(msg != "CANCEL")
+
        {
+
            if(msg == "Global" | msg == "Local" | msg == "Self")
+
            {
+
                if(msg == "Global")
+
                global = TRUE;
+
                else if(msg == "Local")
+
                local = TRUE;
+
                dia_msg = "\nConfigure your doors.";
+
                dia_buttons = ["AutoClose", "CANCEL", "Angle"];
+
                if(sound_on)
+
                dia_buttons += ["SoundOff"];
+
                 else
+
                dia_buttons += ["SoundOn"];
+
                if(locked)
+
                dia_buttons += ["UnLock"];
+
                else
+
                dia_buttons += ["Lock"];
+
                if(group)
+
                dia_buttons += ["GroupOff"];
+
                else
+
                dia_buttons += ["GroupOn"];
+
                if(dead)
+
                dia_buttons += ["UnDead"];
+
                else
+
                dia_buttons += ["DeadLock"];
+
                dia_lis = llListen(dia_chan, owner_name, owner, "");
+
                llDialog(owner, dia_msg, dia_buttons, dia_chan);
+
            }
+
            else if(msg == "AutoClose" | msg == "Angle")
+
            {
+
                dia_lis = llListen(dia_chan, owner_name, owner, "");
+
                if(msg == "AutoClose")
+
                {
+
                     dia_msg = "\nSelect the length of time to wait before auto closing or turn off auto closure.";
+
                    if(llRound(time))
+
                    dia_msg += ("\nThe time this door is set at is \"" + ((string)((integer)time)) + "\" seconds now.");
+
                    dia_buttons = ["NoAuto", "-", "CANCEL"];
+
                    dia_buttons += time_list;
+
                }
+
                else
+
                {
+
                    dia_msg = ("\nSelect the degree of travel for your doors.
+
                                \nThis door is set at \"" + ((string)angle) + "\" now.");
+
                    dia_buttons = ["-", "CANCEL", "-"];
+
                    dia_buttons += angle_list;
+
 
                 }
 
                 }
                llDialog(owner, dia_msg, dia_buttons, dia_chan);
 
 
             }
 
             }
            else if(msg == "DDD")
+
        } else {
            {
+
            if ( llGetAgentSize( current_builder ) ) {
                 if(mln == 1 | mln == 3)
+
                msg = cleanString( msg );
                {
+
                integer alt_index;
                     if(permission)
+
                 if ( msg == current_word || ( llGetListLength( current_alts ) && ~( alt_index = llListFindList( current_alts, [ msg ] ) ) ) ) {
                    DoubleDoubleDoors(mln, DTB);
+
                     if ( id != owner || ( id == owner && !owner_knows ) ) {
                    else
+
                        if ( id != current_builder ) {
                    {
+
                            removeListen( public_listen_id );
                        llInstantMessage(owner, "\nPermissions are required by both the scripts destined to be roots.
+
                            if ( ~alt_index ) {
                                                \nPlease grant those permissions when asked.");
+
                                current_word = current_word + "\", alternatively known as \"" + msg;
                         llRequestPermissions(owner, PERMISSION_CHANGE_LINKS);
+
                            }
 +
                            announce( agentName( current_builder = id ) + " has correctly guessed that the " + word_or_phrase + " being built was \"" + current_word + "\"." );
 +
                            getLine();
 +
                         } else {
 +
                            mia( 1 );
 +
                        }
 
                     }
 
                     }
 
                 }
 
                 }
                else
+
            } else {
                 llInstantMessage(owner, "Please bring up the menu and choose \"DDD\" from either of the roots-to-be.");
+
                 mia( 0 );
 
             }
 
             }
            else
 
            StringControl(msg, global, local, FALSE);
 
 
         }
 
         }
 
     }
 
     }
    run_time_permissions(integer perms)
+
     dataserver( key id, string data ) {
    {
+
         if ( id == num_of_nc_lines_id ) {
        if(perms & PERMISSION_CHANGE_LINKS)
+
             integer num_of_nc_lines = ( integer )data;
        {
+
             line_index = num_of_nc_lines;
            permission = TRUE;
+
             while ( num_of_nc_lines ) {
            DoubleDoubleDoors(mln, DTB);
+
                 shuffled_line_numbers += [ --num_of_nc_lines ];
        }
+
        else
+
        {
+
            permission = FALSE;
+
            llInstantMessage(owner, "\nPermissions are required by this script for certain operations.
+
                                    \nThey MUST be granted to continue.");
+
            llRequestPermissions(owner, PERMISSION_CHANGE_LINKS);
+
        }
+
    }
+
     dataserver(key q, string data)
+
    {
+
         if(q == NoNL)
+
        {
+
             notecard_length = ((integer)data);
+
             NL = llGetNotecardLine(NCN, count_NCL);
+
        }
+
        else if(q == NL)
+
        {
+
             if(data != EOF)
+
            whitelist += [data];
+
            if(count_NCL < notecard_length)
+
            NL = llGetNotecardLine(NCN, (++count_NCL));
+
            else
+
            {
+
                 integer index = llListFindList(whitelist, ["Blacklist"]);
+
                blacklist = llList2List(whitelist, index, -1);
+
                whitelist = llDeleteSubList(whitelist, index, -1);
+
 
             }
 
             }
        }
+
            shuffled_line_numbers = llListRandomize( shuffled_line_numbers, 1 );
        else if(q == OLC)
+
             if ( ncNoBuilder() ) {
        {
+
                 announce( "Will the first builder please start the game by touching me?" );
             if(((integer)data))
+
            {
+
                 llPlaySound(Doorbell, 1.0);
+
                llInstantMessage(owner, (llKey2Name(bell_id) + " is at the door"));
+
 
             }
 
             }
         }
+
         } else if ( id == nc_line_id ) {
    }
+
            owner_knows = FALSE;
    link_message(integer sender, integer num, string str, key id)
+
            current_alts = trimList( llParseString2List( data = cleanString( data ), [ "|" ], [] ) );
    {
+
             if ( llGetListLength( current_alts ) > 1 ) {
        if(str == "MA" && num == dia_chan && id == owner)
+
                 current_word = llList2String( current_alts, 0 );
        aligned = FALSE;
+
                 current_alts = llList2List( current_alts, 1, -1 );
        else if(str == "IGAN")
+
            } else {
        {
+
                current_word = data;
             if(num == dia_chan && id == owner)
+
                current_alts = [];
            {
+
                 if(IGAN)
+
                 llMessageLinked(LINK_ALL_OTHERS, dia_chan, "IGAN", NCK);
+
 
             }
 
             }
             else
+
             if ( ~llSubStringIndex( current_word, " " ) ) {
            {
+
                 word_or_phrase = "phrase";
                NCN = ((string)id);
+
            } else {
                 whitelist = [];
+
                 word_or_phrase = "word";
                blacklist = [];
+
                 count_NCL = 0;
+
                NoNL = llGetNumberOfNotecardLines(NCN);
+
 
             }
 
             }
        }
+
            if ( llGetAgentSize( current_builder ) ) {
        else if(num == dia_chan && llGetSubString(str, 0, 5) == "homies" && id == owner && (sender == (mln + 1) | sender == (mln - 1)))
+
                llMessageLinked( LINK_THIS, 0, "Build your interpretation of the " + word_or_phrase + " \"" + current_word + "\".", current_builder );
        StringControl(llGetSubString(str, 6, -1), global, local, TRUE);
+
                publicListen();
        else if(num == dia_chan && llGetSubString(str, 0, 7) == "globules" && id == owner)
+
                announce( agentName( current_builder ) + " has been told the current " + word_or_phrase + " and is starting their build." );
        StringControl(llGetSubString(str, 8, -1), global, local, TRUE);
+
             } else {
        else if(num == dia_chan && str == owner_name && id == owner && (sender == (mln + 1) | sender == (mln - 1)))
+
                 mia( 0 );
        {
+
            if(DDD && (mln == 1))
+
            llHTTPRequest(my_url, [HTTP_METHOD, "POST"], "OTFD");
+
            OperateDoor(open, TRUE, FALSE, FALSE);
+
        }
+
        else if(num == dia_chan && str == "DSAH" && id == owner && (sender == (mln + 1) | sender == (mln - 1)))
+
        OperateDoor(open, TRUE, FALSE, FALSE);
+
        else if((sender == 1 | sender == 3) && str == "DOTHIS" && num == dia_chan)
+
        {
+
            if(id == my_key)
+
             {
+
                 url_count = 0;
+
                ruid = llRequestURL();
+
 
             }
 
             }
            else if((mln == 1 | mln == 3) && (!DTB))
 
            llRequestPermissions(owner, PERMISSION_CHANGE_LINKS);
 
        }
 
        else if(((sender == 4 && mln == 1) | (sender == 2 && mln == 3)) && num == dia_chan && id == owner)
 
        {
 
            my_url = str;
 
            if(permission)
 
            {
 
                if(mln == 1)
 
                llMessageLinked(3, dia_chan, "GFI", owner);
 
                else
 
                llMessageLinked(1, dia_chan, "GFI", owner);
 
                DDD = TRUE;
 
            }
 
        }
 
        else if(((sender == 1 && mln == 3) | (sender == 3 && mln == 1)) && num == dia_chan && id == owner && str == "GFI")
 
        {
 
            llBreakAllLinks();
 
            llCreateLink(my_buddy, TRUE);
 
            DDD = TRUE;
 
 
         }
 
         }
 
     }
 
     }
     http_request(key q, string m, string b)
+
     timer() {
    {
+
         removeListen( private_listen_id );
         if(q == ruid)
+
        {
+
            if(m == URL_REQUEST_GRANTED)
+
            {
+
                my_url = b;
+
                DDDC = TRUE;
+
                if(mln == 4)
+
                {
+
                    addressee = (((string)llGetLinkKey(1)) + "@lsl.secondlife.com");
+
                    llMessageLinked(1, dia_chan, my_url, owner);
+
                }
+
                else
+
                {
+
                    addressee = (((string)llGetLinkKey(3)) + "@lsl.secondlife.com");
+
                    llMessageLinked(3, dia_chan, my_url, owner);
+
                }
+
            }
+
            else if(m == URL_REQUEST_DENIED && ((url_count++) < 3))
+
            ruid = llRequestURL();
+
            else
+
            llInstantMessage(owner, "Something has gone horribly wrong!!\nPlease reset all scripts and start again.");
+
        }
+
        else if(q == rrruid)
+
        llEmail(addressee, b, "");
+
        else if(b == "OTFD")
+
        OperateDoor(open, FALSE, TRUE, FALSE);
+
 
     }
 
     }
     email(string t, string a, string su, string m, integer n)
+
}</syntaxhighlight>
    {
+
 
         emile = FALSE;
+
==== Secondary script ====
        llSetTimerEvent(0.0);
+
This should go in the same prim as the script above. It works around a messaging delay.
        my_url = su;
+
<syntaxhighlight lang="lsl2">// V1 //
 +
 
 +
default {
 +
     link_message( integer link, integer val, string txt, key id ) {
 +
         llInstantMessage( id, txt );
 
     }
 
     }
    touch(integer nd)
+
}</syntaxhighlight>
    {
+
 
        ++t_count;
+
==== Example Notecards ====
        if(t_count >= 10)
+
===== Words (no alts) =====
        {
+
Copied from a list found at [http://www.manythings.org/vocabulary/lists/l/words.php?f=ogden-picturable manythings.org].
            key id = llDetectedKey(0);
+
<pre>angle
            TouchMeAllOver(id, TRUE, FALSE);
+
ant
        }
+
apple
    }
+
arch
    touch_end(integer nd)
+
arm
    {
+
army
        key id = llDetectedKey(0);
+
baby
        TouchMeAllOver(id, FALSE, TRUE);
+
bag
    }
+
ball
    timer()
+
band
    {
+
basin
        if(emile)
+
basket
        llGetNextEmail("", "");
+
bath
        else
+
bed
        {
+
bee
            llSetTimerEvent(0.0);
+
bell
            llListenRemove(dia_lis);
+
berry
            OperateDoor(open, FALSE, FALSE, TRUE);
+
bird
        }
+
blade
+
board
    }
+
boat
    changed(integer change)
+
bone
    {
+
book
        if(change & CHANGED_INVENTORY)
+
boot
        {
+
bottle
            IGAN = FALSE;
+
box
            Whitelist(NULL_KEY);
+
boy
        }
+
brain
        else if(change & CHANGED_LINK)
+
brake
        {
+
branch
            if(llAvatarOnSitTarget())
+
brick
            {
+
bridge
                sat_on = TRUE;
+
brush
                return;
+
bucket
            }
+
bulb
            else
+
button
            {
+
cake
                if(sat_on)
+
camera
                {
+
card
                    sat_on = FALSE;
+
cart
                    return;
+
carriage
                }
+
cat
            }
+
chain
            llSleep(1.0);
+
cheese
            if(DDD)
+
chest
            llCreateLink(my_buddy, TRUE);
+
chin
            nop = llGetNumberOfPrims();
+
church
            mln = llGetLinkNumber();
+
circle
            my_key = llGetLinkKey(mln);
+
clock
            GetAligned(nop, mln);
+
cloud
            Whitelist(NULL_KEY);
+
coat
        }
+
collar
        else if(change & CHANGED_REGION_START)
+
comb
        {
+
cord
            if(DDDC)
+
cow
            rrruid = llRequestURL();
+
cup
            else if(DDD)
+
curtain
            {
+
cushion
                emile = TRUE;
+
dog
                llSetTimerEvent(5.0);
+
door
            }
+
drain
        }
+
drawer
    }
+
dress
}</syntaxhighlight>}}
+
drop
 +
ear
 +
egg
 +
engine
 +
eye
 +
face
 +
farm
 +
feather
 +
finger
 +
fish
 +
flag
 +
floor
 +
fly
 +
foot
 +
fork
 +
fowl
 +
frame
 +
garden
 +
girl
 +
glove
 +
goat
 +
gun
 +
hair
 +
hammer
 +
hand
 +
hat
 +
head
 +
heart
 +
hook
 +
horn
 +
horse
 +
hospital
 +
house
 +
island
 +
jewel
 +
kettle
 +
key
 +
knee
 +
knife
 +
knot
 +
leaf
 +
leg
 +
library
 +
line
 +
lip
 +
lock
 +
map
 +
match
 +
monkey
 +
moon
 +
mouth
 +
muscle
 +
nail
 +
neck
 +
needle
 +
nerve
 +
net
 +
nose
 +
nut
 +
office
 +
orange
 +
oven
 +
parcel
 +
pen
 +
pencil
 +
picture
 +
pig
 +
pin
 +
pipe
 +
plane
 +
plate
 +
plow
 +
pocket
 +
pot
 +
potato
 +
prison
 +
pump
 +
rail
 +
rat
 +
receipt
 +
ring
 +
rod
 +
roof
 +
root
 +
sail
 +
school
 +
scissors
 +
screw
 +
seed
 +
sheep
 +
shelf
 +
ship
 +
shirt
 +
shoe
 +
skin
 +
skirt
 +
snake
 +
sock
 +
spade
 +
sponge
 +
spoon
 +
spring
 +
square
 +
stamp
 +
star
 +
station
 +
stem
 +
stick
 +
stocking
 +
stomach
 +
store
 +
street
 +
sun
 +
table
 +
tail
 +
thread
 +
throat
 +
thumb
 +
ticket
 +
toe
 +
tongue
 +
tooth
 +
town
 +
train
 +
tray
 +
tree
 +
trousers
 +
umbrella
 +
wall
 +
watch
 +
wheel
 +
whip
 +
whistle
 +
window
 +
wing
 +
wire
 +
worm</pre>
 +
 
 +
===== Phrases (with alts) =====
 +
Extensively reworked from a list found at [http://www.phrases.org.uk/meanings/phrases-and-sayings-list.html phrases.org.uk].
 +
<pre>a bird in the hand is worth two in the bush
 +
drop in the ocean | a drop in the ocean
 +
fly in the ointment | a fly in the ointment
 +
nest of vipers | a nest of vipers
 +
no-brainer | a no-brainer
 +
pig in a poke | a pig in a poke
 +
a place for everything and everything in its place
 +
rolling stone gathers no moss | a rolling stone gathers no moss
 +
sight for sore eyes | a sight for sore eyes
 +
stone's throw | a stone's throw
 +
turn up for the books | a turn up for the books
 +
wolf in sheep's clothing | a wolf in sheep's clothing
 +
a woman needs a man like a fish needs a bicycle
 +
two peas in a pod | alike as two peas in a pod | like two peas in a pod
 +
alive and kicking | alive and kickin'
 +
fingers and thumbs | all fingers and thumbs
 +
all that glitters is not gold | all that glisters is not gold
 +
all things come to he who waits | all thing come to those who wait | all thing come to those that wait
 +
all things must pass
 +
an apple a day keeps the doctor away
 +
arm and a leg | an arm and a leg | costs an arm and a leg | it costs an arm and a leg
 +
axe to grind | an axe to grind | one has an axe to grind | i have an axe to grind | you have an axe to grind
 +
englishman's home is his castle | an englishman's home is his castle
 +
ill wind | an ill wind | an ill wind bloweth | an ill wind that blows
 +
apple of my eye | the apple of my eye
 +
bald as a coot | as bald as a coot
 +
brown as a berry | as brown as a berry
 +
cool as a cucumber | as cool as a cucumber
 +
daft as a brush | as daft as a brush
 +
dead as a dodo | as dead as a dodo
 +
dead as a doornail | as dead as a doornail
 +
easy as pie | as easy as pie
 +
grease lightning | greased lightning | fast as greased lightning | as fast as greased lightning
 +
fit as a fiddle | as fit as a fiddle
 +
mad as a hatter | as mad as a hatter
 +
pure as the driven snow | as pure as the driven snow
 +
safe as houses | as safe as houses
 +
snug as a bug in a rug | as snug as a bug in a rug
 +
straight as a die | as straight as a die
 +
as the crow flies
 +
ashes to ashes | ashes to ashes, dust to dust | ashes to ashes and dust to dust | ashes to ashes, funk to funky
 +
back-seat driver
 +
back to square one
 +
back to the drawing board
 +
balance of power | the balance of power
 +
wouldn't touch with a barge-pole | wouldn't touch it with a barge-pole | i wouldn't touch it with a barge-pole
 +
barking up the wrong tree | you're barking up the wrong tree
 +
beauty is in the eye of the beholder | beauty's in the eye of the beholder
 +
beauty is skin deep | beauty is only skin deep | beauty's skin deep | beauty's only skin deep
 +
bed of roses | a bed of roses | the bed of roses
 +
bee in your bonnet | a bee in your bonnet
 +
bee's knees | the bee's knees | bees knees | the bees knees
 +
behind every great man there's a great woman
 +
below the belt | hit below the belt | a bit below the belt
 +
bells and whistles
 +
belt and braces
 +
best laid schemes of mice and men | the best laid schemes of mice and men | best laid plans of mice and men | the best laid plans of mice and men
 +
bet your bottom dollar | you can bet your bottom dollar
 +
between a rock and a hard place
 +
between the devil and the deep blue sea
 +
beware of greeks bearing gifts | beware greeks bearing gifts
 +
big apple | the big apple
 +
big cheese | the big cheese
 +
big easy | the big easy
 +
big fish in a small pond | a big fish in a small pond
 +
birds of a feather flock together
 +
bite the bullet | biting the bullet
 +
bite the dust | biting the dust
 +
bitter end | the bitter end | to the bitter end | till the bitter end | bitter ending | the bitter ending
 +
black sheep of the family | the black sheep of the family
 +
blast from the past | a blast from the past
 +
blind leading the blind | the blind leading the blind
 +
blonde bombshell | blond bombshell
 +
blood is thicker than water
 +
blood, sweat and tears
 +
big for your boots | too big for your boots | big for one's boots | too big for one's boots
 +
born with a silver spoon in one's mouth | born with a silver spoon in your mouth
 +
break a leg
 +
break the ice | breaking the ice
 +
bring home the bacon | bringing home the bacon | bring the bacon home | bringing the bacon home
 +
if it ain't broke, don't fix it | if it isn't broke don't fix it | if it ain't broken, don't fix it | if it isn't broken don't fix it
 +
buck stops here | the buck stops here
 +
burn the candle at both ends | burning the candle at both ends
 +
burn the midnight oil | burning the midnight oil
 +
bury the hatchet | burying the hatchet
 +
bury your head in the sand | burying your head in the sand | bury one's head in the sand | burying one's head in the sand
 +
busy bee | busy as a bee | as busy as a bee
 +
by hook or by crook
 +
cart before the horse | put the cart before the horse | putting the cart before the horse
 +
let the cat out of the bag
 +
catch 22 | catch22 | catch twenty two | catch twentytwo
 +
weakest link | the weakest link | a chain is only as strong as its weakest link
 +
chip off the old block | a chip off the old block
 +
chip on your shoulder
 +
cloak and dagger
 +
close, but no cigar
 +
cloud nine | on cloud nine
 +
comes to the crunch | if it comes to the crunch | when it comes to the crunch
 +
crack of dawn | the crack of dawn
 +
crocodile tears
 +
curiosity killed the cat
 +
darkest hour is just before the dawn | the darkest hour is just before the dawn
 +
diamond in the rough | a diamond in the rough
 +
chalk and cheese | like chalk and cheese | different as chalk and cheese | as different as chalk and cheese
 +
don't look a gift horse in the mouth
 +
don't throw the baby out with the bathwater
 +
early bird catches the worm | the early bird catches the worm
 +
elephant in the room | an elephant in the room | the elephant in the room
 +
ends of the earth | the ends of the earth
 +
every cloud has a silver lining
 +
exception that proves the rule | the exception that proves the rule | an exception that proves the rule
 +
face the music | facing the music
 +
feather in one's cap | a feather in one's cap | feather in your cap | a feather in your cap
 +
off the back of a truck | fell off the back of a truck | it fell off the back of a truck
 +
fight fire with fire | fighting fire with fire
 +
fish out of water | a fish out of water | like a fish out of water
 +
flogging a dead horse
 +
foot in the door | a foot in the door | one foot in the door
 +
four corners of the earth | the four corners of the earth
 +
freeze the balls off a brass monkey | cold enough to freeze the balls off a brass monkey | brass monkey weather
 +
frog in the throat | a frog in the throat
 +
game is afoot | the game is afoot
 +
down to brass tacks | get down to brass tacks
 +
with a grain of salt | take with a grain of salt | take it with a grain of salt | with a pinch of salt | take with a pinch of salt | take it with a pinch of salt
 +
great minds think alike
 +
hand over fist | making money hand over fist | make money hand over fist | losing money hand over fist | lose money hand over fist
 +
through the grapevine | heard it through the grapevine | i heard it through the grapevine
 +
if you can't stand the heat, get out of the kitchen | if you can't stand the heat, stay out of the kitchen
 +
jump the gun | jumping the gun
 +
kick the bucket | kicked the bucket
 +
last but not least
 +
can't teach an old dog new tricks | cannot teach an old dog new tricks | you can't teach an old dog new tricks | you cannot teach an old dog new tricks
 +
leopard cannot change its spots | leopard can't change its spots | a leopard cannot change its spots | a leopard can't change its spots
 +
moth to a flame | a moth to a flame | like a moth to a flame
 +
two peas in a pod | like two peas in a pod
 +
mad as a hatter
 +
mighty oaks from little acorns grow
 +
my cup runneth over
 +
nest of vipers | a nest of vipers
 +
in the nick of time | just in the nick of time
 +
on the shoulders of giants | standing on the shoulders of giants
 +
on the wagon
 +
once in a blue moon
 +
out of sight, out of mind
 +
over the moon
 +
pass the buck | passing the buck | passed the buck
 +
pearls before swine | do not give what is holy to the dogs; nor cast your pearls before swine, lest they trample them under their feet, and turn and tear you in pieces
 +
picture is worth a thousand words | a picture is worth a thousand words
 +
piece of cake | a piece of cake
 +
pigs might fly
 +
red-handed | caught red-handed
 +
red herring | a red herring
 +
red in tooth and claw | nature is red in tooth and claw | nature's red in tooth and claw
 +
red rag to a bull | a red rag to a bull
 +
rolling stone gathers no moss | a rolling stone gathers no moss
 +
teeth on edge | set your teeth on edge | sets your teeth on edge
 +
skeleton in the closet | a skeleton in the closet
 +
sledgehammer to crack a nut | a sledgehammer to crack a nut | using a sledgehammer to crack a nut
 +
something old, something new, something borrowed, something blue
 +
spill the beans
 +
spin doctor
 +
storm in a teacup
 +
straight from the horse's mouth
 +
apple of my eye | the apple of my eye
 +
balance of power | the balance of power
 +
big apple | the big apple
 +
birds and the bees | the birds and the bees | birds and bees | the birds and bees
 +
elephant in the room | the elephant in the room | an elephant in the room
 +
ends of the earth | the ends of the earth | end of the earth | the end of the earth
 +
pen is mightier than the sword | the pen is mightier than the sword
 +
salt of the earth | the salt of the earth
 +
upper hand | the upper hand
 +
two heads are better than one
 +
under the thumb | under your thumb
 +
keep it under your hat
 +
up shit creek without a paddle
 +
watched pot never boils | a watched pot never boils | watched kettle never boils | a watched kettle never boils
 +
wolf in sheep's clothing | a wolf in sheep's clothing
 +
wrong end of the stick | the wrong end of the stick</pre>}}

Revision as of 17:39, 3 April 2017

I get in-world very rarely these days. The knock-on effect of this, is that I am not in the best position to keep these scripts updated. Please message me in-world (forwarded to email) if you discover any bugs (that can't be simply fixed), and I'll do my best to find a solution.

My Contributions

If unsure about how to use these scripts

I have implemented a version number system to make it more obvious if a script is updated. The V# is a comment at the top of each script.

If you have any comments about the content of this page please post them HERE

All my scripts are written for compilation as MONO

More Scripts

Legal Stuff

The legal stuff about contributing to this wiki. (worth reading)

PJIRA Issue Tracker

The issues I have filed on the PJIRA

Tuition

Tuition scripts, notes, videos and screenshots etc. (hardly any content yet)

Free Scripts

Online Status Display & Pager

This will display the owners profile picture and a color coded and text texture sign that changes depending on the owners online status.

Just drop the script into a fresh prim.

// V1 //
 
key owner_id; // Use to store the UUID of the owner to save having to keep asking.
 
string owner_name; // Use to store the name of the owner to save having to keep asking.
 
// This a UUID of a texture I created to show either the word "ONLINE" or "OFFLINE".
key ON_OFF_line = "124cfcec-6b8d-552c-42b8-6a1179884e74";
 
// This is added to the owner UUID to make an HTTP request for the owners profile image UUID.
string profile_url = "http://world.secondlife.com/resident/";
 
key name_id; // This key is used to recognize the dataserver request if it is for the name of the owner.
 
key online_id; // This key is used to recognize the dataserver request if it is made automatically.
 
key touch_request_id; // This key is used to recognize the dataserver request if it is made by a user.
 
key update_id; // Used to verify that the HTTP request is for an update of the profile texture.
 
integer lis; // This is used to store the value of a listen and to remove it when not needed.
 
integer channel; // This is used to store the value of the listen channel.
 
key requester; // This is used to store the name of a user who asks to page the owner.
 
string date; // Used to store the date (just in case you couldn't guess).
 
OnlineStatus(integer ol, integer tr) // This function carries two integer type pieces of info.
{ // integer ol is the the boolean online data. 1 for online and zero for offline.
  // integer tr is also boolean. It carries whether the function is being called by a user or automatically.
    list ol_params = []; // This is a local list creation.
    if(ol) // If the owner is online...
    ol_params = [17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.375,0.0>, (90*DEG_TO_RAD), // ..list the object parameters for displaying ONLINE.
                 18, 5, <0.0,1.0,0.0>, 1.0,
                 18, 6, <1.0,1.0,1.0>, 1.0];
    else // If not...
    ol_params = [17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.625,0.0>, (90*DEG_TO_RAD), // ..list the object parameters for displaying OFFLINE.
                 18, 5, <1.0,0.0,0.0>, 1.0,
                 18, 6, <0.5,0.5,0.5>, 1.0];
    llSetPrimitiveParams(ol_params); // Set the object parameters to show whatever the list is.
    if(tr) // If this was a touch request...
    {
        llSetTimerEvent(30.0); // Prepare to be ignored (we need to switch the listen off if we are ignored).
        if(ol) // If the owner is online...
        {
            lis = llListen(channel, "", requester, ""); // Open a listen for the user who made the request.
            llDialog(requester, ("\nWould you like to page " + owner_name + "?"), ["YES", "NO"], channel); // Send them a dialog.
        }
        else // If not...
        llInstantMessage(requester, (owner_name + " is currently offline.")); // Send a message explaining that the owner is offline.
    }
}
 
default // Create an area for the events to play in. This is called a "state".
{
    state_entry() // On state entry...
    {
        owner_id = llGetOwner(); // Get the owner UUID (key) and store it.
        name_id = llRequestAgentData(owner_id, DATA_NAME); // Make a request for the owners name.
        channel = -5647; // Set a channel to use for the dialog.
    }
    dataserver(key q, string data) // Triggered when a reply to a data request is recieved.
    {
        if(q == name_id) // Check the id of the request.
        {
            owner_name = data; // Store the result.
            llSetObjectName(owner_name + "'s Online Status"); // Set the name of the object to the owner name + "'s Online Status".
            llHTTPRequest((profile_url + ((string)owner_id)), [], ""); // Request the UUID of the owners profile.
        }
        else if(q == online_id) // Check the id of the request.
        OnlineStatus(((integer)data), FALSE); // Call the OnlineStatus function for an automatic return.
        else if(q == touch_request_id) // Check the id of the request.
        OnlineStatus(((integer)data), TRUE); // Call the OnlineStatus function for a touch-by-user return.
    }
    http_response(key q, integer status, list metadata, string body) // Triggered when a response for an HTTP request is recieved.
    {
        integer tex_key_start = (llSubStringIndex(body, "imageid") + 18); // Establish the point where the image UUID is written in the page.
        integer tex_key_end = (tex_key_start + 35); // Establish the point where the image UUID ends.
        key profile_image = ((key)llGetSubString(body, tex_key_start, tex_key_end)); // Store the the profile image UUID found.
        if(q != update_id) // Check the source of the request.
        {
            llSetPrimitiveParams([9, 0, 0, <0.6,0.875,0.0>, 0.02, ZERO_VECTOR, <1.0,1.0,0.0>, ZERO_VECTOR, // Shape the object...
                                  8, llEuler2Rot(<0.0,90.0,0.0>*DEG_TO_RAD),
                                  7, <0.85,0.01,0.6>,
                                  17, -1, TEXTURE_BLANK, <1.0,1.0,0.0>, ZERO_VECTOR, 0.0,
                                  18, -1, ZERO_VECTOR, 1.0]); // ...and texture it with the owners profile image and...
            llSetPrimitiveParams([17, 6, profile_image, <1.0,1.0,0.0>, ZERO_VECTOR, (90*DEG_TO_RAD),
                                  17, 5, ON_OFF_line, <1.4,0.25,0.0>, <0.0,0.375,0.0>, (90*DEG_TO_RAD), // the ON/OFFline texture.
                                  19, 5, 0, 1,
                                  18, 6, <1.0,1.0,1.0>, 1.0,
                                  18, 5, <0.0,1.0,0.0>, 1.0,
                                  20, 5, 1,
                                  20, 6, 1]);
            llSetTimerEvent(0.1); // Move to the timer quickly to run the first OnlineStatus check.
        }
        else
        llSetPrimitiveParams([17, 6, profile_image, <1.0,1.0,0.0>, ZERO_VECTOR, (90*DEG_TO_RAD)]); // Apply the updated profile texture.
    }
    timer() // Triggered if a timer event is set to a non zero amount.
    {
        llSetTimerEvent(10.0); // Reset the timer event to trigger every 10 seconds.
        llListenRemove(lis); // Always remove any listen we have open.
        online_id = llRequestAgentData(owner_id, DATA_ONLINE); // So every 10 seconds we check if the owner is online.
        string t_date = llGetDate(); // Find out what the date is.
        if(t_date != date) // Check if the date has changed. If it has...
        {
            date = t_date; // ...store the date so the next check to return true will be roughly 24 hours later.
            update_id = llHTTPRequest((profile_url + ((string)owner_id)), [], ""); // Request an update of the UUID of the owners profile.
        }
    }
    touch_start(integer nd) // Triggered on clicking the object that contains the script.
    {
        llSetTimerEvent(0.0); // Stop the timer.
        requester = llDetectedKey(0); // Store the UUID of the person who touched us.
        touch_request_id = llRequestAgentData(owner_id, DATA_ONLINE); // Request the online status of the owner before issuing any dialogs.
    } // We do this becuse if the owner went offline 9 seconds ago we wouldn't know.
    listen(integer chan, string name, key id, string msg) // Triggered when all the specified info is recieved by the script if it has a listen open.
    {
        llListenRemove(lis); // Remove the listen.
        llSetTimerEvent(10.0); // Set the timer to run automatically.
        if(msg == "YES") // If the toucher wants to page the owner (the owner must be online)...
        { // Instant message the owner with a link that when clicked will bring up the touchers profile. This saves searching for the touchers profile.
            llInstantMessage(owner_id, ("secondlife:///app/agent/" + ((string)requester) + "/about has requested to message you."));
            llInstantMessage(requester, owner_name + " has been paged."); // Inform the toucher that the owner has been paged.
        }
    }
}

What's my Build?

A simple but fun game for groups to play. Players take turns building their interpretation of a suggested word or phrase, then the other players make guesses in local chat until one is correct. The player who correctly guesses what is being built becomes the new builder and the game continues.

  • Up to 9 notecards containing lists of words or phrases can be added.
    • One word or phrase per line.
    • No empty lines.
    • Add alternative spellings (i.e. "colour" and "color") or meanings (i.e. "truck", "lorry" and "van") together on the same line, separated by pipes (this is a pipe --> "|").
    • Punctuation listed in the script will be stripped from the words and phrases.
      • Unfortunately, LSL has no RegEx and as such it is impractical to except alternatives that aren't explicitly added to the cards. An LSL parser capable of regex like deduction would be horrible, so without utilising a remote server (a possible update), the alternatives need to cover everything reasonable to expect. There is an option for the owner to be told the word or phrase being built (after which they will be excluded from that round), and it's recommended if the script is reading from a card containing potentially contentious phrases with many possible alternatives.
  • Menu operated from touch.
  • Two scripts; one is tiny.

Main script

// V1 - Hardly tested //
 
key owner;
key nc_line_id;
key num_of_nc_lines_id;
key current_builder = NULL_KEY;
 
integer query_id;
integer channel;
integer num_of_ncs;
integer private_listen_id;
integer public_listen_id;
integer line_index;
integer owner_knows;
 
string notecard;
string current_word;
string word_or_phrase;
 
list notecards;
list dialog_list;
list shuffled_line_numbers;
list current_alts;
list punctuation = [ ".", ",", "!", "?", ";", ":", "-", "\"" ]; // Must not contain pipes --> |
 
integer frequency() {
    channel = ( integer )( llFrand( -1073741824.0 ) - 1073741824.0 );
    return channel;
}
 
removeListen( integer id ) {
    llListenRemove( id );
    if ( id == private_listen_id ) {
        llSetTimerEvent( 0.0 );
    }
}
 
ownerDialog( string msg ) {
    if ( msg == "" ) {
        msg = "Select a notecard, hear the current " + word_or_phrase + " or reset the game.";
    }
    private_listen_id = llListen( channel = frequency(), llKey2Name( owner ), owner, "" );
    llDialog( owner, "\n" + msg, [ "CANCEL", llList2String( [ "START", "TELL" ], current_word != "" ), "RESET" ] + dialog_list, channel );
    llSetTimerEvent( 20.0 );
}
 
publicListen() {
    public_listen_id = llListen( PUBLIC_CHANNEL, "", "", "" );
}
 
getLine() {
    nc_line_id = llGetNotecardLine( notecard, --line_index );
    if ( !line_index ) {
        ownerDialog( "We've reached the end of the last notecard; please select another to continue." );
    }
}
 
announce( string str ) {
    llSay( PUBLIC_CHANNEL, str );
}
 
string agentName( key id ) {
    string name = llGetDisplayName( id );
    if ( name == "" ) {
        name = llKey2Name( id );
    }
    return name;
}
 
mia( integer index ) {
    removeListen( public_listen_id );
    key temp_builder = current_builder;
    string temp_word = current_word;
    current_builder = NULL_KEY;
    current_word = "";
    announce( llList2String( [ "The current builder", agentName( temp_builder ) ], index ) + " has " +
              llList2String( [ "left the region", "given the game away" ], index ) +
              ", so a new builder must take their place by touching me.\nThe " + word_or_phrase + " was \"" + temp_word + "\"." );
}
 
string trim( string str ) {
    return llStringTrim( str, STRING_TRIM );
}
 
string dL2S( list lst ) {
    return llDumpList2String( lst, " " );
}
 
string cleanString( string str ) {
  return llToLower( trim( dL2S( llParseString2List( dL2S( llParseString2List( str, punctuation, [] ) ), [ "  " ], [] ) ) ) );  
}
 
list trimList( list lst ) {
    integer length = llGetListLength( lst );
    while ( length ) {
        --length;
        lst = llListReplaceList( lst, [ trim( llList2String( lst, length ) ) ], length, length );
    }
    return lst;
}
 
integer ncNoBuilder() {
    return notecard != "" && current_builder == NULL_KEY;
}
 
start( key id ) {
    current_builder = id;
    getLine();
}
 
default {
    on_rez( integer param ) {
        llResetScript();
    }
    changed( integer change ) {
        if ( change & ( CHANGED_OWNER | CHANGED_INVENTORY ) ) {
            llResetScript();
        }
    }
    state_entry() {
        owner = llGetOwner();
        num_of_ncs = llGetInventoryNumber( INVENTORY_NOTECARD );
        if ( num_of_ncs ) {
            string nc;
            while ( num_of_ncs ) {
                notecards += [ nc = llGetInventoryName( INVENTORY_NOTECARD, --num_of_ncs ) ];
                dialog_list += [ llGetSubString( nc, 0, 23 ) ];
            }
            ownerDialog( "" );
        }
    }
    touch_start( integer nd ) {
        key toucher;
        while ( nd ) {
            toucher = llDetectedKey( --nd );
            if ( toucher == owner ) {
                ownerDialog( "" );
            } else if ( ncNoBuilder() ) {
                start( toucher );
            }
        }
    }
    listen( integer chan, string name, key id, string msg ) {
        if ( chan && id == owner ) {
            removeListen( private_listen_id );
            if ( msg != "CANCEL" ) {
                integer index;
                if ( msg == "RESET" ) {
                    llResetScript();
                } else if ( msg == "START" ) {
                    if ( notecard == "" ) {
                        ownerDialog( "You need to select a notecard to play with first." );
                    } else if ( current_builder ) {
                        ownerDialog( llKey2Name( current_builder ) + " has already started the game." );
                    } else {
                        start( owner );
                    }
                } else if ( msg == "TELL" ) {
                    owner_knows = TRUE;
                    llOwnerSay( current_word );
                } else if ( ~( index = llListFindList( dialog_list, [ msg ] ) ) ) {
                    num_of_nc_lines_id = llGetNumberOfNotecardLines( notecard = llList2String( notecards, index ) );
                }
            }
        } else {
            if ( llGetAgentSize( current_builder ) ) {
                msg = cleanString( msg );
                integer alt_index;
                if ( msg == current_word || ( llGetListLength( current_alts ) && ~( alt_index = llListFindList( current_alts, [ msg ] ) ) ) ) {
                    if ( id != owner || ( id == owner && !owner_knows ) ) {
                        if ( id != current_builder ) {
                            removeListen( public_listen_id );
                            if ( ~alt_index ) {
                                current_word = current_word + "\", alternatively known as \"" + msg;
                            }
                            announce( agentName( current_builder = id ) + " has correctly guessed that the " + word_or_phrase + " being built was \"" + current_word + "\"." );
                            getLine();
                        } else {
                            mia( 1 );
                        }
                    }
                }
            } else {
                mia( 0 );
            }
        }
    }
    dataserver( key id, string data ) {
        if ( id == num_of_nc_lines_id ) {
            integer num_of_nc_lines = ( integer )data;
            line_index = num_of_nc_lines;
            while ( num_of_nc_lines ) {
                shuffled_line_numbers += [ --num_of_nc_lines ];
            }
            shuffled_line_numbers = llListRandomize( shuffled_line_numbers, 1 );
            if ( ncNoBuilder() ) {
                announce( "Will the first builder please start the game by touching me?" );
            }
        } else if ( id == nc_line_id ) {
            owner_knows = FALSE;
            current_alts = trimList( llParseString2List( data = cleanString( data ), [ "|" ], [] ) );
            if ( llGetListLength( current_alts ) > 1 ) {
                current_word = llList2String( current_alts, 0 );
                current_alts = llList2List( current_alts, 1, -1 );
            } else {
                current_word = data;
                current_alts = [];
            }
            if ( ~llSubStringIndex( current_word, " " ) ) {
                word_or_phrase = "phrase";
            } else {
                word_or_phrase = "word";
            }
            if ( llGetAgentSize( current_builder ) ) {
                llMessageLinked( LINK_THIS, 0, "Build your interpretation of the " + word_or_phrase + " \"" + current_word + "\".", current_builder );
                publicListen();
                announce( agentName( current_builder ) + " has been told the current " + word_or_phrase + " and is starting their build." );
            } else {
                mia( 0 );
            }
        }
    }
    timer() {
        removeListen( private_listen_id );
    }
}

Secondary script

This should go in the same prim as the script above. It works around a messaging delay.

// V1 //
 
default {
    link_message( integer link, integer val, string txt, key id ) {
        llInstantMessage( id, txt );
    }
}

Example Notecards

Words (no alts)

Copied from a list found at manythings.org.

angle
ant
apple
arch
arm
army
baby
bag
ball
band
basin
basket
bath
bed
bee
bell
berry
bird
blade
board
boat
bone
book
boot
bottle
box
boy
brain
brake
branch
brick
bridge
brush
bucket
bulb
button
cake
camera
card
cart
carriage
cat
chain
cheese
chest
chin
church
circle
clock
cloud
coat
collar
comb
cord
cow
cup
curtain
cushion
dog
door
drain
drawer
dress
drop
ear
egg
engine
eye
face
farm
feather
finger
fish
flag
floor
fly
foot
fork
fowl
frame
garden
girl
glove
goat
gun
hair
hammer
hand
hat
head
heart
hook
horn
horse
hospital
house
island
jewel
kettle
key
knee
knife
knot
leaf
leg
library
line
lip
lock
map
match
monkey
moon
mouth
muscle
nail
neck
needle
nerve
net
nose
nut
office
orange
oven
parcel
pen
pencil
picture
pig
pin
pipe
plane
plate
plow
pocket
pot
potato
prison
pump
rail
rat
receipt
ring
rod
roof
root
sail
school
scissors
screw
seed
sheep
shelf
ship
shirt
shoe
skin
skirt
snake
sock
spade
sponge
spoon
spring
square
stamp
star
station
stem
stick
stocking
stomach
store
street
sun
table
tail
thread
throat
thumb
ticket
toe
tongue
tooth
town
train
tray
tree
trousers
umbrella
wall
watch
wheel
whip
whistle
window
wing
wire
worm
Phrases (with alts)

Extensively reworked from a list found at phrases.org.uk.

a bird in the hand is worth two in the bush
drop in the ocean | a drop in the ocean
fly in the ointment | a fly in the ointment
nest of vipers | a nest of vipers
no-brainer | a no-brainer
pig in a poke | a pig in a poke
a place for everything and everything in its place
rolling stone gathers no moss | a rolling stone gathers no moss
sight for sore eyes | a sight for sore eyes
stone's throw | a stone's throw
turn up for the books | a turn up for the books
wolf in sheep's clothing | a wolf in sheep's clothing
a woman needs a man like a fish needs a bicycle
two peas in a pod | alike as two peas in a pod | like two peas in a pod
alive and kicking | alive and kickin'
fingers and thumbs | all fingers and thumbs
all that glitters is not gold | all that glisters is not gold
all things come to he who waits | all thing come to those who wait | all thing come to those that wait
all things must pass
an apple a day keeps the doctor away
arm and a leg | an arm and a leg | costs an arm and a leg | it costs an arm and a leg
axe to grind | an axe to grind | one has an axe to grind | i have an axe to grind | you have an axe to grind
englishman's home is his castle | an englishman's home is his castle
ill wind | an ill wind | an ill wind bloweth | an ill wind that blows
apple of my eye | the apple of my eye
bald as a coot | as bald as a coot
brown as a berry | as brown as a berry
cool as a cucumber | as cool as a cucumber
daft as a brush | as daft as a brush
dead as a dodo | as dead as a dodo
dead as a doornail | as dead as a doornail
easy as pie | as easy as pie
grease lightning | greased lightning | fast as greased lightning | as fast as greased lightning
fit as a fiddle | as fit as a fiddle
mad as a hatter | as mad as a hatter
pure as the driven snow | as pure as the driven snow
safe as houses | as safe as houses
snug as a bug in a rug | as snug as a bug in a rug
straight as a die | as straight as a die
as the crow flies
ashes to ashes | ashes to ashes, dust to dust | ashes to ashes and dust to dust | ashes to ashes, funk to funky
back-seat driver
back to square one
back to the drawing board
balance of power | the balance of power
wouldn't touch with a barge-pole | wouldn't touch it with a barge-pole | i wouldn't touch it with a barge-pole
barking up the wrong tree | you're barking up the wrong tree
beauty is in the eye of the beholder | beauty's in the eye of the beholder
beauty is skin deep | beauty is only skin deep | beauty's skin deep | beauty's only skin deep
bed of roses | a bed of roses | the bed of roses
bee in your bonnet | a bee in your bonnet
bee's knees | the bee's knees | bees knees | the bees knees
behind every great man there's a great woman
below the belt | hit below the belt | a bit below the belt
bells and whistles
belt and braces
best laid schemes of mice and men | the best laid schemes of mice and men | best laid plans of mice and men | the best laid plans of mice and men
bet your bottom dollar | you can bet your bottom dollar
between a rock and a hard place
between the devil and the deep blue sea
beware of greeks bearing gifts | beware greeks bearing gifts
big apple | the big apple
big cheese | the big cheese
big easy | the big easy
big fish in a small pond | a big fish in a small pond
birds of a feather flock together
bite the bullet | biting the bullet
bite the dust | biting the dust
bitter end | the bitter end | to the bitter end | till the bitter end | bitter ending | the bitter ending
black sheep of the family | the black sheep of the family
blast from the past | a blast from the past
blind leading the blind | the blind leading the blind
blonde bombshell | blond bombshell
blood is thicker than water
blood, sweat and tears
big for your boots | too big for your boots | big for one's boots | too big for one's boots
born with a silver spoon in one's mouth | born with a silver spoon in your mouth
break a leg
break the ice | breaking the ice
bring home the bacon | bringing home the bacon | bring the bacon home | bringing the bacon home
if it ain't broke, don't fix it | if it isn't broke don't fix it | if it ain't broken, don't fix it | if it isn't broken don't fix it
buck stops here | the buck stops here
burn the candle at both ends | burning the candle at both ends
burn the midnight oil | burning the midnight oil
bury the hatchet | burying the hatchet
bury your head in the sand | burying your head in the sand | bury one's head in the sand | burying one's head in the sand
busy bee | busy as a bee | as busy as a bee
by hook or by crook
cart before the horse | put the cart before the horse | putting the cart before the horse
let the cat out of the bag
catch 22 | catch22 | catch twenty two | catch twentytwo
weakest link | the weakest link | a chain is only as strong as its weakest link
chip off the old block | a chip off the old block
chip on your shoulder
cloak and dagger
close, but no cigar
cloud nine | on cloud nine
comes to the crunch | if it comes to the crunch | when it comes to the crunch
crack of dawn | the crack of dawn
crocodile tears
curiosity killed the cat
darkest hour is just before the dawn | the darkest hour is just before the dawn
diamond in the rough | a diamond in the rough
chalk and cheese | like chalk and cheese | different as chalk and cheese | as different as chalk and cheese
don't look a gift horse in the mouth
don't throw the baby out with the bathwater
early bird catches the worm | the early bird catches the worm
elephant in the room | an elephant in the room | the elephant in the room
ends of the earth | the ends of the earth
every cloud has a silver lining
exception that proves the rule | the exception that proves the rule | an exception that proves the rule
face the music | facing the music
feather in one's cap | a feather in one's cap | feather in your cap | a feather in your cap
off the back of a truck | fell off the back of a truck | it fell off the back of a truck
fight fire with fire | fighting fire with fire
fish out of water | a fish out of water | like a fish out of water
flogging a dead horse
foot in the door | a foot in the door | one foot in the door
four corners of the earth | the four corners of the earth
freeze the balls off a brass monkey | cold enough to freeze the balls off a brass monkey | brass monkey weather
frog in the throat | a frog in the throat
game is afoot | the game is afoot
down to brass tacks | get down to brass tacks
with a grain of salt | take with a grain of salt | take it with a grain of salt | with a pinch of salt | take with a pinch of salt | take it with a pinch of salt
great minds think alike
hand over fist | making money hand over fist | make money hand over fist | losing money hand over fist | lose money hand over fist
through the grapevine | heard it through the grapevine | i heard it through the grapevine
if you can't stand the heat, get out of the kitchen | if you can't stand the heat, stay out of the kitchen
jump the gun | jumping the gun
kick the bucket | kicked the bucket
last but not least
can't teach an old dog new tricks | cannot teach an old dog new tricks | you can't teach an old dog new tricks | you cannot teach an old dog new tricks
leopard cannot change its spots | leopard can't change its spots | a leopard cannot change its spots | a leopard can't change its spots
moth to a flame | a moth to a flame | like a moth to a flame
two peas in a pod | like two peas in a pod
mad as a hatter
mighty oaks from little acorns grow
my cup runneth over
nest of vipers | a nest of vipers
in the nick of time | just in the nick of time
on the shoulders of giants | standing on the shoulders of giants
on the wagon
once in a blue moon
out of sight, out of mind
over the moon
pass the buck | passing the buck | passed the buck
pearls before swine | do not give what is holy to the dogs; nor cast your pearls before swine, lest they trample them under their feet, and turn and tear you in pieces
picture is worth a thousand words | a picture is worth a thousand words
piece of cake | a piece of cake
pigs might fly
red-handed | caught red-handed
red herring | a red herring
red in tooth and claw | nature is red in tooth and claw | nature's red in tooth and claw
red rag to a bull | a red rag to a bull
rolling stone gathers no moss | a rolling stone gathers no moss
teeth on edge | set your teeth on edge | sets your teeth on edge
skeleton in the closet | a skeleton in the closet
sledgehammer to crack a nut | a sledgehammer to crack a nut | using a sledgehammer to crack a nut
something old, something new, something borrowed, something blue
spill the beans
spin doctor
storm in a teacup
straight from the horse's mouth
apple of my eye | the apple of my eye
balance of power | the balance of power
big apple | the big apple
birds and the bees | the birds and the bees | birds and bees | the birds and bees
elephant in the room | the elephant in the room | an elephant in the room
ends of the earth | the ends of the earth | end of the earth | the end of the earth
pen is mightier than the sword | the pen is mightier than the sword
salt of the earth | the salt of the earth
upper hand | the upper hand
two heads are better than one
under the thumb | under your thumb
keep it under your hat
up shit creek without a paddle
watched pot never boils | a watched pot never boils | watched kettle never boils | a watched kettle never boils
wolf in sheep's clothing | a wolf in sheep's clothing
wrong end of the stick | the wrong end of the stick

More Scripts...

If you have any comments about the content of this page please post them HERE