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

From Second Life Wiki
Jump to navigation Jump to search
m (→‎My Contributions: Added thumb image)
(a couple of improvements and a major fix to the game script)
 
(64 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{LSL Header}}
{{User:Fred Gandt/Template|content=


{{RightToc|right;}}
== 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.
 
<syntaxhighlight lang="lsl2">// 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.
        }
    }
}</syntaxhighlight>
 
=== 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.
* Each time a notecard is chosen, the order in which the words will be used is randomized.
** One word or phrase per line. [[llGetNotecardLine#Caveats|Single lines should not exceed 255 bytes]].
** 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.
** Apostrophes are also stripped.
* Menu operated from touch.
 
<syntaxhighlight lang="lsl2">// V2 //
 
key owner;
key nc_line_id;
key num_of_nc_lines_id;
key current_builder = NULL_KEY;
 
integer query_id;
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;


[[Image:FG_jpg.jpg|thumb|left]]
list notecards;
list dialog_list;
list shuffled_line_numbers;
list current_alts;
list punctuation = [ ".", ",", "!", "?", ";", ":", "-", "\"" ]; // Must not contain pipes --> |


== My Contributions ==
integer frequency() {
    return ( integer )( llFrand( -1073741824.0 ) - 1073741824.0 );
}


=== Other Pages ===
removeListen( integer id ) {
    llListenRemove( id );
    if ( id == private_listen_id ) {
        llSetTimerEvent( 0.0 );
    }
}


'''[[User:Fred_Gandt/Scripts| Free Scripts]]'''
ownerDialog( string msg ) {
    integer channel = frequency();
    if ( msg == "" ) {
        msg = "Select a notecard, hear the current " + word_or_phrase + " or reset the game.";
    }
    private_listen_id = llListen( channel, llKey2Name( owner ), owner, "" );
    llDialog( owner, "\n" + msg, [ "CANCEL", llList2String( [ "START", "TELL" ], current_word != "" ), "RESET" ] + dialog_list, channel );
    llSetTimerEvent( 20.0 );
}


'''[[User:Fred_Gandt/Scripts/Continued_1| More Free Scripts]]'''
builderDialog( string msg ) {
    llDialog( current_builder, "\n" + msg, [], frequency() );
}


=== Legal Stuff ===
publicListen() {
    public_listen_id = llListen( PUBLIC_CHANNEL, "", "", "" );
}


'''[[Project:Contribution Agreement| The legal stuff about contributing to this wiki (worth reading).]]'''
getLine() {
    nc_line_id = llGetNotecardLine( notecard, llList2Integer( shuffled_line_numbers, --line_index ) );
    if ( !line_index ) {
        ownerDialog( "We've reached the end of the last notecard; please select another to continue." );
    }
}


== Tuition ==
announce( string str ) {
    llSay( PUBLIC_CHANNEL, str );
}


'''[[User:Fred_Gandt/Tuition| Tuition scripts, notes, videos and screenshots etc.]]''' (hardly any content yet)
string agentName( key id ) {
    string name = llGetDisplayName( id );
    if ( name == "" ) {
        name = llKey2Name( id );
    }
    return name;
}


== Free 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 + "\"." );
}
 
string trim( string str ) {
    return llStringTrim( str, STRING_TRIM );
}
 
string dL2S( list lst ) {
    return llDumpList2String( lst, " " );
}
 
string cleanString( string str ) {
    return llToLower(
        trim(
            llDumpList2String(
                llParseString2List(
                    dL2S(
                        llParseString2List(
                            dL2S(
                                llParseString2List( str, punctuation, [] ) // Remove the listed punctuation.
                            ), // Replace it with spaces.
                        [ "  " ], [] ) // Remove double spaces.
                    ), // Replace them with single spaces.
                [ "'" ], [] ), // Remove apostrophes.
            "" ) // Glue everything back together.
        ) // Trim leading and trailing whitespace.
    ); // Convert all to lower case.
}
 
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( "The " + word_or_phrase + " is currently: \"" + 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 + "\" by saying the acceptable alternative \"" + msg;
                            }
                            builderDialog( "The " + word_or_phrase + " you're building has been correctly guessed. Well done!" );
                            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 ) ) {
                builderDialog( "Build your interpretation of the " + word_or_phrase + ":\n\n\"" + current_word + "\"." );
                publicListen();
                announce( agentName( current_builder ) + " has been told the current " + word_or_phrase + " and should start their build now." );
            } else {
                mia( 0 );
            }
        }
    }
    timer() {
        removeListen( private_listen_id );
    }
}</syntaxhighlight>
 
==== Example Notecards ====
===== Words (no alts) =====
Copied from a list found at [http://www.manythings.org/vocabulary/lists/l/words.php?f=ogden-picturable manythings.org].
* Alternatives should be added per the instructions above.
<pre>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</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
no-brainer | a no-brainer
pig in a poke | a pig in a poke
a place for everything and everything in its place
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
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
off 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 | a storm in a teacup
straight from the horse's mouth
balance of power | the balance of power
birds and the bees | the birds and the bees | birds and bees | the birds and bees
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 | under one's thumb
under your hat | keep it under your hat | under one's hat | keep it under one's hat
watched pot never boils | a watched pot never boils | watched kettle never boils | a watched kettle never boils
wrong end of the stick | the wrong end of the stick</pre>}}

Latest revision as of 20:43, 4 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.
  • Each time a notecard is chosen, the order in which the words will be used is randomized.
    • One word or phrase per line. Single lines should not exceed 255 bytes.
    • 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.
    • Apostrophes are also stripped.
  • Menu operated from touch.
// V2 //

key owner;
key nc_line_id;
key num_of_nc_lines_id;
key current_builder = NULL_KEY;

integer query_id;
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() {
    return ( integer )( llFrand( -1073741824.0 ) - 1073741824.0 );
}

removeListen( integer id ) {
    llListenRemove( id );
    if ( id == private_listen_id ) {
        llSetTimerEvent( 0.0 );
    }
}

ownerDialog( string msg ) {
    integer channel = frequency();
    if ( msg == "" ) {
        msg = "Select a notecard, hear the current " + word_or_phrase + " or reset the game.";
    }
    private_listen_id = llListen( channel, llKey2Name( owner ), owner, "" );
    llDialog( owner, "\n" + msg, [ "CANCEL", llList2String( [ "START", "TELL" ], current_word != "" ), "RESET" ] + dialog_list, channel );
    llSetTimerEvent( 20.0 );
}

builderDialog( string msg ) {
    llDialog( current_builder, "\n" + msg, [], frequency() );
}

publicListen() {
    public_listen_id = llListen( PUBLIC_CHANNEL, "", "", "" );
}

getLine() {
    nc_line_id = llGetNotecardLine( notecard, llList2Integer( shuffled_line_numbers, --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(
            llDumpList2String(
                llParseString2List(
                    dL2S(
                        llParseString2List(
                            dL2S(
                                llParseString2List( str, punctuation, [] ) // Remove the listed punctuation.
                            ), // Replace it with spaces.
                        [ "  " ], [] ) // Remove double spaces.
                    ), // Replace them with single spaces.
                [ "'" ], [] ), // Remove apostrophes.
            "" ) // Glue everything back together.
        ) // Trim leading and trailing whitespace.
    ); // Convert all to lower case.
}

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( "The " + word_or_phrase + " is currently: \"" + 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 + "\" by saying the acceptable alternative \"" + msg;
                            }
                            builderDialog( "The " + word_or_phrase + " you're building has been correctly guessed. Well done!" );
                            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 ) ) {
                builderDialog( "Build your interpretation of the " + word_or_phrase + ":\n\n\"" + current_word + "\"." );
                publicListen();
                announce( agentName( current_builder ) + " has been told the current " + word_or_phrase + " and should start their build now." );
            } else {
                mia( 0 );
            }
        }
    }
    timer() {
        removeListen( private_listen_id );
    }
}

Example Notecards

Words (no alts)

Copied from a list found at manythings.org.

  • Alternatives should be added per the instructions above.
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
no-brainer | a no-brainer
pig in a poke | a pig in a poke
a place for everything and everything in its place
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
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
off 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 | a storm in a teacup
straight from the horse's mouth
balance of power | the balance of power
birds and the bees | the birds and the bees | birds and bees | the birds and bees
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 | under one's thumb
under your hat | keep it under your hat | under one's hat | keep it under one's hat
watched pot never boils | a watched pot never boils | watched kettle never boils | a watched kettle never boils
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