*index
ifMUD Help System

You want help? You want us to help you? You think that
we have nothing better to do than to give you help?

Well, you're right. If you want to hear some general 
topics that you can get help on, type "help topics".
If you want a list of commands you can get help on,
type "help commands". You can view the rules of the MUD 
by typing "help rules". There's a list of flags listed in 
"help flags", and a list of useful fields in "help fields".

If you want help on building your own area on the MUD,
type "help tutorial".

Useful information about the MUD can be found at the official
FAQ: http://www.allthingsjacq.com/ifMUDfaq/

Hope this helps!
*topics
Type "help topic" for more information about a 
particular topic. For example, if you want to learn how
to talk to other people on the MUD, type "help talking".
The following is a list of the available help topics: 

TOPICS:

beginner, commands, fields, tutorial, substitutions, flags, 
verbs, darkness, zone, programming, functions, admin, rules,
apartments, math[s], events, channels, options

NOTE: The "tutorial" topic is a set of instructions on 
creating your own area on the MUD.
*commands
Type "help command" for more information about a 
particular topic. For example, if you want to learn how
to use the @teleport command, type "help @teleport".
The following is a list of the available commands: 


COMMANDS:

say, emote, look, read, examine, inventory, drop, get, 
give, quit, home, who, where, finger, sign, help, motd, 
welcome, whisper, page, mail, bb, @wall, @dig, @doing, 
@users, @create, @stats, @set, @describe, @name, @chown, 
@pcreate, @password, @teleport, @link, @open, @action, @listen,
@fail, @ofail, @success, @osuccess, @drop, @odrop, @zone, 
@lock, @backlinks, @boot, @clean, @find, @recycle, @toad, 
@shutdown, @dump, @rows, @gag, @ungag, @away, @holler, 
@poll, @garbage, @reload, @from, names, @event, @ps, @killevents
*beginner
Welcome to ifMUD. ifMUD is very similar to TinyMUD
and TeenyMUD, with which you may be familiar. 

If you are new to MUDs, you will want to read the 
following topics first:

appearances
moving
talking

If you're just playing a Guest character, you don't need to read 
the appearances topic.

Type "help appearances" to read that topic.
*appearances
When your character is first created, it is not much to look at. Be
sure to set your description with the @desc command.

@describe me = You see a tall newspaperman with a button nose.

Type "look me" to see yourself. If you later start building stuff 
on the MUD, you'll be using the @describe command a lot, to describe 
places, exits, and objects.

Next, if you wish, set your gender with the @gender command:

@gender list
(choose a gender from the list, and then)
@gender female

Next, you will probably want to read the "help moving" topic.
*moving
To move from room to room in ifMUD, just type the direction in 
which you want to move. Usually the possible directions are 
mentioned in the description of the room you are in. Typical exits
include north, south, east, west, and one-letter abbreviations 
of the above. You may see the message "Not a valid command. Try 
typing help." if a particular exit is not available from the 
current room.

Example:

You are in the dining room. There is a door to the north.
n
You are in the hallway.

Also, if you ever get lost, you can get back by typing 'home'.

Next, you will probably want to read the "help talking" topic.
*talking
You will often encounter other players on the MUD. 
To converse with them, use the "say" command, which
can be abbreviated to a single " (double quotation mark).
For example:

say hello
You say hello.
"hello
You say hello.

If you want to express action or emotion, use
the emote command, which can be abbreviated to a
single : character. For example:

emote cries!
Bob cries!
:cries!
Bob cries!

To learn about building, try out the "help tutorial" topic.
*apartments
Hello, Dweller!

Free apartment linking space is now available at Edifice Towers, which
is a short hop south of Dorm A.  (xyzzy, then south 3 times)  Each floor has 10
exits, each of which may be claimed by an enterprising builder.  In the 
interest of fairness, we request one claimed apartment per MUD entity, please.
There is nothing to gain by cornering the Edifice Towers real estate market 
unless you like being green and slimy and going "Ribbit" a lot.

Don't worry about the term "apartment" -- Edifice Towers transcends all laws 
of physics, so there is no reason why your Batcave wouldn't feel right at home
on the 7th floor.

For instructions on claiming apartment space of your own, type
'help apartments2'

*apartments2
Here are several handy steps on claiming your apartment in Edifice Towers:

1. Pick an apartment exit that's not already taken.  To find one, consult
   the floor directory.  To really make sure, test the exit.  If it
   takes you back to the hallway (holy recursiveness!) it's available.

2. @dig a room, any room.  Call it Phil's Funky Fish Fritter Shack if you must.

3. @chown the chosen exit in the hallway to yourself.  Each numbered
   exit is chownok.  Now you can @link the exit to your newly-dug home,
   set the success and fail messages, etc. BE SURE TO @SET THE EXIT !CHOWNOK
   We also kindly request you keep the exit name the same for purposes
   of clarity and navigation.  

4. Go into the home and @open an exit back to the hallway.  The directory
   in the hallway will give you the dbref for linking.

5. Last, but quite important, go back out and sign the directory!  Let
   everybody know where you now are.  Enjoy the apartment!

*darkness
In order to make a room dark, just set the lock on the room. If 
anything or anyone in the room passes the lock, then the room will 
act normally. If everyone and everything in the room fail the lock, 
then whenever the room's description should be shown, the room's 
@fail (and @ofail, if set) will be displayed instead. Also, most 
objects and exits won't appear when you LOOK, and won't be accessible
(objects won't be able to be picked up, and exits won't be able to be 
traveled through).
If you want an exit or object to be visible in a darkened room, and 
for it to be usable, then set it VISIBLE. If you want it to be usable,
but to still not appear in the room, then you can combine the VISIBLE 
flag with the DARK flag.
*zones
A zone object is usually a room, although it doesn't have to be. If you 
have a room with the dbref #1234 that you want to use as a zone object, 
and an object called 'apple' that you want to be a part of that zone, 
type '@zone apple = #1234'. If you have a room with the dbref #4321 that 
you want to be a part of that zone, the type '@zone #4321 = #1234'. If 
you want other people to make their stuff part of your zone, then set the 
zoned flag on the zone object.

If there are exits on/in a zone object, then those exits will also be 
available in any room that's a part of that zone. If an object is part 
of that zone, then anyone carrying that object should automatically 
drop it upon leaving the zone.
*flags
Every ifMUD object can have one or more flags set.
You can use the @set command to set or clear a flag
(prefix the flag's name with a ! to turn off the flag):

@set me = spy
@set me = !dark

     abode       dark        examinable  spy
     male        slippery    quiet       builder
     female      puzzle      book        noholler
     linkok      zoned       wizard      chownok
     jumpok      visible     expert      going
     noexclaim   nohilite    nochannel   container
     nocontents

If you want help on a particular flag, type "help flagname". 
For example, "help dark" or "help expert".
*nohilite
Normally, people using the web client will see their name
(and any whispers to them) hilited.  To disable that feature,
set the nohilite flag.
*noexclaim
If the noexclaim flag is set, then anything you say which ends in an
exclamation mark ('!') won't be 'exclaimed' by you.  For example,
if you say "ha!" with the flag unset, you will see

   You exclaim, "ha!"

with the flag SET, you will see

   You say, "ha!"

This works on channels too.
*dark
When set on an exit or an object, the dark flag means that 
thing can't be listed in the Contents:, Obvious Exits:, or 
Obvious Actions: lines. 
This flag no longer has any effect on rooms or players.  Please see the
help for the nocontents flag instead.
*male
This flag is deprecated, although it can still be used for programming
purposes. See help @gender for how to specify a player's gender.
*female
This flag is deprecated, although it can still be used for programming
purposes. See help @gender for how to specify a player's gender.
*linkok
If a room has the linkok flag set, anyone will be able to link and
exit to that room.
*jumpok
If an object or player is set jumpok, anyone can @tel that thing or
person to another location. If a location is set jumpok, anyone can 
@tel stuff (or themselves) into that location.
*examinable
If something is set examinable, you can use the examine command to 
get a lot of information about it, no matter who owns it. Without 
this flag, that information is only available to the object's owner.
*slippery
An object that is set slippery will return home when it's dropped.
An room set slippery will send any object dropped there home.
*puzzle
If a room is set puzzle, then whenever anyone uses "home" or @tel 
to leave that room, that person will automatically drop everything
he/she is carrying.

If an exit is set puzzle, then that exit can parse wildcards. For example, 
if you have an exit called "type * on keyboard" that's set puzzle, the 
player can trigger that exit with the command "type Hello Sailor on 
keyboard". The wildcard is then stored in all lowercase in the %0 
substitution (in this case, "hello sailor"), and in the original capital and 
lowercase in %4 ("Hello Sailor"). You can have multiple wildcards (like 
"put * in *"), and the first one will always be %0 and %4, the second will 
be %1 and %5, the third %2 and %6, and the fourth %3 and %7. If an exit with 
this flag is called "put * in *", and the player types "put envelope in 
box", "envelope" is %0 and "box" is %1.

If an object is set puzzle, then that object will automatically be dropped 
if you ever cease to pass that object's lock. If a player is set puzzle, 
things created and renamed by that player will not automatically have 
acronyms added to their list of names.
*going
The @toad command can only be used on a player 
if that player has the GOING flag set.
*substitutions
Commands like @fail, @ofail, @success, and @osuccess set messages 
to be displayed when a player fails or succeeds in manipulating an 
object or exit. To make sense, these messages must contain the 
correct pronouns. Use one of the substitutions in the place of a 
pronoun, and the correct text will be inserted into the message 
when it's displayed. If the substitutions are capitalized, the 
output will also be capitalized.

Some functions let you set your own substitutions; to reference
them if their name is longer than one character, use %{braces}.

To see a list of all the available substitutions, type 'help subs-list'.
*subs-list
Substitution    Name                  Outputs
%s              subjective            he, she, it, or name
%n              name                  name
%p              possessive            his, her, its, or name's
%a              absolute possessive   his, hers, its, or name's
%o              objective             him, her, it, or name name
%r              reflexive             himself, herself, itself, or name
%l              location              [the name of the player's location]
%%              percent sign          %
%c              carriage return       [produces a newline]
%4 - %7         arguments             [the arguments given to the exit]
%0 - %3         lowercased arguments  [the arguments given, all in lower case]
%#              player's dbref        [the dbref of the player]
%!              thing's dbref         [the dbref of the exit/object]
*newline
The newline separator in descriptions, quotes, and jotacode is %c. See 
'help subs-list'.
*new line
The newline separator in descriptions, quotes, and jotacode is %c. See 
'help subs-list'.
*t-verbs2
Due to modifications to the MUD, it is now possible to create actions 
that can parse wildcards, by using the puzzle flag. For example, let's
consider a safe with a single dial on it. If you set the dial to the 
correct number, the safe opens. If you set it to the wrong number, it
doesn't. You can implement that easily with the puzzle flag:

@open set dial to *;turn dial to *;dial *;set knob to *;turn knob
     to *=nowhere
@set set dial to *=dark
@set set dial to *=puzzle
@succ set dial to *=You turn the dial to %4, but nothing happens.
@osucc set dial to *=fiddles with the safe's dial, but achieves nothing.
@open set dial to 357;turn dial to 357;dial 357;set knob to 357;turn
     knob to 357=nowhere
@set set dial to 357=dark
@succ set dial to 357=You turn the dial to 357, and the safe opens!
@osucc set dial to 357=fiddles with the safe's dial, and the safe opens.

[Type "help t-verbs3" for more information.]
*t-verbs3
Now, if someone types "set dial to 357", it will match the second 
action, and the safe will open. If the player types "set dial to 123" 
or "set dial to 3", or any other wrong number, then it will match the
first action, and the safe will remain closed.

Notice the use of %4 in the @success message for the first action. If 
you use %4 anywhere in the @success, @osuccess, @odrop, @fail, or
@ofail of an exit with the puzzle flag set, then %4 will be replaced 
with whatever the player types in place of the wildcard. In the above
example, if the player typed "set dial to 300", he/she would see 'You 
turn the dial to 300, but nothing happens.'

In the past, you would have used %0 to match the first argument; this
first converted the argument to lower-case, which was annoying.  Use
%0 if you don't care at all (and will not output) the case of the
argument, and use %4 otherwise.

[Read "help t-nouns" if you haven't. Otherwise, read "help t-programs".]
*zoned
If a player has has the zoned flag set, that player is considered 
to be zoned out (temporarily away from the MUD, although he/she might
still be connected to it). Anyone who pages or whispers to that player 
will see the player's away message. Type "help @away" for more 
information about setting your away message.

If a room or object is set zoned, then anyone can set something's zone 
to that object with the @zone command.
*abode
If a location is set abode, then anyone can set his/her home to 
that location. Anyone can also set the home of an object to that 
location.
*quiet
If a location is set quiet, then it won't be announced when people
enter or leave this location. If a player is set quiet, his or her
connections and disconnects won't be announced to the entire MUD (also
see "help qconnect"). If an object or exit is set quiet, no odrop, osucc, 
or ofail message will be displayed for it.
*book
If something is set book, then anyone can leave a message on it
using the "sign" command.
*wizard
Any player set wizard is granted special permissions that normal
players don't have. Wizards are the administrators of the MUD.
*expert
If a player is set expert, then he/she will need to use the "say"
command to talk. Players who are set expert will also be allowed to
abbreviate the names of many commands.
If an object is set expert, then the MUD will check it to see if there 
are any actions on it.
*spy
Any player who is set spy will be able to see the name of a person
who uses the @emit command.
*builder
Players who are set builder will be able to create new areas and 
objects on the MUD. For more help with building, type "help
tutorial". Only Wizards can set players builder.

If a room or object is set builder, then any player will be able to 
open exits leading off of it.
*noholler
Any player who is set noholler will be unable to use the @holler
command, and will also be unable to hear others using the @holler 
command. (Type "help @holler" for more information.)
*nochannel
Any player who is set nochannel will be unable to speak on or hear channels.
See "help channels" for more information.
*visible
If an object or exit is set visible, it will appear in a darkened 
room (unless set DARK), and it will be usable.
*chownok
If an object is set chownok, then any player will be able to use the
@chown command to claim ownership of the object.
*fields
While you can set any fields you want on stuff, some are more 
useful than others. Here's a list of some handy ones. You can 
set any of these by typing "@field me = fieldname : Field value" or 
"@field object = fieldname : Field value". (For example: "@field 
apple=eat:You take a small bite out of the apple. It's delicious.")

     connect        rname          eat            search
     disconnect     address        wear           push 
     homemsg        plan           remove         pull
     ohomemsg       url            talk           default
     doing          game           turnon         saymode
     away           autocmd        turnoff        whomode
     varobj         bbnotify       exitto         exitmode
     unidlecmd      vacationmsg    recapformat    lastchannelchar

To get help on what a specific field is for, type "help fieldname" 
(like "help address" or "help remove"). For help setting fields in 
general, type "help @field".
*whomode
You can set the whomode field on yourself to specify how the WHO list
is sorted. Valid settings begin with a + or - sign, followed by
"byon", "byidle" or "byname" (to sort by on time, idle time or name,
respectively). A + sorts in ascending order, and a - in
descending. The default sort is +byon. 
*bbnotify
The bbnotify field controls whether or not you'll be notified when new 
messages are posted to the bulletin board. Applicable settings are:

        always          You'll be told whether or not there are new 
                        messages when you log on, and you'll be told 
                        whenever someone posts a message while you're 
                        connected.

        logon           You'll be told whether or not there are new 
                        messages when you log on, but you won't be 
                        informed if someone posts a message while you're 
                        connected.

        update          You'll be told if someone posts a message while 
                        you're connected, but you won't be informed of 
                        new messages when you log on.

        never           You won't be told about new messages on the 
                        bulletin board.
*connect
The connect field contains the message displayed to everyone when you 
log on to the MUD. It replaces the 'Player has connected to ifMUD.'
message.
*saymode
The saymode field controls how the result of the say command is
displayed to you. It can be set to 1, 2, or 3:

        saymode: 1      I say, "Hello there."
        saymode: 2      You say, "Hello there."
        saymode: 3      Yourname says, "Hello there."

It does not affect how other people see your speech.
*disconnect
The disconnect field contains the message displayed to everyone when
you log off of the MUD. It replaces the 'Player has disconnected from 
ifMUD.' message.
*homemsg
The homemsg field contains the message you see when you type
'home'. It replaces the 'You click your ruby slippers together...'
message. 
*ohomemsg
The ohomemsg field contains the message other people see when you type
'home'. It replaces the 'goes home.' message. NOTE: The MUD will
automatically prefix this text with your name, so if you set the field
to 'runs away screaming!', other folks will see 'yourname runs away
screaming!' 

This field also works on objects, and will be displayed when they are 
sent home. If an object's rname field is set, its value will be used 
instead of the objects name.
*doing
This message describes what you're doing, or reflects your opinion on the
current WHOlist poll. It will show up whenever anyone types 'who'.

Usage:
@doing Eating green eggs and ham

See also:
@poll
*away
If you have the ZONED flag set on yourself, then the contents of your
away field will be displayed to anyone who attempts to page you or
whisper to you.  This message is intended to explain why it is that
you're unable to respond to pages or whispers.
*grand
Archaic term. See 'help quiet'.
*rname
The rname field holds whatever your real name is, if you feel like
setting it. This will be seen by anyone who checks your finger data
(type "help finger" for more information on that).
*address
The address field holds whatever your Email address is, if you feel
like setting it. This will be seen by anyone who checks your finger
data (type "help finger" for more information on that).
*plan
The plan field holds whatever your plan or goal is, if you feel like
setting it. This will be seen by anyone who checks your finger data
(type "help finger" for more information on that).
*url
The url field holds the URL for your WWW homepage, if you feel like
setting it. This will be seen by anyone who checks your finger data
(type "help finger" for more information on that).
*game
The game field holds whatever work you've completed in the field of
IF, if you feel like setting it. This will be seen by anyone who
checks your finger data (type "help finger" for more information on
that). 
*autocmd
The autocmd field holds a command, like 'who' or 'xyzzy' or
'motd'. Whatever you put into this field will be executed as a command
whenever you connect to ifMUD. Or it can hold multiple commands,
separating each one with a |.
*unidlecmd
The unidlecmd field holds a command, like 'who' or 'xyzzy' or
'motd'. Whatever you put into this field will be executed as a command
whenever you unidle. Or it can hold multiple commands, separating each
one with a |.
*quitcmd
The quitcmd field holds a command, like 'who' or 'xyzzy' or
'motd'. Whatever you put into this field will be executed as a command
whenever you quit. Or it can hold multiple commands, separating each
one with a |.
*vacationmsg
The vacationmsg field holds a piece of text that will be displayed to
people using the finger command ("help finger") on you. It is useful
to let people know when you will be away for a while. 

Usage: 
   @field me = vacationmsg : Off to Aruba! I'll be back on Feb. 30.
*varobj
The varobj field is used by the @g and @s functions. Check the help
entries on those functions for more information.
*eat
The eat field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to eat the 
object the field is on.
*wear
The wear field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to wear the 
object the field is on.
*remove
The remove field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to take off
the object the field is on.
*talk
The talk field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to converse 
with the object the field is on. The topic of conversion is held in the 
%1 percent substitution.
*search
The search field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to search 
the object the field is on.
*turnon
The turnon field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to turn on 
the object the field is on.
*turnoff
The turnoff field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to turn off 
the object the field is on.
*push
The push field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to push the 
object the field is on.
*pull
The pull field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to pull the 
object the field is on.
*default
The default field can contain either plain text, or a piece of programming 
code. It will be displayed/executed whenever someone tries to eat, wear, 
take off, talk to, search, turn on, turn off, push, or pull the object 
the field is on, but only if the field appropriate to that verb doesn't 
exist on the object.
*verbs
There is now a small library of built-in verbs that can be used on
objects. Each verb has several synonyms, and there are two fields
associated with each verb: a verb field, and an overb field. For 
example, the 'eat/drink/taste' verb has an 'eat' field and an 'oeat'
field. These fields act just like @succ and @osucc. When someone 
tries to eat an object with an 'eat' field, that field will be 
displayed to the player doing the eating (or executed, if it's a 
program). If there's an 'oeat' field, then that will be displayed or 
executed (preceded by the player's name) to everyone else in the room. 
Type "help verblist" for a list of verbs and their fields:

The talk verb stores the topic in the percent-sub %2. If someone uses 
a verb on an object and that object doesn't have the associated field 
set, then the 'default' field will be printed or executed if it exists,
along with the 'odefault' field. If those fields don't exist either, a
standard message will be printed.
*verblist
Type "help verbs" for help using these verbs.

eat     eat/drink/taste
wear    wear/don/put on
remove  remove/doff/take off
talk    ask about/tell about/talk to about
search  search/look behind/look in/look through/look under
turnon  turn on/activate/switch on
turnoff turn off/deactivate/switch off
push    push/press/touch
pull    pull/yank/tug
*admin
The following administrative commands are available,
primarily for use by wizards. 

@wall message               Sends a message to all connected players.
@stats player               Outputs statistics. Player can be omitted.
@chown object = owner       Grants an object to another player.
@pcreate name = password    Creates a new player.
@password name = password   Changes a password.
@teleport name = #location  Teleports an object.
@boot name                  Disconnects a player (for now).
@clean                      Sends nonplayers and sleeping players home
                            from this room.
@find name                  Finds objects with the specified name.
@recycle object             Recycles the specified object.
@toad player = newowner     Turns a player into a toad. There's no going back!
                            If newowner is not specified, possessions recycled.
@dump                       Writes the database to disk immediately.
@shutdown                   Shuts down the mud. Implies @dump.
@garbage                    Searches for and removes garbage objects from 
                            the MUD's database.
*say
The say command is used to speak to other players in the room. 
If your text ends with a ? sign or a ! sign, an appropriate verb 
will be used. If your text beings with a : it will be treated as 
a directed emote ("help emote"). Also, the "saymode" field can change
how your speech appears to you ("help saymode").

Usage: 
say hi there!
You say, "hi there!"
"hi there!
You say, "hi there!"
..troc do you have any more cookies?
You say (to troc), "do you have any more cookies?"
..inky :waves!
Yourname poses (to inky): Yourname waves!
.."everyone but Bob" Good morning.
You say (to everyone but Bob), "Good morning."
..B. Boo!
You say (to Bob), "Boo!"
*emote
The emote command is used to express yourself in the third person. 
The resulting sentence will begin with your name. You can emote at 
someone with the .. syntax.

Usage: 

emote smiles.
:smiles.
..thumper :waves!
*pose
A synonym for "emote".
*@exec
You can execute any code at the command line with the @exec command. 
%! and %# are both set to the player executing the command.

Example:
@exec @print(@tell("%!", "Hi there!"), "Bye now.")
Hi there!
Bye now.
[Execution Complete.]
*@smto
A synonym for "@exec".
*look
The look command is used to glance at the current room,
or at a particular object. You can look at objects carried
by other people by using "look Person's thing".

Usage:

look
look me
look liza's apple
look north
*read
A synonym for "look."
*examine
The examine command is used to examine the current room or a 
particular object in detail. If you own the object you're 
examining, if the object is set examinable, or if you're a 
Wizard, then the examine command outputs a great deal of useful 
information including flag settings, lock settings, fail and
success messages and other information about the object.
Otherwise, the examine command will display the name of the
object's owner.

Usage:

examine
examine me
examine north
*inventory
The inventory command displays what your character
is carrying. 

Usage:

inventory
*drop
The drop command is used to drop an object, or
to drop all currently carried objects.

Usage:

drop key
drop all
*get
The get command (also called 'take') is used to pick up an 
object. Typing 'get all' will pick up everything available.

Usage:

get key
take all
*take
A synonym for "get."
*quit
The quit command is used to disconnect from ifMUD.
*home
The home command is used to transport your character
back to her home room. You can set your character's
home using the @link command.

Usage:

home
*who
The who command displays information about the currently connected users,
including how long they have been connected, how long they have been idle,
and whether or not they are set zoned (away). The zoned flag is specified 
by an asterisk (*) by someone's name.

You can give who any number of arguments, separated by spaces:
An argument of the form "+" or "-" followed by "byon", "byidle", "byname",
or "bydoing" sorts the players listed, by their on-time, idle-time, player
name, or @doing. A + sorts in ascending order, and a - in descending. The
default is "+byon" unless you have set your own default (see "help whomode").

You can also supply a player name or channel name, which will list
those. Players will always be listed whether or not they're logged on;
channel members will only be listed if they're logged on.

If no players or channels are given, the who command will list all online
players.

Arguments of the form -and, -or, and -not are used to join multiple
arguments: -and #foo will show only people who are also on #foo, -or #foo
will additionally show people on #foo, and -not will show people not
on #foo. -or is the default combine type.

See also help on the following options/fields/commands which customize the 
behavior of who:
  whomode, names

Usage:
who
who Spatch
who schep inky markm
who +byon
who #monkey
who -byidle #monkey -not #perl -and #stuff
*names
The names command is identical to the who command, but lists the
players' names in a much more condensed format. For more information
about options for names, see the help on the who command.

Usage:
names
names #foo                   (List only people on #foo)
*where
To see the locations of all the players on the MUD, just 
type "where". If you want your location to be private, type 
"@set me=nowhere". If you want the location of everyone in
a certain room to be private, type '@set here=nowhere" (while
you're in that location). Where can take an argument, the names to
give the location of.
*finger
The finger command is used to view various pieces of information 
about a player, including:

	- Last time the player connected
	- Real name (rname)
        - Email address (address)
        - If they have mail
	- Home page (url)
	- IF work (game)
	- If they're on vacation (vacationmsg)
	- Plan (plan)

To set any of these fields, type "@field me=fieldname:Whatever".
For example, to set your real name, type "@field me=rname:Slappy Slapbottom".

Use the -fuzzy flag to force fuzzy matches; otherwise, finger will try
fuzzy matches (against rname field and subsets of the name) only if no
exact match is found.

Usage:
finger Player
finger laye      (Shows characters with 'laye' in their name/rname)
finger -fuzzy inky  
*@poll
You can now effectively gauge the opinions and tastes of the entire MUD
with the @poll command.  With it, you may change the top line of the
WHOlist and change the "Doing" category.  Other players may then alter
their @doing lines to voice their opinions. Or not. That's the beauty of
it all.

Typing @poll by itself shows you the current poll and the
current pollster without showing the whole WHO-list: amazing!

Typing '@poll clear' will clear the current poll.

Usage:
@poll My favorite Enchanter spell...

See also:
@doing
*sign
The sign command is used to sign a book. Things which have 
the book flag set can be signed by any user. Signing the 
book adds up to 1024 characters, prefixed by your name. The %c
escape can be used to add a newline in the signature. Use the look
command to see the current signatures in the book. Also see unsign,
and the nosignmsg and fullsignmsg @options.
 
Usage:

sign book = message
*write
A synonym for "sign."
*unsign
The unsign command is used to remove a signature from a book.

Usage:

unsign book             This removes your MOST RECENT entry.
unsign book = last      This does too.
unsign book = first     This removes your FIRST entry.


*help
The help system you are now using. Type "help" by itself and 
press ENTER to begin learning more about ifMUD.

The version of this help system is $Id: help.txt,v 2.224 2022/12/02 21:58:56 inky Exp $.

Usage:

help
*motd
The motd command repeats the message that was displayed
immediately after you logged into ifMUD.

Usage:

motd
*welcome
The welcome command repeats the message that was displayed
when you first connected to ifMUD.

Usage:

welcome
*whisper
The whisper command is used to speak privately to an individual in the 
same room. Use the page command to speak to an individual who may be 
located anywhere in the MUD. The . command is a shorthand for whisper. If 
the first character of your text is a : (colon), then you will privately 
pose your text to the recipient. Also, if you use the full version of 
whisper, you can whisper to multiple people at once by giving list of 
names separated by commas or spaces.

Usage:

whisper person = message
whisper person, person, person = message
.person message
*page
The page command is used to send a private message to
another player anywhere in the MUD.  Using a colon as the first character
of your message will page-pose, so you can page in the third person. Neat!
Also, you can page multiple people at once by giving list of names 
separated by commas or spaces.

Example:

page Spatch = You are driving me up the wall!
You paged Spatch: You are driving me up the wall!

page Spatch, Adam = :vrooms about in the wall-car.
You page-posed Spatch: Andretti vrooms about in the wall-car.
You page-posed Adam: Andretti vrooms about in the wall-car.
*mail
To check your mail, just type "mail". This will list all the messages
in your mailbox. To read a specific message, type "mail <#>",
where <#> is the number of the message.

To delete a message from your mailbox, type "mail delete = <#>",
where <#> is the number of the message. Please delete mail that you
no longer need. You may delete all your mail at once with "mail
delete = all". Deleting a message just flags it as deleted; it will be
automatically purged when you log out (see "help noautopurge") or when
you type "mail purge". To undelete a message you have accidentally
flagged as deleted, type "mail undelete = number" to undelete that
message. Note that this can't recover messages that have been
purged. To mark messages as unread, you can do "mail unread 3". 

To check if you have mail, do "mail check" or "mail check = quiet".

To send mail to another player, type "mail Player = Subject : 
Message". Send mail to multiple recipients by separating them with
commas or spaces. 

To search your messages for ones with a specific string, do 
"mail search = text".

Mail messages are implemented very similar to the bulletin board, and
looking at "help bb" and its commands may be useful. In particular,
the information in "help bb_range" also applies directly to mail
messages. 

Examples:
mail
mail 2
mail delete = 2
mail delete = all
mail Jota = Mudmail : I love the new mail program you wrote!
mail thumper, inky, schep = Hi : What's up?
mail unread = 3         (mark everything from message 3 on as unread)
mail check = quiet      (check if you have mail, printing no message if not)
mail search = monkey    (list all messages containing 'monkey')
*bulletin
A synonym for "bb".
*@wall
The @wall command is used to send a message to all players currently
connected to the MUD, whether or not they're set NOHOLLER.

@wall is available only to wizards.

Usage:

@wall System restarting in 5 minutes
*@dig
The @dig command is used to create a new room. After the
room is created, ifMUD will report the object ID
associated with the room. Be sure to make a note of
the ID as you will need it to open an exit to that
room or teleport to that room.

Usage:

@dig Castle Mauveskull
*@doing
The @doing command is used to set the message which appears
next to your character's name on the list output by the
who command. 

Usage:

@doing message
*@users
Use the @users command to view the names of all the players that 
exist on the MUD, whether they're online or not. It will also
display whether or not each person is a Wizard.

The optional argument "bytime" will sort the user list by logon time, 
and the argument "wizards" will only list players who are Wizards. 
Any other argument will search the user list for players whose names 
contain that string. With "bytime", a maximum-range field is required; type
@users bytime to see the list of possible ranges.

Usage:
@users
@users bytime = month
@users wizards
@users jo
*@create
The @create command is used to create a new object.
(Rooms are created with the @dig command, exits are
created with the @open command, and players are
created with the @pcreate command.)

Usage:

@create objectname
@create shiny red apple;shiny apple;red apple;apple
*@stats
The @stats command outputs statistics about the system
as a whole, or about a particular character. These statistics
are useful to determine how large the MUD has become, or
to measure the impact of a particular user.

Usage:

@stats
@stats me
*@garbage
The @garbage command, which is restricted to Wizards, will search the 
MUD's database for any garbage objects (objects which have no object 
type), and automatically recycle them.
*@set
The @set command is used to set various flags on any 
object (including players, rooms, and exits). See
"help flags" for more information.

Usage:

@set here = dark
@set here = linkok
@set me = expert
@set #327 = jumpok
*@describe
The @describe command is used to set the description
that a player sees when looking at an object.

Usage:

@describe here = You are standing in a north-south hallway.
@describe me = Indifferent honest.
@describe north = To the north you can make out the shores of a distant lake.

*@rows
The @rows command sets the number of rows of scrollback
the WWW interface should display. You may wish to set this to 
a smaller value if your link is slow.

Usage:

@rows me = 20
*@name
The @name command is used to rename an existing object. 
Players can rename themselves, but only wizards can rename 
other players. Also, names are not permitted to begin with 
a semicolon.

Usage:

@name north = s;south
@name here = Castle OffwhiteSkull
@name me = DariaDolan
*@chown
The @chown command is used to change the ownership of an object. 
You may give any object you own or any object that's set chownok
to yourself, but only Wizards can @chown things to other players. 
If you don't specify a player, it will be assumed to be you.

Usage:

@chown object = me
@chown object
*@pcreate
The @pcreate command is used to create a new character.
This command is available only to wizards. Character
names cannot contain spaces.

Usage:

@pcreate name = password
*@password
The @password command is used to set a new password
for a character. 

Usage:

@password foo
@password Jessica = kibitz27
*@teleport
The @teleport command is used to transport an object,
or your character, to a specific location. If the word
home is used as a destination, the object will go
to its own home, as was set by the @link command. If
a player's name (preceded by an * asterisk) is used as
a destination, the object will go to that player's 
location (if permitted). The following fields may be used
to modify the messages seen when teleporting:
  otelout/otelin: the message seen by others in the 
                  destination/source rooms 
  atelout/atelin: the message seen by the teleporter upon 
                  leaving/arriving if they teleport themselves.
  telout/telin: the message seen by the teleporter upon 
                leaving/arriving if someone else teleports them.

Note on containers:  You can teleport something into a container if that 
container is set linkok, you own it, or you are a wizard.

Usage:

@teleport #0
@teleport dog = home
@teleport *Jota
*@link
The @link command is used to establish a home for an object. 
An object's home must be a room. Objects can be sent home under 
a variety of circumstances. In the case of exits, it sets a new
destination for the exit.

Usage:

@link me = here
@link dog = here
@link dog = #27

*@open
The @open command is used to open a new exit from this
room to a different room ID. The destination must be a
room. Every exit must have a destination, although it is 
possible to @lock an exit so that it never succeeds. Many 
synonyms for the exit's name can be provided to accommodate 
reasonable guesses on the player's part. The destination
can be changed later using the @link command.

Usage:

@open n;north;out = #322
*@action
The @action command is used to open a new exit on an object. 
The exit's destination can be a room ID, 'home', or 'nowhere'. 
Many synonyms for the exit's name can be provided by separating 
the synonyms by semicolons. The destination can later be changed 
using the @link command. NOTE: The object must be set EXPERT for 
the exit to be usable.

Usage:

@action push button;press button = device : nowhere
@action wand magic wand;wave wand = magic wand : #500
*@listen
The @listen command is used to open a new "listening" exit on
an object. Unlike normal exits, this is triggered by @tellrooms
that occur in the room where the exit's parent is located. Matching
etc is handled as with normal exits, including the requirement for
the parent object to be set expert. Destinations of listening exits
are irrelevant.

Usage:

@listen device = * enters the *.
*@fail
The @fail command is used to establish a failure message
which the player will see when unsuccessfully attempting
to get an object or use an exit. See also locking,
substitutions, @lock, @ofail, @success, @osuccess,
and @odrop.

Usage:

@fail north = The door won't open without a key.
*@ofail
The @ofail command is used to establish a failure message
which spectators in the room will see when a player 
unsuccessfully attempts to get an object or use an exit. 
See also locking, substitutions, @lock, @fail, @success, 
@osuccess, and @odrop.

Usage:

@ofail north = pounds senselessly on the door.
*@success
The @success command is used to establish a success message
which the player will see when successfully attempting
to get an object or use an exit. See also locking,
substitutions, @lock, @osuccess, @fail, @ofail, and @odrop.

Usage:

@success north = The key fits! You turn the lock and pass through.
*@osuccess
The @osuccess command is used to establish a success message
which spectators in the room will see when a player 
successfully attempts to get an object or use an exit. 
See also locking, substitutions, @lock, @success, @fail, 
@ofail, and @odrop.

Usage:

@osuccess north = passes through the door.
*@drop
The @drop command is used to set a message on exits or objects.
On an object, it is the message show to a player when the player
drops that object. On an exit, it is the message that a player
sees after that player has successfully used that exit.
See also locking, substitutions, @lock, @success, @osuccess, 
@fail, and @ofail.
*@odrop
The @odrop command is used to establish a success message
which spectators in the room will see when a player 
drops the specified object. If the object is an exit,
the message will be displayed to other players in the
room the player has traveled into. See also locking, substitutions, 
@lock, @success, @osuccess, @fail, and @ofail.
*@zone
To set the zone of an object, you can type '@zone object=XXXX', or
'@zone object=#XXXX' where XXXX is the dbref number of the zone object.
You can also set the zone on a room by typing '@zone here=XXXX' or '
@zone here= #XXXX' while standing in that room.

The zone object must either be owned by you or set zoned.

See "help zones" for more help.
*@lock
The @lock command is used to control which players
can get a particular object or pass through a particular 
exit. Locks can refer to both players and objects. If
a lock refers to a player, then that player can use
the object. If a lock refers to an object, then the
player can use it if the player is carrying the
specified key. Objects and players can be combined
using & (AND), | (OR), ! (NOT), and ( and )
(parentheses to group expressions).

If players are mentioned in the lock, it is crucial
that an * appear before the name of each player.

To clear a lock, place nothing on the right-hand side
of the = sign.

Usage:

@lock north = *jessica
@lock south = (!*roger) & blue key
*@boot
The @boot command is used to immediately disconnect
a particular player (for now). No permanent damage
is done to the user's character. Only wizards can
use this command.

Usage:

@boot player
*@backlinks
Use the @backlinks command to find everything linked to a certain
player/room/whatever. If you don't specify any argument, it 
will assume you mean the current room. For this to work, it 
either needs to be set LINKOK or owned by you.

Example:
@backlinks
@backlinks me
*@clean
The @clean command is used to "clean up" the current 
room. Every object that does not have its home set
to the current room is immediately sent home, except
for currently connected players.

You may also do @clean object, to send a specific 
object/player home. This syntax does permit sending
connected players and exits home.

When used on a room by a wizard or the room's owner, it 
moves every object; otherwise, it only moves objects
owned by the person doing the @clean.

Usage:

@clean
@clean thingy

*@find
The @find command is used to locate missing objects
by name. This is useful if you have forgotten the
id number of a newly created room. If you provide no
arguments to the @find command, it will list all
owned objects.

Usage:

@find name
*@recycle
The @recycle command is used to recycle (destroy) an object, reclaiming 
the space to be reused by a new object. The object will be moved to a 
special holding room, and will have a flag set on it to indicate that 
it's to be destroyed in an hour. You can force it to be destroyed immediately 
by using the @recycle command on it again. You can use the @unrecycle command 
to save it from being destroyed.

At the time of destructions, if the object contains other objects, they 
are immediately dropped. If the object is a room, the 'noroom' is set as 
the new home of objects residing in the recycled room. If there are 
exits which lead to a recycled room, those exits are directed to 
the 'noroom' as well. @recycle cannot be used directly on players, but 
wizards can use @toad first to turn players into inanimate objects. Also, 
note that @recycle will not acknowledge zone exits.

If you wish to recycle a container, it must be empty first.  If, by the 
time an object is being destroyed, the container is no longer empty, its 
contents will be dumped in the noroom.

Once an hour has passed, @recycle can no longer be undone, so 
be sure to @unrecycle anything accidentally recycled as quickly as possible.

Usage:
@recycle object
*@unrecycle
If an object has been scheduled for destruction with the @recycle command,
but hasn't been destroyed yet, you can use '@unrecycle #1234' (where #1234
is the dbref of the object) to save it from annihilation.
*@toad
The @toad command is used to turn a character into a 
slimy toad (an inanimate object). The character's
possessions are recycled if no recipient is specified
to accept them. Only wizards can use this command, and 
the command will only work if the player to be toaded 
has his or her GOING flag set. This command cannot be 
abbreviated.

Note on containers:  If a toaded player owns containers that are about to
be recycled, and those containers are not empty, the items from those 
containers will be dumped in the noroom.

Usage:

@toad player
@toad player = recipient
*@shutdown
The @shutdown command is used to shut down the MUD,
disconnecting all current users and writing the 
database to disk. This command cannot be abbreviated.
*@dump
The @dump command is used to write the database to disk
immediately. Note that the server automatically writes the
database to disk at regular intervals. This command is
nonetheless useful when a particularly important action
has just been performed. Only wizards can use this
command. This command cannot be abbreviated.
*@gag
The @gag command allows you to completely ignore another 
player. Use this command if you find you simply can't stand 
them, no matter what. Use @gag with no arguments to see whom 
you have gagged. You can use @gag bob a second time to ungag 
bob. If  you specify a channel as the argument, this will 
toggle whether gags are ignored for conversation on that 
channel. If you specify a person as the first argument and a 
channel as the second, the gag will only be effective on 
that channel.

See also help on the following options/fields/commands which customize the 
behavior of @gag:
  gagrecap, explicitgag, gagautomute, gagprivate, @ignore

Example:

@gag bob
@ungag #smoochies
@gag bob = #smoochies
*@ungag
The @ungag command is an alias for @gag, more or less. See help @gag.
*@ignore
The @ignore command works exactly like @gag (q.v.), except that the
contents of the @ignore list are deleted when you quit. This is 
therefore good for temporary gagging. Note that if you @ignore someone
who you also have gagged, the gag will be temporarily removed until
you log out.

See also: help @gag
*@unignore
@unignore is an alias for @ignore, more or less. See help @ignore.
*@objgag
The @objgag command is used to gag/ungag output from an object. This
is similar, but not identical, to the @gag command, as strictly
speaking it only hides tellRoom calls with that object as the source; 
so if you gag an object, you'll still see its success but not its
osuccess field, as the former is not a room broadcast but the latter
is. If you gag an object, you also won't see messages generated by
actions (exits) located in/on that object. 

@objgag with no arguments lists existing object gags, @objgag clear
clears all gags, and @objgag on an object name/dbref toggles its
gagged status. @gag should be used instead of @objgag to gag players.

Usage:
@objgag pull cord              Hide the bell pull message
@objgag                        List existing gags
@objgag clear
@objgag #1866                  Also works

See also: @gag
*@holler
Also known as "the poor man's @wall", @holler command behaves exactly
like @wall, except that anybody may use it.  However, those not
wishing to listen to a bunch of people hollering like a bunch of
gibbons may set the 'noholler' flag on themselves.  You may not use
the @holler command if you are indeed set 'noholler'.  It's only
fair. 

Example:

@holler What's a gibbon, anyhow?
Spatch hollers, "What's a gibbon, anyhow?"

@holler :screams like Tarzan!
In front of the entire MUD: Spatch screams like Tarzan!

@holler ..Jane Aaaaaaauuuuuuaaaaaaooooooh!
Spatch hollers (to Jane), "Aaaaaaauuuuuuaaaaaaooooooh!"

See also: @wall
*@away
@away is a command that, when used in conjunction with the zoned flag,
sends a message to anybody who pages you when you have the flag set.
Useful for, well, when you're away.

Example:

@away me=I'm dead! Will be back in 3 days!
@set me=zoned

Spatch pages: You there?
Your away message has been sent to Spatch.

	What Spatch sees:

You paged HeyZeus: You there?
Away message from HeyZeus: I'm dead! Will be back in 3 days!	

See also: page
*@field
The @field command can be used to set an arbitrary field on an object. 
The name of this field will automatically be converted to lower case.
(Note: Not all fields can be set using this command. Particularly, you
cannot set any field with a space in its name.)

Usage:
@field me=va:423
@field dog=fur:brown
@field Tommy=ohomemsg:runs home to the Cafe.
*give
The give command gives an object from your inventory to another
player.

Example:
give apple=Jota
give sign=liza
*again
The "again" command simply repeats your last command. It can be 
abbreviated to "g".

Usage:
say Hi there!
You exclaim, "Hi there!"
again
You exclaim, "Hi there!"
*rules
A MUD Forever Voyaging is an extension of rec.arts.int-fiction
and rec.games.int-fiction. Please behave accordingly.

When building yourself a home, try to use @osuccess and @odrop
messages wherever appropriate. For more information on 
building, read "help tutorial".

Don't MUD while driving, and don't drink while MUDding.
*programming
It is possible to put code in the "JotaCode" language into @succ, @osucc,
@drop, @odrop, @fail, @ofail, and @desc messages. If one of these
messages begins with an @-sign, it will be interpreted as code. This
will just be a series of functions, each of which begins with @. The 
arguments to these functions can be:
   * strings in "quote" marks; you can use a quote in the middle of
     a string by escaping it with a backslash, like "Say \"Hi\" now".
     Strings can contain %-substitutions, which are evalutated when the
     string is parsed; see help substitutions for more information.
   * numbers, with optional sign, decimal part, and # sign at beginning.
     Examples:
       1.50
       #14
       -.05
   * *variables: variables assigned by the JotaCode parser, prefixed by
     a * (see help jotavars for a list)
   * another @function
   * a valid C token (a sequence of alphanumerics and underlines not
     beginning with an underline), which is short for @g("token"); see @g.
   * a number, variable, or token, followed by a colon, followed by a token,
     which is short for @getfield(first, second); see @getfield
   * a token, followed by ( ) parentheses, with an optional arg list inside,
     short for @execute(@g(token), args...); see @execute
   * lists inside { curly braces }, with elements separated by commas;
     currently, lists are only supported in @switch.

For an example, you can set the @fail of an object like so: 

@fail kitten=@switch("%s", "she", "The kitten allows you to pet it,
  but won't let you pick it up.", "he", "The kitten scratches and
  bites your hand when you try to pick it up.", "The kitten runs to
  the other side of the room, while looking at you strangely.")

You can include multiple functions in one message by putting a ;
(semicolon) between them; their output is catenated together.

Type "help functions" for a list of functions you can use.
*jotavars
jotavars (aka *vars):

+ *self and *this evaluate to the dbref of the object that the
JotaCode is evaluating in.

+ *player or *me evaluate to the dbref of the player executing the
command.

+ *field and *value are, respectively, equivalent to '%f' and '%v';
see @fieldloop for more information.

+ *nowhere and *home are equal the the special nowhere and home constants,
useful for some functions.
*functions
This is a list of all the functions available to programmers on 
the MUD:

Flow control:        @print(), @switch(), @strcheck(), @execute(),
                     @call(), @fieldloop(), @strloop(), @contentsloop(),
                     @countloop()
String Manipulation: @print(), @strlen(), @substr(), @lc(), @uc(),
                     @lcfirst(), @ucfirst(), @substitute(), @spformat(),
                     @strcmp(), @index(), @strloop(), @replace(), @transform()
Database Operations: @testflag(), @setflag(), @getfield(), @setfield(),
                     @g(), @s(), @location(), @toploc(), @move(), @setdest(), 
                     @player(), @object(), @exit(), @name(), @shortname(), 
                     @type(), @fieldloop(), @contentsloop()
Logic:               @eq(), @lt(), @gt(), @and(), @or(), @not(), @xor(),
                     @strcmp()
Math:                @add(), @sub(), @mul(), @div(), @idiv(), @mod(), 
                     @neg(), @log(), @ln(), @exp(), @rand(), @sin(), @cos()
Events:              @event(), @killevent(), @statevent()
Miscellaneous:       @print(), @tell(), @tellroom(), @tellchannel(),
                     @time(), @let(), @null()

To learn more about a specific function, type "help function-name".
For example, to learn more about @switch, type "help @switch()". To
learn about using functions in general, type "help programming".
*@let()
The @let() function takes a series of functions, in pairs of a %substitution
name and a value for it, and a final code argument.  The function executes
the code with the %subs set to the values given.

Usage (recall that => is equivalent to comma):
@let( "number" => @getfield( #1234, "num" ), "%{number} bottles of beer on the wall,
  %{number} bottles of beer" )
*@null()
The @null() function takes in zero or more arguments and does nothing with
them.

Usage:
@null("la", "te", "da")    -- returns the empty string
*@spformat()
The @spformat() function is used to handle a specialized but common
situation: when printing a name followed by a string (eg, 
"inky" "goes to the store"), there should be a space put before the
string if it doesn't start with certain characters (such as comma or 
apostrophe) but the user should be able to escape those characters
with a \ to force the space to be added. In general the correct way to
use this is @print("name", @spformat("string")). Note that you don't
need to use this with the osuccess, ofail, etc fields, since the mud
will automatically do the right thing there (or should); this function
is only for the times when you are printing out the name yourself
as well as the string.
*@replace()
@replace() returns its first argument, with all instances of the
second argument replaced by the third argument. For instance,
@replace("hello", "l", "x") evaluates to "hexxo".
*@substitute()
@substitute() evaluates its argument and then performs %-substitution on its result.
*@call()
The @call() function takes two arguments, a dbref and the name of a field.
The function will execute whatever text is in that field *as* that object,
with the permissions of that object. The object using the function must
either have its WIZARD flag set, or be owned by the same person as the
object where the field is located.
*@shortname()
The @shortname() function takes one string argument, a number. This 
number is the dbref of an object. The function will return the 
short name of the object (that is, the first part of a semicolon-
delimited name). If #123 is called 'red apple;apple', then 
@shortname("123") would return "red apple". If #321 is 'north;n', 
then @shortname("321") would return "north".
*@object()
The @object() function takes two string arguments, a number and a 
string of text. The number is a dbref. The MUD will look for an 
object located in the room/player/whatever specified by the dbref, 
whose name matches the string. If it finds a match, it will return 
that object's dbref. Otherwise, it will return "-1". This is the 
same sort of matching used when you type 'GET <something>'.

Usage:
@object("11", "apple")
*@exit()
The @exit() function takes two string arguments, a number and a 
string of text. The number is a dbref. The MUD will look for an 
exit located on the room/object/whatever whose name matches the 
string. If it finds a match, it will return that exit's dbref. 
Otherwise, it will return "-1". This is the same sort of matching 
used when you normally type the name of an exit (like 'north').

Usage:
@exit("11", "west")
*@ucfirst()
The @ucfirst() function simply takes a string, and makes its first 
character a capital letter. This is useful if you want to start 
a sentence with a certain string, but don't know if the string 
starts with a capital or not.

Usage:
@ucfirst("foo")
*@ucase()
The @ucase() function is a deprecated form of @ucfirst.
*@lcfirst()
The @lcfirst() function simply takes a string, and makes its first 
character a lowercase letter. This is not particularly useful but
is provided for symmetry

Usage:
@ucfirst("FoO")
*@switch()
The @switch() statement is used to test a group of strings, to see if 
any of the matches a specified string. A different output will occur,
depending on which string from the group matched the specified one.
For example, the code:

@switch("%s", "she", "It's a girl.", "he", "It's a boy.", "What is it?")

will produce "It's a girl." if "%s" is "she". It'll produce "It's a boy."
if "%s" is "he", and "What is it?" if "%s" is neither "he" nor "she".

If you want several strings to each produce the same output if matched,
the enclosed them as a list inside of {}:

@switch("%0", {"foo", "bar"}, "You typed foo or bar.", "You didn't type
  foo or bar.")
*@print()
The @print() function will just return whatever string you give it. It can
take multiple arguments. For examaple, the code:

@print("Hi there! ", "And there!")

will just return "Hi there! And there!"
*@lc()
@lc() is used to convert a string to all lower case. For example, this:

@lc("FooBar")

will return "foobar".
*@lcase()
@lcase() is a deprecated form of @lc().
*@uc()
@uc() is used to convert a string to all upper case. For example, this:

@uc("FooBar")

will return "FOOBAR".
*@tell()
The @tell() function is used to show a piece of text to a specific player.
It takes two arguments: the dbref of the player and the text to be shown.

Usage:
@tell("204", "The kitten looks at you strangely.")
*@tellroom()
The @tellroom() function is used to display a piece of text to everyone 
in a room, or to most of a room. The first argument is the room.
The second is the player or { list of players } who shouldn't see the
message; use "-1" if everyone in the room should see it.  The third
is the text to be displayed.

Usage:
@tellroom("11", "-1", "The room shakes suddenly!")
@tellroom(@location("%#"), "%#", @print(@name("%#"), " falls down."))
@tellroom("14", { *me, #1154 }, "Eeeagh!")
*@tellchannel()
The @tellchannel() function sends a piece of text to a channel. The first
argument is the channel name, and the second is the text. The channel name
is resolved in the context of the owner of the code (not the person 
executing it) with respect to permissions, aliases, etc.

Usage:
@tellchannel("tests", "Enjoy this test message.")
*@transform()
The @transform function returns a piece of text modified in a given way.
Mostly this is unhelpful. Valid values for the modification are currently:
  rot13, x, case, reverse, piglatin, monkey, and random

Usage:
@transform("case", "how are you doing") -> "HOW ARE YOU DOING"
*@execute()
The @execute() function takes one string as an argument. It will execute
that string as a piece of code. NOTE: The @execute function will not
execute MUD commands. It will only execute programs. If you pass in additional
arguments, those can be referred to in the code as %0, %1, %2, etc.

Usage:
@execute("@print(\"Test.\")");
*@testflag()
The @testflag() function takes two arguments: a number, and a string.
It will test if the object specified by the number has the flag
specified by the string. It returns "1" is the thing has the flag,
and "0" otherwise. For example, my dbref number is 204. To test if
I'm a wizard, run:

@testflag("204", "wizard")

To test if the current player is set jumpok, run:

@testflag("%#", "jumpok")
*@setflag()
The @setflag() function takes two arguments: a number, and a string.
It will set the flag specified by the string on the object specified 
by the number (or unsets it, if the string starts with !). For example, 
to set the dark flag on object #123, do:

@setflag("123", "dark")

To remove the jumpok flag from #321, run:

@setflag("321", "!jumpok")
*@move()
The @move() function is used to move something from one place to another. 
A few restrictions apply: You can only move players and objects. If you're
moving an object, the destination must be a player or room, and the object 
must be set jumpok or owned by the program's owner. If the destination is
a room, then it must also be jumpok or owned by the program's owner.

If the thing being moved is a player, the destination must be a room. That
room must be either jumpok or owned by the program's owner, and that
player must be either the player running the program or set jumpok.

Note on containers:  @move now supports moving items to a container that is
set linkok or owned by the program's owner.

This function takes two numeric string arguments: the thing being moved,
and the destination.

Usage:
@move("123", "1000")
@move("%#", "11")
*@getfield()
The @getfield() function will get a specific field (description, 
success, odrop, va, etc.) from a specific thing. That thing must
either be set examinable, or be owned by the player who owns the
program. The first argument is a number, representing the dbref
of the thing. The second is a string, representing the name of
the field.

Examples:
@getfield("204", "description")
@getfield("1092", "vc")
*@name()
This function takes one numeric string argument, the dbref of an 
object. It returns the object's name.

Usage:
@name("204")
@name(@location("%#"))
*@location()
This function takes one numeric string argument, the dbref of an 
object. It returns the object's location (dbref only).

Usage:
@location("204")
@location("%#")
*@toploc()
This function is a variant of @location(); it takes in a numeric argument
and returns the "top-level" location of that object: the object itself if
it's a room, or the room in which that object is located, otherwise.

Usage:
@toploc("103")
*@rand()
This function takes one numeric string argument, N. It returns a random
number from 0 to N-1.

Usage:
@rand("10")
*@event()
This function lets you queue an event to run. It takes three or four arguments:
the object to run on, the field to run, the delay before running, and an
optional fourth argument, a description of the event. It returns the id of
the event enqueued, or -1 if there was an error enqueueing (for instance,
if you exceeded your event limit).

Usage:
@event("103", "snrk", 5, "run inky daemon")
*@killevent()
This function lets you kill an event. You can only kill events you own, 
unless the object is set wizard. It returns the number of events killed
(currently at most 1, but this might be changed later), or -1 if there
was an error (eg, you tried to kill an event that did not exist).

Usage:
@killevent("156")         -- kills event #156
*@statevent()
This function gives you information about the event with the specified id.
The first argument gives the event id; the second gives the field desired 
about it. Valid choices are "owner", "object", "desc", and "time" (the last
giving the time in seconds before the event will fire).

Usage:
@statevent("156", "desc") -- returns the description of object #156
*@player()
This function takes one string argument, the name of a player. It 
returns the dbref of that player as a numeric string. If no player 
has the specified name, it returns "-1".

Usage:
@player("jota")
*@setfield()
The @setfield() function will set a specific field (description, 
success, odrop, va, etc.) on a specific thing. That thing must
be owned by the player who owns the program. The first argument 
is a number, representing the dbref of the thing. The second is 
a string, representing the name of the field, and the third is 
also a string, representing the value. The name of the field will
automatically be converted to lower case.
(Note: Not all fields can be set using this command. Particularly, you
cannot set any field with a space in its name.)

Examples:
@setfield("204", "description", "The spellbook is too soggy too read.")
@setfield("1092", "vc", "100")
*@eq()
The @eq() function takes N strings, and tests if they're all equal. If
they are, it returns "1". If not, "0".
Also, @eq exhibits "short-circuiting": after an unequal argument is found,
the rest of the arguments will not be evaluated.

Usage:
@eq("a", "b")
@eq("%#", "204")
@eq("a", "a", "a")
@eq("", @getfield("%!", "field"), @tell("%#", "Field has been set."))
*@and()
This is a simple boolean function. It takes N numeric strings; if
they're all "1" then this returns "1". Otherwise, it returns "0".
The @and function also exhibits "short-circuiting": if any argument
is not "1", arguments after that will not be evaluated.

Usage:
@and("1", "1")
@and(@eq("a", "b"), @eq("a", "a"))
@and("0", @tell("%#", "Not displayed."))
*@or()
This is a simple boolean function. It takes N numeric strings; if
any is "1" then this returns "1". Otherwise, it returns "0".
The @or function also exhibits "short-circuiting": if any argument
is "1", arguments after that will not be evaluated.

Usage:
@or("1", "1")
@or(@eq("a", "b"), @eq("a", "a"))
@or("1", @tell("%#", "Not displayed."))
*@xor()
This is a simple boolean function. It takes two numeric strings; if
one of the two is "1" then this returns "1". If both are "1" or neither 
is "1", this returns "0".

Usage:
@xor("1", "1")
@xor(@eq("a", "b"), @eq("a", "a"))
*@not()
This is a simple boolean function. It takes one numeric string. If it's 
"1", this returns "0". Otherwise, it returns "1".

Usage:
@not("0")
@not(@eq("a", "a"))
*@strcheck()
This function takes a series of strings as arguments. It will test if
each one is the null string (""). If not, it will return that string 
and stop. If it is null, it will continue on to the next one, and test
that. This will continue until either one of the strings is non-null, or
it reaches the last argument.  Arguments after that are not evaluated.

Usage:
@strcheck("", "", "a")
@strcheck(@getfield("123", "va"), @getfield("123", "vb"), "Not found.")
*@strloop()
This function loops over each character of the string provided as its
first argument, evaluating the code given as its third argument for
each character substituting it for the %-substitution given as the
second argument.

Usage:
@strloop("hello world", "x", @switch("%x", "l", @print("Boo!"))
  (Prints 'Boo!' three times, because there are three l's in 'hello world'.)
@strlen(@strloop("The quick red fox jumped...", "letter", @switch(@lc("%{letter}"), "e", ".", "")))
   (Count e's.)
*@contentsloop()
This function loops over every object in the location given in the first
argument, evaluating the code given as its third argument for
each object substituting it for the %-substitution given as the
second argument.

Restrictions: The location must be owned by the owner of the code or set 
examinable; or the code must be set wizard; or the location must be set
linkok or jumpok. In the last case, the location must not be set dark, and,
if it is a room and is locked, only items set visible will show up in the 
contentsloop.

Usage:
@contentsloop("14", "o", @print("In the lounge there is ", @shortname("%o"), "%c"))
*@countloop()
This function loops a specified number of times, setting a counter to 
a value each time, and running code with that counter substituted in
as the given %-substitution. It has two forms: in the three-argument
form, the counter starts at zero and goes until one less than the
value of the first argument; while in the four-argument form, it
starts at the value given in the first argument and goes until one
less than the value of the second argument. In both cases, the next
argument after the end value is the character to substitute, and the
last argument is the code to run.

Usage:
@countloop("11", "i", @tell(103, "Counting 0 to 10, value is %i"))
@countloop("5", "11", "i", @tell(103, "Counting 5 to 10, value is %i"))
*tutorial
     Jota's Tutorial for Better Building

There are eight topics in this document, as follow:

  t-concepts    Basic Concepts in Building
  t-rooms       Basic Rooms and Exits
  t-objects     Basic Objects
  t-exits       Intermediate Rooms and Exits
  t-locks       Locks and Keys
  t-verbs       Advanced Rooms and Exits
  t-nouns       Advanced Objects
  t-programs    Programming (this section by Miron)

To read about a particular topic, type "help topic" (For 
example, "help t-rooms" or "help t-locks").

New builders should probably start with "help t-concepts".

If you notice anything that missing's or mistaken in this 
tutorial, feel free to tell Jota (see "help mail" to learn 
how to send messages).
*t-concepts
There are four basic type of objects on the MUD: Players, 
Rooms, Things, and Exits. Players are things like you, and
anyone else you meet online. Rooms are like rooms in any
adventure game; they're the locations like 'Living Room' 
and 'Backyard'. Things are objects that can usually be 
carried around. Exits are commands created by you, and 
they usually take the player from one room to another.

You can type in commands to do things. Some of these commands 
are exits, like 'north' or 'enter'. Others are built-in MUD 
commands, like 'say' or '@dig'.

If you've created a room, object or exit that you don't want 
anymore, you can get rid of it with the @recycle command. If 
it's nearby, you can type "@recycle <name>", where <name> is 
the name of the thing to be destroyed. Otherwise, you can still 
type "@recycle #<number>", where <number> is the number you were 
given when you created it.

[You should read either t-rooms or t-objects next.]
*t-rooms
(Have you read "help t-concepts" yet? If not, you should 
read that first.)

When you're going to create an area, the first thing you'll 
need to do create some rooms. And the first thing you'll 
want to do when creating a new room is to go someplace like 
the Open Chamber, that you can build off of. 

When you get there, type "examine here". It should tell you 
something like:

Open Chamber #881R Owner: Jota Home: #0 builder linkok jumpok examinable
[....]

The number that comes right after the room name (in this 
case, #881) is called a 'database reference', or 'dbref' for 
short. Each player, room, thing, and exit has its own unique 
dbref. Keep track of this number, you'll need it later.

[Type "help t-rooms2" for more information.]
*t-rooms2
OK, so now you know where you're coming from. But where are 
you going? Think up a name for the room you want to create. For 
the sake of this tutorial, I'll call it 'My Place'. Create the 
room by typing "@dig My Place". You should see something like:

My Place has been created as #999.

When you do it, though, the dbref probably won't be #999. 
Remember what number it is; you'll need it for the next part.

Now that your room exists, you'll need to create a way to get 
there. You do this by creating an exit that leads to your room.
Usually, an exit will lead in a compass direction. So, find a 
compass direction that no one has claimed yet. In this example 
we'll use southwest. Type "@open southwest;sw=#999", where #999
is the dbref you saw when you did @dig. The reason for having 
the exit called southwest;sw is so that people can type either
'southwest' or 'sw' to enter your room.

[Type "help t-rooms3" for more information.]
*t-rooms3
Now that there's a way into your room, you should try it out.
Type in "southwest" (or whatever direction you used). The room 
will probably be pretty boring ("You see nothing special."), 
and there won't be any obvious exits. So let's first create a 
way out. Do you remember the dbref for the Big Dig (or whatever 
room you were in when you started)? Well, now is when you need to 
use it. First decide what direction you need to go to leave your 
room (if the entrance was 'southwest;sw', the exit should be 
'northeast;ne'). Then type "@open northeast;ne;out=#881" -- but 
use the name that you want the exit to have, and the dbref of the 
room where you started. If the entrance to your room was 'east;e', 
use 'west;w'.

Now, before we finish this part of the tutorial, you need to 
describe the room you just made. You do that by typing something 
like "@describe here=This pad is rad. The walls are red, and so's 
the bed. A bad cat wearing a cap is taking a nap on the mat, 
Jack." Make sure you don't hit enter until you reach the end of it.

[You should read "help t-exits" next. It's very important.]
*t-objects
(Have you read "help t-concepts" yet? If not, you should 
read that first.)

This section describes how to make and use objects. You've 
probably seen a number of object lying around the MUD. Well, 
you can create your own! Let's say you want an apple. Then you 
just need to type "@create apple", and an object called 'apple' 
will appear in your inventory. Next, you should give your object 
a description. In the case of the apple, you might type 
something like "@describe apple=It's big and big, and it looks 
sweet and juicy." Make sure you don't hit enter until you 
finish typing the description.

Now, you should probably replace the boring messages that are shown 
when people pick up and drop objects. Instead of 'Jota dropped ming 
vase.', wouldn't you like to see 'Jota gently set the ming vase on 
the ground.'? Well, there are four messages that are used for these 
sorts of things, and they're called @succ, @osucc, @drop, and @odrop.

[Type "help t-objects2" for more information.]
*t-objects2
The @success message is shown to a person when he/she picks up 
an object. You set this message by typing something like "@success
refrigerator=It takes all the strength you can muster, but you 
manage to lift it." This message will only be seen by the person 
who is picking up the object.

The @osuccess message is seen by other people in the same room when 
someone picks up an object. You set this by typing something like
"@osuccess refrigerator=almost passes out from exertion as %s picks 
up the refrigerator." The @osuccess message is not seen by the person 
picking up the object; it's only seen by the other people in the 
same room.

You may have noticed that when we set the @osuccess message, we 
didn't include any name at the beginning of the message. That's 
because whenever someone picks up an object, the MUD will 
automatically print that person's name before printing the 
@osuccess. 

[Type "help t-objects3" for more information.]
*t-objects3
You may also notice the %s in the @osuccess. Anyplace you include %s 
in an @osuccess or @odrop, it will be replaced by 'he' or 'she'. For 
example, if gecko were to pick up the fridge, we would see 'gecko 
almost passes out from exertion as she picks up the refrigerator.' 
There are other percent substitutions available. If you use %o, it 
will appear as 'him' or 'her'. You can get a whole list of these by 
typing "help substitutions".

The @drop message is shown to a player who drops the object. This 
should look something like "@drop refrigerator=Your weary arms drop
the heavy refrigerator with a thud." This will only be seen by the
person dropping the object, not by anyone else.

The @odrop message is seen by people in the room when someone drops 
an object. You can set this by typing something like "@odrop 
refrigerator=drops the refrigerator with a thud." This message will 
not be seen by the person who's dropping the object, but it will be 
seen by the other people in the room.

[Read "help t-rooms" if you haven't. Otherwise, read "help t-locks".]
*t-nouns
(Have you read "help t-concepts", "help t-objects", and "help t-locks",
yet? If not, you should read them first.)

Sometimes you'll want to have an object with a name like 'red rubber
ball'. But you want the player to be able to type "get red ball" or 
"drop rubber ball". Is there a way to allow players to refer to an 
object by more than one name? Yes!

When you create the ball, use a command like "@create red rubber 
ball;red ball;rubber ball;ball". When the ball is sitting in a room
or in someone's inventory, it will only appear as 'red rubber ball'.
But the player will be allowed to call it by any of the names in the 
list ('red rubber ball', 'red ball', 'rubber ball' or just 'ball').

If you've already created an object without synonyms, but want to add
synonyms to it, use the @name command: "@name big motorcycle=big
motorcycle;motorcycle;big motorbike;motorbike;big bike;bike"

[Type "help t-nouns2" for more information.]
*t-nouns2
There might possibly be times when you have an object that should 
only be held when another object is held. Normal locks can prevent
someone from picking something up a piece of radioactive waste
without lead gloves, but don't mind at all if you then drop the 
gloves.

Luckily, the puzzle flag can help. If an object is set puzzle, then 
the player will be forced to drop that object if he ceases to pass
the object's lock. For example, if you have the above-mentioned
radioactive waste and lead gloves, you can type "@lock radioactive
waste=lead gloves", and then "@set radioactive waste=puzzle". It will 
be impossible to pick up the waste without the gloves, and if a 
player drops the lead gloves while carrying the radioactive waste, 
he/she will automatically drop the waste too.

[Read "help t-verbs" if you haven't. Otherwise, read "help t-programs".]
*t-exits
There are a few (well, four) things you ought to do to any exit 
you create. These four things are called @success, @osuccess, @odrop, 
and @describe. We'll start with the easiest one, @describe.

Just about anything on the MUD can have a description -- players, 
rooms, objects, and even exits. Let's say you have a living kitchen. 
There's a hallway to the south. Wouldn't it be nice to be able to
type "look south", and see "You look down the hall, but don't see
anything interesting."? All you need to do is type "@describe south=
You look down the hall, but don't see anything interesting." Or if 
you're at the base of a mountain, and a path leads up, you might type
"@describe up=The path looks steep and dangerous, but you could 
probably manage it."

The @success message on an exit is shown to the person who is using 
the exit. In the case of the mountain path, you might do something
like "@success up=You begin the arduous climb up the mountainside."
The @success message is only seen by the person using the exit.

[Type "help t-exits2" for more information.]
*t-exits2
The @osuccess message on an exit is shown to people in the same 
room as an exit, when someone goes through an exit. In the case of 
the mountain path, the people at the bottom of the mountain will 
see the @osuccess for 'up' whenever someone goes up the mountain. 
You set it by typing "@osuccess up=starts climbing up the trail. 
It's not long before you can't even see %o anymore." The @osuccess 
is not seen by the person using the exit; it's only seen by the 
other people in the room.

You may have noticed the %o in the @osuccess. Anyplace you include 
%o in an @osuccess or @odrop, it will be replaced by 'him' or 'her'. 
For example, if gecko were to climb up the trail, we would see 
'gecko starts climbing up the trail. It's not long before you can't 
even see her anymore.' There are other percent substitutions that you
can use. If you use %s, it will appear as 'he' or 'she'. You can get 
a whole list of these by typing "help substitutions".

[Type "help t-exits3" for more information.]
*t-exits3
You may have noticed that when we set the @osuccess message, we 
didn't include any name at the beginning of the message. That's 
because whenever someone uses an exit, the MUD will automatically 
print that person's name before printing the @osuccess.

The @odrop message is seen by people in the destination room whenever
someone uses an exit. In the case of the mountain trail, whenever
someone climbed up the mountain, the people on the mountain top would
see the @odrop. To set this, type something like "@odrop up=emerges
from between the trees, looking no worse for wear." The @odrop is not
seen by the person using the exit; it's only seen by the people who are
already at the destination.

[Read "help t-objects" if you haven't. Otherwise, read "help t-locks".]
*t-locks
Sometimes, you'll want to have an object that other people can't pick
up (perhaps it's too heavy, or it may be bolted down.) You may want to
have an object that only certain people can pick up (like a cat, who 
will let some people carry it, but will stay away from others). You 
might have a door that can only be opened by someone who is carrying 
the right key. For anything like this, you need a lock.

You can set a lock on an object or exit with the @lock command. You 
might do something like "@lock Austin=me". If you do that, Austin will
only allow you to pick him up. If you try to pick up Austin, you'll 
see the @success message as usual, and everyone else will see the 
@osuccess, and you'll have Austin in your possession. However, if 
anyone else tries, he/she will fail to acquire the feline in question. 
More on this later.

The part of the @lock command that comes after the equals sign is 
called the 'key'. In the case of Austin, the key was 'me' -- the word
'me' stands for whatever player is setting the lock. 

[Type "help t-locks2" for more information.]
*t-locks2
Let's say you wanted only gecko to be able to pick up the cat. Then 
you would type "@lock Austin=*gecko". The * sign is very important: 
it tells the MUD that you mean the player 'gecko', wherever she is, 
and not just some nearby object with the same name. Now gecko is able 
to pick up Austin, but you can't. If you wanted either you or gecko 
to each be able to pick up Austin, you would type "@lock austin=
me|*gecko". The | sign means OR. A person trying to pick up the cat 
will succeed if he/she is you, or if he/she is gecko. 

You can also make the key an object. Let's say you have an object 
called 'catnip'. You might try "@lock Austin=me|catnip". Then anyone 
carrying the catnip with be able to pick up Austin, and you'll be able
to pick up Austin (whether you're carrying the catnip or not). On the
other hand, you could do "@lock Austin=me&catnip", then only you will 
be able to pick up the cat, and only if you're carrying the catnip. 
The & sign means AND. A person trying to pick up the cat will succeed 
if he/she both is you, and is carrying the catnip.

[Type "help t-locks3" for more information.]
*t-locks3
There's another symbol that's used in locks. The ! sign stands for
NOT. If I type "@lock Austin=!*gecko", then anyone but gecko will be 
able to pick up Austin. You can also use parentheses along with the |, 
&, and ! signs, to group things together.

The locks on doors work in exactly the same way as the locks on objects.
If you don't pass the lock, you will not be able to walk through the 
exit. Let's say you have a magical door to the north that will 
automatically open for gecko. Anyone else, though, needs to be carrying 
a special gold key. First you need to "@create gold key", and then you 
can type "@lock north=*gecko|gold key". From them on, gecko can walk 
through the door at will, but anyone else will need to be carrying the
gold key.

You can also remove the lock on an object or exit by typing "@lock 
Austin=" or "@lock north=". If you do this, then anyone will be able to
pick up Austin or walk north.

[Type "help t-locks4" for more information.]
*t-locks4
Now, normally whenever you try to pick up an object, and you fail, 
you see "You can't pick that up!". If you fail to use an exit, you 
usually see "You can't go that way.". This is, to put it bluntly, 
boring. If you try (and fail) to pick up Austin, you ought to see 
something like 'Austin scratches your arm, and runs away from you.' 
Well, it's easy to set that up. Just type "@fail Austin=Austin 
scratches your arm, and runs away from you." If you want someone who 
tries to pass through the magic door without the gold key to see "The 
doorknob feels warm to your touch, but it won't turn. The door must be 
locked.", then just type "@fail north=The doorknob feels warm to your 
touch, but it won't turn. The door must be locked."

The @ofail message is also very useful, for alerting everyone else in 
the room of the failure. You can use it just like the @osuccess 
message (except @ofail is shown when someone fails to do something),
by typing "@fail Austin=tries to pick up Austin, but instead receives 
a nasty scratch to the arm." You might also try "@ofail north=tries 
to open the heavy door, but fails to even turn the knob."

[Next you should read either "help t-nouns" or "help t-verbs".]
*t-verbs
(Have you read "help t-concepts", "help t-rooms", and "help t-locks",
yet? If not, you should read them first.)

Sometimes you'll want to create a verb that doesn't do anything 
except print text on the screen. You don't want it to actually take 
you anywhere when you type it, or actually do anything. Verbs like 
this are called 'fake actions'.

You can create these in the same way as normal exits. Let's say 
you're in your living room. You have a couch here, and you'd like 
people to be able to sit on the couch. You start by opening an exit
to nowhere (dbref #-3). You do this by typing "@open sit;sit on 
couch;sit down;sit on the couch=nowhere". Now, to prevent 'sit' from 
appearing in the 'Visible Exits:' list, type "@set sit=dark". Last, 
you just need to set the @success and @osuccess messages appropriately
("@success sit=You sit down.", "@osuccess sit=sits on the couch.").

[Type "help t-verbs2" for more information.]
*t-programs
(Please read all the other parts of the tutorial first, if you haven't
already.)

If you want to evaluate information not available at the time you set
up an object, you can use programs to do so. Programs are much like
substitutions, only more flexible. For instance, if a player takes up
an object, you might want to know his/her/its gender. The @switch
function is ideal for that:

@desc cute baby dress=@switch("%s", "he", "The cute baby dress is light
blue", "she", "The cute baby dress is pink", "The cute baby dress is an
icky green with orange stripes.")

As you see, the @switch funtion takes an argument -- in this case the
"%s" after the bracket -- and an alternating list of possibilities and
their results. The last string is the default, which results if none of
the possibilities matches the argument.

[Type "help t-programs2" for more information.]
*t-programs2
@switch("zork", "xyzzy", "That was xyzzy", "plugh", "That was plugh",
"That was something else") will always result in "That was something
else", as "zork" (the argument) doesn't match any of the other
possibilities.

In fact, every element of the list inside the brackets is an argument;
what is done with it depends on the function.

A function always evaluates arguments. Such an argument can be anything
you want: even other functions are perfectly valid (and indeed
necessary for certain effects).

@print(@lcase("HeLLo MY frIend")) will print "hello my friend".

[Type "help t-programs3" for a complex final example or "help
programming" for a more general description of programs.]
*t-programs3
Example: Let's say the "press button" object's dbref is 666.

@succ press button=@print("%n ", @execute(@getfield("666", "osucc")))
@osucc press button=@print("presses the button, and a sign
   lights up, saying, \"%n's dbref is ", @player("%n"), ".\"")

Since this object's creator was too lazy to copy the @osucc to the
@succ field, he did that with a small program. Note that the @succ
message will automatically change as the @osucc does.

Now, if Ashanti (dbref #867) presses the button, everyone will read
        Ashanti presses the button, and a sign lights up, saying,
        "Ashanti's dbref is 867."

The "\"" constructs are quotes inside a string. Since a quotation mark
itself delimits a string, the backslash is needed to print it.

[Now you should read the section about "programming" to get going.]

[The tutorial ends here.]
*@add()
This adds multiple numbers together. It takes N numeric strings and
returns their sum.

Usage:
@add("10", "31")
The result is "41".

@add("21", "40", "-5")
The result is "56".
*@sub()
This subtracts one number from another. It takes two numeric strings
and returns their difference.

Usage:
@sub( "10", "5" )

The result is "5".

@sub( "5", "10" )

The result is "-5".
*@mul()
This multiplies numbers together. It takes N numeric strings
and returns their product.

Usage:
@mul( "6", "9" )
The result is "54".

@mul( "-2", "5", "-6" )
The result is "60".
*@div()
This divides one number by another. It takes two numeric strings
and returns their quotient.  It is illegal to divide by "0".

Usage:
@div( "42", "7" )

The result is "6".
*@neg()
This negates a number.  It takes a single numeric string and
returns its negative.

Usage:
@neg( "78" )

The result is "-78".
*@time()
This returns various time values based on the current time
of day where the MUD is being run.  It takes one or two
argument. If the second is given, it is taken as a seconds-since-1970
time value; otherwise, the current time is used. The first is a 
string argument which determines the time data to return.  
If the argument is:

  sec		Current seconds past the minute.
  min		Current minutes past the hour.
  hour		Current hour of the day.
  mday		Current day of the month.
  mon		Current month (0=Jan, 11=Dec)
  year		Current year - 1900.
  wday		Current day of the week (0=Sun, 6=Sat)
  yday		Current day of the year (0 = Jan 1st)
  isdst		1 if time is daylight savings, 0 otherwise
  timestamp     Current number of seconds since the epoch
  string        The current date/time as a string

Usage:
@print("The current date is ", @add(@time("year"), "1900"), "-", 
        @add(@time("mon"), "1" ), "-", @time("mday"))
*@fieldloop()
The @fieldloop() function allows you to execute the same code over all the
fields starting with a given pattern.

Usage:
@fieldloop( "1234", "a_", @print( "Field is %f, value is %v" ) )

The %f is replaced with the name of the field, and the %v is
replaced with what the field is set to (the "value").  This example
will execute the @print statement for each field of object #1234
that starts with the characters "a_".

*maths
The MUD has several mathematical functions for use with objects:
@add, @sub, @mul, @div, @neg, @idiv, @mod, @log, @ln, @exp, @sin, and @cos.

Type 'help @function' for more information on these.
*math
The MUD has several mathematical functions for use with objects:
@add, @sub, @mul, @div, @neg, @idiv, @mod, @log, @ln, @exp, @sin, and @cos.

Type 'help @function' for more information on these.
*events
The MUD has a new system for timed events. You can interact with it
both via regular commands as well as by jotacode functions. The latter
are documented under 'help functions', while the former have their own
help entries, but a quick summary:
  @event object = field : delay  -- run this field as an event in delay seconds
  @ps [user]                     -- list enqueued events [owned by user] 
  @killevents eventid            -- delete event

Note that in events, %# is set to the person who triggered the event, %! to the
object on which the event is running, and the numeric substitutions (%0 .. %9)
are unset. Also note that any text returned by the code will be ignored, so
if the field just contains a string or @print("stuff"), you won't see any
output. If you want the text to be seen, you will need to use @tell() or
@tellroom().

There are two limitations on the number of events you can have running: a 
queue limit and a spawn limit. The queue limit is the number of events you
can have running at once: this is currently 20. The spawn limit is the number
of events you can spawn from other events: this is also currently 20, with
the counter being incremented every time you spawn an event from another 
event and lowered by 3 every 3 minutes.
*@event
@event is used to enqueue an event. The event enqueued is for a specific
object and field, and will be run after the specified number of seconds. 
At the time the @event command is run, you must own the object, be a wizard, 
or the object must be set examinable. At the time the event fires, the object
must exist (eg, not have been recycled) and you must have the same permissions
to read the field as before.

Usage:
@event monkey = banana : 10    (runs the banana field on monkey in 10 seconds)
*@ps
@ps is used to list events owned by a specific person. Non-wizards can only
list their own events.

Usage:
@ps      (displays all events owned by you)
@ps inky (displays all events owned by inky [wizard-only])
*@killevents
@killevents is used to remove one or more running events. You must be either 
the owner of the event or a wizard to delete it. You may want to run @ps to
find out the id of an event.

Usage:
@killevents 123 456 (kills events with ids 123 and 456)
*@strlen()
Returns the length of the string argument.

Usage:
@strlen( "this is a test" )

The result is "14"
*@strcmp()
Returns -1, 0, or 1, depending on whether the first argument is
alphabetically before, equal to, or after the second.

Usage:
@strcmp( "hello", "goodbye" )

The result is "1"
*@substr()
This takes two or three arguments and extracts substrings from the first
argument based on the remaining one(s).

Usage (3 arguments):
@substr( "alpacas are funny", "8", "3" )

Result is "are".  If the second argument is negative, the substring starts
that far from the end of the string instead.  If the third argument is
negative, the length is calculated to leave that many characters off the
end of the string.

Usage (2 arguments):
@substr( "monkeys are funnier", "12" )

Result is "funnier".  Like the 3-argument form, if the second argument is
negative, the substring starts that far from the end of the string
instead.
*@index()
This function returns the position of the first occurrence of the second
argument in the first argument.  The third argument, if given, says
where to start looking.  Positions are based at 0.  If the substring
is not found, the function returns "-1".

Usage:
@index("monkeys like monkeys", "key")    => 3
@index("monkeys like monkeys", "key", 6) => 16
*faq
Prints the URL of the current ifMUD FAQ.
*@lt()

This function compares two values and returns "1" if the first is less
than the second, and "0" if the first is greater than or equal to the
second.

Usage:
@lt( "5", "9" )

*@gt()

This function compares two values and returns "0" if the first is less
than or equal to the second, and '1" if the first is greater than the
second.

Usage:
@gt( "5", "9" )
*@mod()

This function returns the remainder of the result of a division of the two
arguments.

Usage:
@mod( "21", "9" )
@mod( "21", "-9" )              both result in "3".

@mod( "-21", "9" )
@mod( "-21", "-9" )             both result in "-3".
*@idiv()

This function divides the two arguments and returns the integer portion of
the quotient.

Usage:
@idiv( "21", "9" )  results in "2"
*@type()
This function takes a dbref (without the # sign), and returns what 
type of object it is:

	4	thing
	3	exit
	2	player
	1	room
	0	garbage
	-1	unused

Usage:
@type("123")
@type("%0")
*@log()
This is a logarithm function. It takes two arguments (we'll call them A 
and B), and returns the log base A of B. For example, @log("3", "81") 
will return "4".
*@ln()
This is a natural logarithm function. It takes one argument, and will 
return the natural logarithm of that argument. For example, @ln("20") 
will return "2.99573227355399".
*@exp()
This is an exponent function. It takes two arguments (we'll call them A 
and B), and returns the value of A raised to the B power. For example, 
@exp("10", "6") will return "1000000".
*@sin()
This function takes one argument, an angle in radians, and returns the
sine of that angle. For example, @sin("3.14159265") returns 
"3.58979302983757e-09" (due to our pi approximation).
*@cos()
This function takes one argument, an angle in radians, and returns the
cosine of that angle. For example, @cos("3.14159265") returns -1 (but
be aware that, like @sin(), @cos() may return slightly incorrect
values depending on the precision of the pi approximation you use).
*@g()
This function is a shortcut for @getfield(). It takes one argument, which 
we'll call X. If the object calling the function has its "varobj" field 
set, it will look at the object referred to by that field, and return 
the value of the X field on that object. Otherwise, it will return the X 
field of the calling object.
*@s()
This function is a shortcut for @setfield(). It takes two arguments, which 
we'll call X and Y. If the object calling the function has its "varobj" 
field set, it will look at the object referred to by that field, and set 
its X field to contain Y. Otherwise, it will set the X field of the 
calling object to Y.
*@setdest()
The @setdest() function changes the destination of an exit. It takes two
arguments: the dbref of the exit to redirect and where to point the exit.
The exit must be owned by the program's owner. The new destination must
be either a room or the string "home" or "nowhere". If a room, the room
must be owned by the program's owner or set linkok.

Note: Since the order of execution for an exit is success, move player,
drop, setting the destination of %! in the success field  can be used
to move the player to the new destination, and / or the drop field can
be used to change the destination but move the player to the previous
one.

Usage:
@setdest("%!", "14")
@setdest("123", "nowhere")
@setdest("789", "-2")
*channels
Channels are based roughly on the irc model. Here's a summary 
of the commands (there's also help on the individual commands):
 
  @makechannel foo  -- Create a (public, unmoderated) channel named foo
  @joinchannels foo  -- Join channel foo (which must be public)
  @leavechannels foo -- Remove yourself from channel foo
  #foo hi
  #foo ..inky yo    -- talk on channel foo
  #foo :cries!
  ;meep             -- talk on the last channel mentioned   
  %foo hello        -- talk on channel foo without setting the "last channel"

  @statchannel foo -- Print info on channel foo
  @listchannels    -- List all public channels

  @mutechannel foo -- gag/ungag a channel temporarily without leaving it

  @recapchannel foo -- see what was said recently on a channel

  @synonymchannel foo -- see what (global) synonyms are set up for foo
  (@addalias, @remalias, and @listaliases exist for personal aliases)

  @topicchannel foo = This is the foo channel -- Set topic for channel foo

  @adhoc tempfoo = inky   -- Create a temporary channel and add inky to it

  The following commands require you to be a channel pope on the
  channel:

  @flagchannel foo = private   -- Make channel foo private 
  @flagchannel foo = inky : pope -- Make inky a channel pope on foo
  @addtochannel foo = inky     -- Make inky a member of private channel foo
  @remfromchannel foo = inky   -- Remove inky from channel foo
  @delchannel foo              -- Delete channel foo, removing all its members
  @renamechannel foo = bar     -- Changes the channel's name to bar
  @synonymchannel foo = bar    -- Adds bar as a global synonym for channel foo
  @synonymchannel foo = del : bar -- Removes bar as a global synonym for foo
  @mergechannel foo = bar      -- Merge channel foo into channel bar

  If there are no popes on the channel, type @popeme to become one.

  The new channel-category system adds the following wizard-only commands:
    @makecategory games/cards  -- Creates category games/cards
    @delcategory  games/cards  -- Deletes category
    @renamecategory games/cards = entertainment/cards -- Renames category
  More generally, you can also refer to channels by their full name:
    #games/cards/poker Do you like dogs playing poker?
    @rename #games/cards/poker = #homes/fireplaces/tools/poker
    @listch games              -- Lists everything in the games category
*@makechannel
@makechannel creates a channel with the given name. If the channel name
contains capital letters, these *will* be preserved. By default
channels are created with no flags set (ie, they are public and
unmoderated) and no description. A list of initial flags can be given 
with the = sign,if desired. When the channel is created, the creator will 
be the sole member and sole channel pope. You may not create a channel with 
the same name as another, ignoring capitalization (so the existence of 
"alpaca" prevents the creation of "ALPACA"), and also may not create a
channel with the same name as a category. By default channels are created
into the 'unclassified' category, although you can specify a category
explicitly if you desire.

Usage:

@makechannel mOnKeY
@makechannel Alpaca = moderated private
@makechannel #animals/mice = topiclock
*@renamechannel
Renames a channel. This is convenient for changing a channel name without
having to destroy and recreate it.

Usage:

@renamechannel foo = bar
@renamechannel unclassified/foo = bar (renames to unclassified/bar)
@renamechannel unclassified/foo = games/ (switches foo to the games category)
@renamechannel unclassified/foo = games/foo (ditto)
*@aliaschannel
A deprecated version of the @synonymchannel command. Please see "help
@synonymchannel" instead.

Or, you might mean "help @altname", for the player-alternate-name system.
*@synonymchannel
Adds, removes, or lists the global synonyms set up for a channel. These global
synonyms are different from the personal aliases you can set up (see help 
channel-aliases for details on those). Global synonyms are intended for cases
where a channel could logically have multiple names or appear in multiple 
categories, such as #trek vs #startrek, or #legal vs #law. You must be
a channel moderator to add or remove a global synonym, although anyone can
list a channel's synonyms. 

Usage:
@synonymchannel foo             -- Lists all the synonyms set up for foo
@synonymchannel foo = games/bar -- Adds games/bar as an synonym for foo
@synonymchannel foo = bar       -- Adds bar as an synonym for foo in whatever
                                   category foo is in
@synonymchannel foo = del : bar -- Removes bar as an synonym for foo
*@mergechannels
Merges one channel into another, combining names, bbs, and membership
lists. This is primarily a cleanup tool, and hence can only be used by
wizards and people who are popes and both channels (ie, people who
could do most of the work manually already.)

Usage:
@mergechannel useless = keeper -- Merges #useless into #keeper

*@joinchannels
Adds you as a member to the given channel. You may not @join
channels which are set private (to add someone to a private channel,
use @addtochannel). You can specify multiple channel names if you so desire.

Usage:
@joinchannels monkey mice alpaca
*@leavechannels
Remove yourself from a channel. This also makes you no longer a
channel pope. You can specify multiple channel names if you so desire.
If everyone leaves a channel, it is automatically deleted. Using the
'quiet' argument will avoid announcing your departure to the channel.
Usage:

@leavechannels baseball football basketball
@leavec monkey bananas = quiet
*#
# followed by a channel name sends a message to that channel, in the
same style as say/pose/@emit/@think. You must be on a channel to talk to it.
% is identical to #, but does not change your last-channel-talked-on.

See also help on the following options/fields which customize the 
behavior of channel conversation:
  decoderot13

Usage:

#foo hello!  (prints [foo] inky says, "hello!")
#foo :waves. (prints [foo] inky waves.)
#foo @emit meep (prints [foo] (from inky) meep)
#foo @think zoinks! (prints [foo] inky . o O ( zoinks! ))
#foo @rot13 this is in rot13 (prints [foo] inky says, "guvf vf va ebg13"
*%
% is identical to #, but does not change the your-last-channel-talked-on. 
Note that % cannot be used as a substitute for # in the general case: 
@statc %foo is illegal, for instance (or, rather, it means @statc #%foo).

*;
; may be used as an abbreviation for "send to the last channel I
referenced." ; by itself tells you what the name of the last channel is.

Usage:

;:blibbles.  (prints [foo] inky blibbles., assuming foo was the last
              channel inky spoke to.)
;            (prints "Your default channel is currently "foo".")
*@statchannel
Prints the name, description, creation time, last access time, and
userlist for the given channel. Users who are channel popes have a +
before their name in the userlist, and users who are channel cardinals
have a -. If no channel name is given, instead lists just the name and topic
for all channels you are on. The argument can consist of multiple
channels.

You may also specify flags to adjust the behavior: -on will make it
only display logged-on users, and -member/-cardinal/-pope will make it
only display members of at least that level.

Usage:

@statchannel (Lists full details for your default channel)
@statchannel gweep (Lists full details for "gweep", assuming it is a 
                    non-ambiguous reference)
@statchannel foo bar baz (You can give multiple channels)
@statc foo -on -pope (lists only logged-on popes)
*@listchannels
Gives a short listing of channels/categories, either beginning with a prefix 
or in a specified category. If no argument is given, lists all top-level 
categories. If an argument is given beginning with a #, lists all
channels starting with that prefix (unless this is an exact match to a
channel name, like #C; in that case, use @listc #c* to indicate all
channels). If an argument is given not beginning with a #, that is
assumed to be a category name, and it lists all channels and
categories in that channel.

@listchannel knows the following flags:
  -name (don't trim long channel names)
  -topic (display name + topic (this is the default)) 
  -last (display name + last message time)
  -created (display name + create time)
  -byname  (sort by name)
  -bycreated (display channels from earliest-created to most-recently
	      created, instead of alphabetically.
  -bylast (display channels from least-used to most-recently-used,
           instead of alphabetically)
  -all (display all channels)
  -member (display channels of which you're a member)
  -nomember (display channels of which you're not a member)
  -like <string> (display channels with <string> in their name)
  -flag <flag> (display channels which have this flag set (on you or the channel))
  -tail <n> (display only last <n> lines of output)
  -categories (display all categories, or all categories in argument)
  -recent [<n>] (display the last 10 (or <n>) talked-on channels; this is 
                 precisely an abbreviation for -all -bylast -tail <n>)
  -count (display a count of channels instead of listing each one)

You may specify the sort flags with + or - before their name, eg -byname or
+bylast. With +, byname sorts alphabetically and the others sort youngest to
oldest. With -, byname sorts reverse alphabetically, and the others sort
oldest to youngest. The default flags flags are +byname and -topic, unless 
you have the listflag field set on yourself, in which case that field's
value is taken as the default.

Usage:

@listchannels
@listchannels unclassified (lists channels in the unclassified hierarchy)
@listchannels #s (prints only channels starting with "s")
@listchannels +bycreated (prints channels in order of creation time)
@listchannels -name +bylast #foo (etc)
@listchannels -recent (prints out last 10 channels talked on)
@listchannels -recent 20 (prints out last 20 channels talked on)
@listchannels -categories (prints out all categories)
@listchannels -categories ifmud (prints out all categories in ifmud)
*@mutechannels
Gags the given channel temporarily, either until you log out or until
you unmute it. You can still talk on the channel when it is muted but
will not hear anything sent to it. Once a channel is muted, @mutec channel
a second time will unmute it (unless the 'explicitmute' @option is
set, in which case you'll need to use '@unmute channel'). You can give
multiple channels as arguments. If there are no arguments, the
channels you have muted are listed instead. 

If you give '*' as the channel name, it will clear the list of muted channels.
If you have no muted channels, then it will invert your mute list -- from
then on, until you @unmute *, any channel which is *not* on your mute list
will be considered muted, and any channel which is on your mute list will be
considered muted. This is similar to setting the nochannel flag on yourself,
but you can customize a few channels to unmute. This channel inversion will
go away as usual when you log out.

Normally, if nobody has talked on a channel for 15 minutes, the next time
somebody talks on it, it will be automatically unmuted for you (before they
say whatever it is). If you don't want this to happen, you can do
@mutec channel = fixed.

See also help on the following options/fields which customize the 
behavior of @mutechannel: 
  nomutetimeout, mutetime

Usage:
@mutechannel                         (Lists channels)
@mutechannel monkey pants sandwiches (Toggles the mute status of these three)
@mutechannel food = fixed      (Same as above, but tells it not to auto-unmute)
*@unmutechannel
A synonym for @mutechannel (q.v.)

*mutetime
The mutetime field is taken as a value (in seconds) for which the
channel will be muted. If there's no conversation for this long, then
the next time someone talks on the channel, it'll be automatically
unmuted. 

*@recapchannel
Recap the last lines from the channel. If you don't specify any flags it
recaps from your current channel; otherwise you can specify the number of 
lines, who to recap, and/or a substring match test to specify lines to recap.
Flags:
  -lines <number> (display <number> lines instead of 10; see 'help recapamount')
  -range <number>-<number> (display lines in this range from the recap)
  -user <player>  (display only lines by <player>)
  -match <string> (display only lines containing <string>)
  -urls           (match lines with urls)
  -check          (don't display any text if the channel has no recap)
  -rot13          (pass all text through a rot13 filter)
  -next           (display starting from after your last recap)
  -prev           (display starting from before your last recap)
  -conv           (recap to start of conversation; see 'help recapconv')
  -noconv         (ignore recapconv option, if set; see 'help recapconv') 
  -context <line> (display <line> lines of context around each match)
  -tag <none|time|lines> (specify the tag on each line of recap)
  -paranoid       (display appropriate (Username) before each line of recap)

Instead of giving flags, you can specify "clear", and it will clear the recap
buffer on the channel. You must be a channel pope to do this.

Channels which have the "norecap" flag set cannot be recapped, and those
with the "memberrecap" or "private" flag set can only be recapped by 
channel members. Channels which have the "joinrecap" flag can only be
recapped by members, and people cannot view recap for before the time
they joined the channel.

If you use the -next or -prev command, the recap will start based on
your last recap position, and will recap either 10 lines or the value
you have stored in your 'recapamount' field.

See also help on the following options/fields which customize the 
behavior of @recapchannel: 
  gagrecap, recapconv, recapconvdefault, recapsetlast, recaptime, 
  recapamount, recapformat

Usage:
@recapchannel #monkey = 10           (Recaps 10 lines from #monkey)
@recapchannel #monkey = all          (Recap everything from #monkey)
@recapchannel #monkey = 10-20 
(Recaps lines from #monkey starting 10 lines ago and going up until 20 lines ago)
@recapchannel #grubshack #monkey = -user mamster -match snrk 
(Recaps 10 lines from mamster matching "snrk" on #grubshack and #monkey)
@recapchannel #sekrit = clear        (Clears the recap buffer on #sekrit)
@recapchannel * = 10 (Recap from all channels you're a member on)
*@flagchannel
Sets a channel flag, either on the current channel or on a user on the
channel. Flags may be unset by prefixing them with a !. The current
valid channel flags may be seen with 'help channel-flags'. You must be
a channel pope to set flags on that channel.

Usage:

@flagchannel foo = private topiclock (makes channel foo private and topiclock)
@flagchannel foo = !moderated (makes channel foo unmoderated)
@flagchannel foo = inky Sargent : pope (makes inky and Sargent channel
                   popes on foo)
*@addtochannel
Adds users to the current channel. You must be a channel pope to add
users, and you may not add users who have you @gagged.

Usage:

@addtochannel alpaca = inky 
@addtochannel Sadie = liza Adam mamster
*@remfromchannel
Removes users from the current channel. You must be a channel pope to
remove people. 

Usage:

@remfromchannel funk = inky
*@delchannel
Deletes the channel, removing all its members. You must be a channel
pope to delete a channel.

Usage:

@delchannel useless
*@delcategory
Deletes the category. You must be a wizard to delete a category, and it must
be empty.

Usage:

@delcategory games/cards
*@topicchannel 
Sets or displays the topic for the channel. 

Usage:

@topicchannel foo = I like a foo channel     -- sets the topic for channel #foo
@topicchannel foo                            -- displays #foo's current topic
*@popeme
If all the channel popes leave the channel, then normally no one can
get moderator status without everyone leaving and rejoining. Instead,
if there are no popes on a channel, any channel member can type
@popeme and receive moderator status. Obviously, this only works for
one person, who must then give everyone else moderator status normally.

Usage:

@popeme foo (Tries to get moderator status on foo)
@popeme -force foo (Tries harder to get moderator status on foo, wizards only)
*@newchannels
Lists the non-private channels which the user is not a member of which have
been created since the last time the user used this command.

Usage:
@newchannels
@newchannels -quiet  (Same, but don't print anything if nothing's new) 
@newchannels -clear  (Reset the marker to now without printing anything)
*channel-flags
The following flags are currently supported:

For channels:
  private (p)     -- people cannot use @joinchannel to join. 
  moderated (m)   -- people who are not channel moderators or voices may not talk on
                     the channel.
  topiclock (t)   -- people who are not channel moderators or voices may not change 
                     the topic
  norecap (!)     -- channel may not be recapped
  memberrecap (R) -- channel may only be recapped by members
  joinrecap (r)   -- channel may only be recapped by members; furthermore, 
                     people may not view recap previous to the time they
                     joined the channel
  extendedrecap (e) -- channel saves recap for longer
  adhoc (a)       -- channel is temporary and is deleted after people stop talking 
  newsboyoff (n)  -- disable snarky NewsBoy messages
  solo (s)        -- limits talking/listening to just the current user

For members:
  pope/moderator (+) -- person can use various channel admin functions
  cardinal/voice (-) -- person can talk on channels set moderated, and change
                        the topic of channels set topiclock

*@adhocchannel
This command is a convenient shortcut for creating a channel for an
adhoc conversation. It creates a channel, flags it as private and
adhoc, and may also add users and send an initial message. This
doesn't do anything you can't do with @makechannel, @addtochannel, and
#channel, but it may be handy to encapsulate them. See 'help channel-flags'
for more information on the adhoc flag.

Usage:

@adhoc foo   (Create an adhoc, private channel named foo)
@adhoc foo = inky Jota   (As above, but add inky and Jota to it)
@adhoc foo = inky Jota : hi guys (As above, but send "hi guys" to the channel)
@adhoc foo inky Jota = hi guys (Alternate syntax for above)

*options
The options system is similar to the flags system (see 'help flags'),
but options can only be set on players, and they're implemented in a
way that makes them slightly slower to use.

You can list what options are available to set (and their current setting)
with the @options command, set them with '@oset <option>', and clear
them with '@oclear <option>'. You can see more detail about a specific
option with help <option>.

*@options
This command lists out all the options that you can set, and their 
current setting. See 'help options' for more details about options 
in general, and 'help <option>' for more information about a specific
option.

*option-list
This help entry is no longer maintained. Type '@options' to list
the available options, or 'help options' for general information about
options.

*@oset
Sets an option.  Format is:

@oset <option>

To see what options are available, use '@options'. To see more
information about options, type 'help options'.

*@oclear
Clears an option.  Format is:

@oclear <option>

To see what options are available, use '@options'. To see more
information about options, type 'help options'.

*autopoll
When the autopoll option is set, the mud will display the
poll to you whenever someone changes it.

See also: @poll, @doing

*chanchange
When the chanchange option is set, the mud will tell you whenever
your default channel changes.  It displays the follwing text:

New default channel: xxx

Where 'xxx' is the name of the channel, or '(none)' if you no
longer have a default channel.  This @option is most useful with
MUD clients that can be programmed to display useful information.
Ask around for macros for the 'tf' client that use this option.

*gagprivate
Normally, the @gag command only gags normal output, but people
who are @gagged by you can still send you pages and whisper to
you.  If the gagprivate option is set, they can no longer do that.
Note that if you have this option set, people will be notified 
that you have them gagged if they whisper/page you.

See also: @gag, @ungag

*gagrecap
Normally, the @recap command ignores any gags you have set. With this
option in place, it uses normal gagging behavior (so people you have
gagged won't appear in recap).

See also: @gag, @ungag, @recapchannel

*idleleave
Normally, channels that you have temporarily joined (see
@tempchannels) will unjoin you when you log out.  With this option
set, the channels will unjoin you if you ever go 'zoned' for being
idle too long OR if you log out, whichever comes first.

If you set the nozone option, then the idleleave option will be
ignored.

*joinnolast
Whenever you join a channel, your default channel is changed.
If you prefer to have your default channel left alone when
joining another channel, set the joinnolast option.

See also: @joinchannels, channels, chanchange

*recapsetlast
By default, @recapping a channel does not set your default channel
to that. If you would like it to, set the recapsetlast option.

See also: @recapchannel, channels, chanchange

*postsetlast
By default, posting to a channel does not set your default channel
to that. If you would like it to, set the postsetlast option.

See also: bb, bb_post, channels, chanchange

*muteconn
Whenever someone connects to the mud, a message is displayed to
everyone.  If you don't want to see this message, set the
muteconn option.

See also: mutedisc, nohomemsg

*mutedisc
Whenever someone disconnects from the mud, a message is displayed
to everyone.  If you don't want to see this message, set the
mutedisc option.

See also: muteconn, nohomemsg

*muteunzone
If you are 'zoned' and you enter a command into the mud, the
message 'unsetting zoned flag' is displayed.  If you prefer not
to see this message, set the muteunzone option.

See also: mutezone, nounzone, nozone

*mutezone
If you are idle for more than an hour, the mud automatically
sets you zoned and tells you by displaying 'zoned flag set'.
If you prefer not to see this message, then set the mutezone
option.

See also: muteunzone, nounzone, nozone

*nohomemsg
If you're in the same room as someone who enters the 'home' command
(or disconnects), you will get a message telling you that the player
went home.  If you prefer not to see this message, set the nohomemsg
option.

See also: muteconn, mutedisc

*nounzone
Normally if you're zoned and you enter a command, the mud automatically
'unzones' you.  If you prefer to remain zoned, then set the
nounzone option.

See also: muteunzone, mutezone, nozone

*nozone
Normally, if you're idle for more than an hour, the mud automatically
'zones' you.  If you prefer to remain unzoned, then set the
nozone option.

See also: muteunzone, mutezone, nounzone

*paranoid
If you set the 'paranoid' option, you will see (Bob) or (Bob->someobject) 
before any text sent with @tell, and (()) instead of () for @tellroom, 
unless you were the one who did the action triggering the tell.

You can set various space-separated words in the 'paranoia_level' field
on yourself to customize the behavior.  

	self: See the message even if you did trigger the @tell/@tellroom
	extra: Also see the dbref of the objects producing output
  
For instance, this would give you the effects of both self and extra:

	@field me = paranoia_level : super extra paranoid self

fnord
  
*pastenotrim
Whenever you paste something on the mud, it strips out leading
spaces for you, because very often browsers insert leading spaces
on any text you copy.  If you don't want the leading whitespace
to be trimmed when you paste, then set the pastenotrim option.

See also: @paste, @endpaste

*quoteurl
When this option is enabled, quotebook entries will be displayed
along with a URL that you can use your web browser to view.

*quickpost
The normal syntax for posting messages to a bulletin board
is:
	bb post #bb-name = subject : message
If you set the quickpost option, then you can leave the 'post' keyword
out:
	bb #bb-name = subject : message

See also: bb_post

*smartresolve
When you talk on a channel without using the ';' command, the
mud has to search through all available channels to see which
one you meant.  If there is more than one that starts with the
name you specified, then the mud reports an ambiguity.

However, if the smartresolve option is set, then the search
is restricted to those channels that you talked on most recently.
The result is that the mud doesn't complain nearly as much about
which channel you want to talk on.

Note that occasionally smartresolve may not do what you want; eg, 
if you've been talking on #cookies and want to switch to #c, just typing
#c will continue talking on #cookies due to smartresolve. The solution
is to put a " after the # to force it to ignore smartresolve in this
one case: #"c I am talking on #c, not #cookies.
After you do this once, then (since you've now talked on #c recently) 
you can just do #c and smartresolve will disambiguate the way you want.

See also: channels

*unpluralize
If you refer to a channel that doesn't exist, and the name you use has
an s on the end (eg, #movies), then if this option is set, the channel
system will automatically retry the name without the s (eg, #movie).

*nosignmsg
If this option is set (see 'help options'), then you won't see a
message when someone else in the room signs an object.

*fullsignmsg
If this option is set (see 'help options'), then when someone signs an
object you will see what they signed in addition to the normal
message. 

*nomutetimeout
If this option is set, any @mutechannel commands done will, by
default, not time out (ie, "@mutec #foo" by itself will be treated as 
though it was "@mutec #foo = fixed"). To make a channel mute timeout
while this option is in effect, do "@mutec #foo = unfixed". Note that
this doesn't affect @mutechannel commands already performed before the
option was set.  

*explicitmute
If this option is set, then @mutechannel and @unmutechannel will no
longer be synonymous and act as toggles -- to mute a channel, you'll
need to explicitly say @mute channel, and @unmute to unmute.

*explicitgag
If this option is set, then @gag and @ungag (and @ignore and
@unignore) will no longer be synonymous and toggle gag state -- @gag
will only gag people, and @ungag will only ungag.

*noautopurge
By default, when you log out, any mail messages flagged deleted are
purged. If this option is set, they won't be, so they'll only be
purged when you explicitly type "mail purge".

*urlfix
If this option is set, strings the mud recognizes as urls will have
spaces put around them if there are none, and http:// added to the
front if there is no prefix.

*recapamount
The number stored in the recapamount field is used as the default
number of lines to recap.

*recapformat
recapformat and related fields controls the timestamps displayed
when recapping with -tag time or recaptime set.  The format fields
are in strftime format (see http://linux.die.net/man/3/strftime or
http://strftime.net/ for details).

recapformat describes the format for recent lines in recap; 
recapancientformat describes older lines in recap, with what "older"
means being defined by recapancientinterval (in seconds).

recapformat: defaults to %H:%M
recapancientformat: defaults to %a %H:%M
recapancientinterval: defaults to 86400 (24 hours)

If recapformat is set but recapancientformat is not, recapformat
will be used for both recent and ancient recap.

*recapancientformat
See 'help recapformat'.

*recapancientinterval
See 'help recapformat'.

*recaptime
If this option is set, timestamps are put into the recap on each line.
"Gaps" in the conversation are marked with a / on the line, and
succeeding lines have a |.

*recapconv
If this option is set, recaps always go back to the start of a
conversation -- that is, until a gap occurs. If you specify a line 
amount, it goes at least that many lines, and continues until a gap.
The 'maxrecap' field can be set on yourself to control the absolute
max size of the recap from this, since it would otherwise only be
theoretically bounded by the number of lines stored in recap (10
days' worth). The default for maxrecap is 50. Note that this option
effectively overrides the 'recapconvdefault' option (q.v.) if both 
are set.

*recapconvdefault
If this option is set, then @recap recaps back to the start of the
conversation if you don't specify a line amount, and recaps exactly
the number of lines you specify if you do. See help for the
'recapconv' for more details.

*lastchannelchar
If this field is set to something, that is what will be used instead of ;
to refer to the last channel. Note that certain prefixes (eg, .) are 
reserved for other system functions and won't work.

*quoteunpaged
If this option is set, 'quote new' will show all new quotes
immediately, instead of just showing the first page.

*gagautomute
If this option is set, when a person you have gagged starts a
conversation on a channel (that is, talks on a channel which hasn't
been talked on recently) the channel is auto-muted. The definition of
'recently' is the same as that used for timing out @mutechannel (q.v.).

*@reload

This command reloads any changed modules from the hard drive.
It's wizard-only.
*@paste
@paste enters paste mode. In paste mode, anything you type has a prefix
prepended, either the default prefix of ":| ", or the argument to @paste.
For example (return is hit at the end of each of the lines):
 @paste say
 foo
 bar
 @endpaste
would be seen by the mud as
 say foo    
 say bar
@endpaste leaves paste mode
By default, a space is added to the end of the argument to @paste. This lets
things like "@paste #blah" correctly send to channel blah. If you don't like
this behavior, you can put quotes around the argument to send it exactly.
Also by default, space at the beginning of the line is trimmed. To send the 
text exactly, turn on the "pastenotrim" option (see help @options).

As a shortcut for pasting on channels, you can do #channel @paste, and
this will be the same as if you had done @paste #channel :|

Example:
 @paste #monkeys
 @paste 'say hi_there_'
 #foo @paste                   (same as @paste #foo :|)
*@endpaste
Leaves paste mode. See the help entry for @paste.
*@from
This command shows you from where people are logging into the mud.
@from by itself tells you about everyone currently connected; @from with an
argument tells you about a specific player. In the latter case,
the player does not have to be connected, in which case
the data will be from the last time they connected. If the argument to
@from is an IP address, it will instead list all connected players
with that IP address (so you can do @from Bob, and then @from
Bob's-ip-address to easily see if Bob seems to be connected multiple times).

@from information is currently returned only with the IP address, not
the host name.

Example:
 @from                   (List addresses of all connected players)
 @from Jota              (List Jota's last-connected-from address)
 @from 127.0.0.1         (List everyone connected from 127.0.0.1)
*debar
If the debar field is set to a number, output to you will be broken up
with spaces every that many characters. For instance, if it's set to 5, 
the string "I oscillate a goldfish" will be displayed to you as "I oscil 
late a goldf ish". This is probably only useful to pueblo users, who'll
mostly likely want to set it to 75 or 80. 

Usage:
 @field me = debar : 80

*bb
The new bb system's interface is very similar to the old system, although
the internals have been completely rewritten. The main changes are the
addition of an undelete command, expansion of ranges (eg, bb delete = 1-10),
alternate supported numbering system, and each channel now has a bb in addition
to the main one. Command summary: 
  bb  (list last X messages on main board)
  bb 1-3  (read messages 1-3 on main board)
  bb read #foo = new (read new messages on #foo)
  bb del = new  (delete all new messages on main board)
  bb undel = 4 (undelete message 4 on main board)
  bb post = hello : bye (post message to main board)
  bb modify = 32 : foo : bar (modify message 32 to have new subject/body)
  bb #foo (list last X messages on board for #foo)
  bb post #foo = hello : bye (post message on board for #foo)
  bb modify #foo = 32 : foo : bar (modify message 32 to have new subject/body)
  bb clear #foo (mark all messages on #foo as having been read)
  bb ignore #foo (stop seeing bb announcements for #foo)
  bb search #foo = monkey (search #foo for messages with text 'monkey')
  bb * (shortcut to read all new messages on all boards)

Use "\:" to escape colons for the subject line.

For further details, see the help entries for "bb_list", "bb_read",
"bb_post", "bb_modify", "bb_delete", "bb_undelete", "bb_check", "bb_scan", 
"bb_clear", "bb_unread", "bb_ignore", "bb_search", "bb_range", "bbnotify"
*bb_list
This command lists bb messages in a specified range. If no range is
given, it defaults to "last X", where X is the value of the player's
bblist field if one is defined, or else 20. "bb" by itself is a shortcut for
"bb list".

Syntax:
 bb list = last 20 (list the last 20 messages on main board)
 bb                (ditto)
 bb list = #foo : last 20 (list the last 20 message on channel #foo)
 bb #foo           (ditto)

*bb_read
Reads messages in a specified range. bb with an argument (eg, "bb 1-3")
is a shortcut for "bb read", except that for historical reasons,  
"bb all" maps to "bb read = new" not "bb read = all"

See also help on the following options/fields/commands which customize the 
behavior of bb read:
  starlimit

Syntax:
  bb read = 20  (read message 20)
  bb 20         (same)
  bb read = #foo : 20  (read message 20 on board #foo)
  bb #foo = 20  (same)
  bb read #foo = new   (read new messages on #foo)

*bb_unread
Marks messages equal to or newer than the specified ones as unread.

Syntax:
  bb unread = last 3 (marks last 3 bb messages as unread)
  bb unread #dogs = 5 (marks message 5 and onwards on #dogs as unread)
  bb unread * = hours 3 (marks messages posted in the last 3 hours as
                         unread on every bb)
*bb_post
Posts a message. You may only post to bbs for channels which are moderated
if you can speak on the channel. If you want to post with a colon in
the subject, you may have to escape it with a backslash.

Syntax:
  bb post = hello : bye
  bb post #foo = hello : bye
  bb #foo = hello : bye (only available if the 'quickpost' @option is set)
  bb #foo = don't use \:) : it freaks people out
*bb_modify
Modifies an existing message. You may only modify messages which you wrote
yourself. If you leave the subject or body blank, they default to the
previous values.

Syntax:
  bb modify = 32 : new subject : new body
  bb modify = 32 : new body
  bb modify #foo = 32 : new subject : new body
  bb modify #foo = 32 : new body
*bb_delete
Deletes some messages. You must be either a wizard (for the main board) or
a channel moderator (for other boards) to delete messages which you did
not write.

Syntax:
 bb delete = 1-3
 bb delete = #foo : 1-3
*bb_undelete
Undeletes some messages. There is a limited undelete queue for each board.
You can only undelete a message if you have permission to post to and delete
from the board.

Syntax:
 bb undel (lists the undelete queue for the main board)
 bb undelete = 1-3
 bb undel = #foo (lists the queue for foo)
 bb undel = #foo : 1-3
*bb_ignore
Stop seeing announcements (other people's posts) on the given board,
and don't include that board when doing bb *, bb check, and so on,
unless the board is specified explicitly.

Syntax:
  bb ignore #foo (stop seeing announcements on foo)
  bb ignore #foo (start seeing them again)
  bb ignore      (list all ignored boards)
*bb_check
Tells you if there are new messages on all your subscribed bbs or on one 
specific one.  

Syntax:
 bb check (checks all bbs for new messages)
 bb check = #foo (checks foo)
*bb_scan
 "bb scan" is a shortcut for "bb list = new".

Syntax:
 bb scan (lists the default channel)
 bb scan = #foo (lists foo)
*bb_clear
bb clear sets the bbread time to the current time, erasing the new flag 
on all messages. Without an argument it updates the time for the main 
bulletin board. With an argument it updates the time for the given
channel, unless the argument is *, which updates it for every channel.

Syntax:
 bb clear
 bb clear #food
 bb clear *
*bb_range
The range can be given in any of the following formats:
 X-Y
 X
 first X (the first X messages)
 last X
 new
 all
 match X (messages containing the text X)
 days/hours X (messages posted in the last X <time units>)
 from X (messages by player X)
 + or - followed by id or time (gives a different sort order; the default
   is +id)
You can also combine the first four of these with commas, eg "1-3,
first 10, 11" is a valid range, and the sort order specified can be 
included on any search.
*bblist
See "help bb_list".
*bb_search
bb search searches a bulletin board for messages containing
the given text in their subject or body. This is actually a shortcut
for "bb list #channel = match text" and you can similarly use 
'match text' in other situations -- "bb read #animals = match monkeys" 
will read all messages with the text "monkeys". The search is
case-insensitive, allows no wild cards, and can contain multiple words
or parts of a word. 

You can also search without specifying a channel; in this case, every
channel is searched (assuming the channel is public or you're a
member).

The search term can be prefixed with -id or +time to change the sort
order of the search results; the default is +id.

Syntax:
 bb search #food = chickpeas
 bb search #monkey = zany antics
 bb search = stuff                 (searches for 'stuff' on every channel)
 bb search = +time stuff           (ditto, earliest to latest)
*exitto
If the exitto field is set on an exit, it is considered to be a
'speaking exit'. See help exitmode for details.

Usage:
@field north = exitto : to the closet
*exitmode
The exitmode field on a player controls how they see 'speaking exits',
ie, those exits with an exitto field defined. If exitmode is set to 2,
the exitto field is not listed. If it is set to 1, the exit is listed
as "exit exitto". If it is set to 0, the exit is listed as "exit
(exitto)". For example, these might be, respectively, "north", "north
to the closet", "north (to the closet)". The third version is the default.

Usage:
@field me = exitmode : 2
*name-completion
When talking to somone using the syntax
    ..person Hello
you can have the mud spell out the person's name for you by partly
typing in the person's name and ending it with a '.'.  For example:
    ..per. Hello
This will cause the mud to search for someone in the same room as
you are whose name starts with the letters 'per'.  It's case-
insensitive, so if it finds someone with the letters 'Per', that
will match as well.

This has two distinct advantages.
 1) You don't have to type quite so much.
 2) If the person isn't in the room or isn't logged in, then
    the MUD will tell you, and no one in the room with you will
    be any the wiser.

This also works on channels.

*channel-aliases
  You can set up aliases for your commonly used channels.  

  There are three new commands:
  	@addalias <alias> = <channel-name>
	@remalias <alias>
	@listaliases

  Channel aliases are stored in a secret field -- not even
  a wizard can see them.

  To add an alias: @addalias shorty = really-long-channel-name
  To remove an alias: @remalias shorty
  To show all your current aliases: @listaliases

  To speak on a channel using your alias, use a '#' plus the alias name:
  	#shorty The Monkees were funny.
  To set up a global alias that anyone can use, see the topic '@synonymchannel'.
*@addalias
This command can be used to make an alias that will let you refer to a
channel by a different name. Once you've created the alias you should be
able to use it interchangeably with the "real" channel name, although of
course other people who won't have the alias set won't.

See the topic 'channel-aliases' for more information. To set up a
global alias that anyone can use, see the topic '@synonymchannel'. 

Usage:
@addalias #<alias> = #<channel>

For example: '@addalias #monk = #kids-all-love-the-monkey' will let you
refer to #kids-all-love-the-monkey as #monk instead.

*@remalias
This command removes a personal channel alias set with the @addalias command.

Usage:
@remalias #monk
*@listaliases
This command lists all the channel aliases you have set with the @addalias 
command.

Usage:
@listaliases
*@tempchannels
Use this command to temporarily join channels.  Once you logout, you
will automatically leave the channel.

If you've @tempch'd a channel that you want to stay on permanently,
just @joinch it.

If you instead do @tempch -rot13 channel, it will toggle rot13 decoding
on that channel until you log out.
*@visitchannels
Synonym for @tempchannels.

*@maint
This is a general mud-maintenance and will probably mostly be useful
to inky. It does have some general applicability, though. Currently
supported commands:
  @maint oldplayers is used for determining and deleting accounts that
  should be wiped due to not logging in recently enough. Any player
  may use '@maint oldplayers' to list the people scheduled for
  deletion, and '@maint oldplayers = preserve inky Jota' to remove the
  given people from the delete list. Wizards may additionally use 
  '@maint oldplayers = create' to create the list, 
  '@maint oldplayers = clear' to clear it, and '@maint oldplayers = toad'
  to actually toad the players on it.

Usage: (see above)
*containers
The mud now supports containers, which are things that can contain
other things.  Objects that are intended to be used as containers
must have their container flag set.  The following commands are
available when dealing with containers:
put object = container puts something in a container.
takefrom object = container removes something from a container.
empty container empties a container.
transfer container1 = container2 transfers the contents of one container into
another.
More help is available on these.
For a discussion of the container flag, see 'help container'.
You might also want to look at 'help containers-tests' and 'help 
containers-fields' for information on container locks and reactions.
*put
This command is used to put an object into a container.  You must
be holding the object, and the container object must either be in
your inventory, or be in the room with you.  Also, the container
must have its container flag set.
Syntax:
put apple = box
*takefrom
The takefrom command is used to remove an object from a container. 
You must either be holding the container or it must be in the room
with you, and obviously the object to be removed must be in the
container.
Syntax:
takefrom apple = box
*container
The container flag indicates that an object can act as a container.
Only things can have this flag set, and in order to unset this flag
the container must be empty.
*empty
This command will empty a container.  The container to be emptied
must either be in your inventory or in the room with you.  If you
are holding the container, the contents will be placed in your
inventory, and if the container is in the room with you the
contents will also be put in the room.
Syntax:
empty box
*transfer
The transfer command is used to transfer the contents of one container into
another container.  For this command to work, each container must either be
in your inventory or in the room with you.  All of the items in the first
container you specify will be transferred into the second container you
specify.

Syntax:

transfer box = bag
*containers-status
Here is the current status of the development of the container
system.  This status is subject to change without notice.
As far as I know, the put, takefrom, empty and transfer commands work
perfectly, although more testing is certainly welcomed.  The
restrictions on the container flag appear to be working, both in
@set and @setflag.  Again, more extensive testing is welcomed. 
@recycle will refuse to recycle a container that isn't empty, and
if a container that isn't empty must be recycled, such as in a
toading, its contents will be dumped in the noroom.  This has been
tested and appears to work perfectly, though of course more testing
is welcomed.  
Nested containers are supported to a point.  To interact with any
item in a container, other than for looking at it (which can be
done with "look container's object"), the item must first be
removed from the container.  Therefore, a container inside another
container may be looked at without being removed first, but this
second container's contents can not be interacted with at all.  The
same thing goes if a player is carrying a container.  Other players
can look at the player's container, but they can not look at or
otherwise interact with any of its contents.
The dark flag will keep a container from being seen in the room it is in.  It
will not, however, suppress the contents listing.  Because of issues relating
to this flag, we have put in a new flag, nocontents.  For consistency, the
nocontents flag is now the flag to use for hiding the contents of a room,
player or container.
The @move and @teleport commands now work for moving items both into and out
of containers.  Since there were similar issues relating to the jumpok flag,
we made it so you use the linkok flag to indicate that it is okay for other
people to teleport things into your container.
The database validation code appears to be handling objects inside containers
correctly without any modification.  Obviously this is hard for
others to try to break since a shutdown and restart must be
performed before validation is invoked.
Things still to do:
1.  Ability to use 'all' as the first argument to put or takefrom. 
Do people want this?
2.  Some way to provide for containers which can be closed.  This can now be
simulated using Jotacode.  Do people want this hardcoded?
3.  Better interactivity with items inside containers, including
nested containers.  This would probably be a bit hard to code.  Do
people want this?
4.  Enterable containers.  Would probably be a bit hard to code and
get right.  Do people want this?
More things may be added to this list as I think of them or get
requests.  Like I said at the top of this text, this status is
subject to change at any time.  You must understand that the
container system is a totally new concept for ifMud, and the ifMud
code was not designed to handle it.  Although at least some of the
code appears to be working correctly despite this new twist of
things being inside other things, there are bound to be areas we
have overlooked.  I think it took several months to a few years to
get all the kinks out of Jotacode and the various functions.  Any
new system is bound to have bugs that remain undiscovered for a
while, and the container system is certainly no exception.  So if
you find anything that is an out and out bug or seems not quite
right, let me know by mudmail on ifMud.
Thanks,
Jaybird
*nocontents
The nocontents flag, when set on a room, player or container, will prevent
the contents of that object from being listed when somebody looks at it.
*containers-tests
Containers have the ability to decide for themselves if something can be put
in or removed, or if they can be emptied, transferred, or receive transferred
stuff from other containers.  The testinsert and testremove fields are used
to tell a container how to behave.  Help is available on these fields
individually.  Also see 'help containers-fields' for information on messages
you can set when people insert or remove items from your containers.  Note
that these tests and messages are skipped when using the @teleport and @move
commands.
*testinsert
The testinsert field should be a piece of Jotacode.  It will be run
when somebody is trying to put something into a container using the
put command, or transfer some other container into this container
using the transfer command.

When this field is run, %# is set to the dbref of the player who is
trying to insert or transfer stuff, %! is set to the dbref of this
container, and in the case of a standard put command, %0 is set to the
dbref of the object under consideration for insertion. In the case of
a transfer command, %0 is set to the text string "transfer". 

If this field contains just the digit 0, all insert and transfer
requests will be refused. In the case of a transfer command,
testinsert is only run once.  If it returns 0, the entire operation is
aborted, and if it returns anything else, assuming the source
container allowed the transfer if that's what this is, the transfer 
will be completed with no further testing of any of the objects
involved. 
*testremove
The testremove field should contain a piece of Jotacode.  It is run
whenever somebody is trying to remove something from a container,
using the takefrom, empty or transfer commands. 

When this field is run, %# is set to the dbref of the player who typed
in the command, and %! is set to the dbref of this container.  In the
case of a takefrom command, %0 is set to the dbref of the object under
consideration for removal, and in the case of an empty or transfer, %0
is set to the text string "all".

If this field contains just the digit 0 then all takefrom, empty or
transfer commands will be refused by this container. This field will
only be run once for each empty or transfer command.  If 0 is
returned, the entire operation will be aborted, and if anything else
is returned, assuming the destination container will allow the
transfer if that's what the operation is, all the items will be
removed from this container, with no further testing done on each
item. 
*containers-fields
There are eight fields you can set on containers to print messages or do
other stuff when somebody puts something into a container, removes something
from a container, or fails to do either of these things.  They are as
follows:

insertsuccess/oinsertsuccess:  These fields are run or printed when somebody
successfully puts something into a container.  In the case of oinsertsuccess,
as with all of the rest of these fields that begin with the letter o, the
return value or string is printed to the entire room prefixed by the player's
name and a space.  Also with all of these fields it is more useful to make
them Jotacode so you can refer to the actual names of the items involved.

insertfail/oinsertfail:  These fields are run or printed when somebody fails
to insert something into a container.

removesuccess/oremovesuccess:  These fields are run or printed when somebody
successfully removes something from a container.

removefail/oremovefail:  These fields are run or printed when somebody fails
to remove something from a container.

None of these fields are run during an empty or transfer command, no matter
if the operation succeeds or fails.
*charset
The charset field determines the character set the MUD assumes you are
sending and receiving. By default, everyone is considered to be using 
ASCII; characters outside this range will get dropped. If your mud
client supports something fancier than this, then you can use the
charset field to enable you to see and send other characters. The
currently-supported character sets are (case doesn't matter):
  ascii
  iso-8859-1 through iso-8859-16
  macintosh
  utf-8
  utf-16
  utf-32
  windows-1250 through windows-1258
If you need a character set that isn't on here, talk to a wizard and
possibly something can be arranged. If you don't know what you want,
feel free to try a couple sets and see which looks right on your
client -- iso-8859-1 and utf-8 are probably the most likely to work.

Usage:
@field me = charset : iso-8859-1
*locale
See "help charset" for information on non-ASCII character sets.
*localization
See "help charset" for information on non-ASCII character sets.
*quote
The mud quote system is a place to store witty, salacious, out-of-context
or apropos remarks by your fellow mudders. You can add quotes, remove
them, and list them. See Usage, below. 

Remember that, by convention, the #TMI and #WTMI channels should not
be quoted from. When adding multi-line quotes, you can use %c to
separate lines (and the correct spacing will be added).

See also help on the following options which customize the behavior of quote:
  quoteunpaged, quoteurl

Usage:
quote help (see this help)
quote list (list all people with quotebooks)
quote inky (see the last 10 quotes from inky)
quote inky = 10 (same as previous)
quote inky = first 10 (see the first 10 quotes from inky)
quote inky = all (see all quotes from inky)
quote inky -url (see quotes from inky, with urls)
quote inky -nourl (see quotes from inky, without urls)
quote inky = inky says, "Gosh, I'm being quoted." (add a quote to inky)
quote add = inky : inky says, "Gosh, I'm being quoted." (same as previous)
quote inky = paste (start an ongoing quote of inky)
quote remove = inky (remove the last quote you added to inky)
quote list = -quoter inky (see all quotes added by inky)
quote list = -text sandwich (see all quotes with the text 'sandwich')
quote list = -quotee inky -range 10 (same as "quote inky = 10")
quote recent (list the last 10 quotes added by anyone for anyone)
quote recent = 10 (same as previous)
quote new (list quotes added since you last checked) 
quote clear (clears any new quotes added since you last checked)
quote random [= 3] (see 1 (or 3) random quotes)
quote random = inky (see a random quote from inky)
quote search = sandwich (same as quote list = -text sandwich)
quote stats (list the top ten quoters and quotees)
quote stats = inky (list stats for inky)
quote 103 (see quote #103)
*@altname
Adds an alternate name (nickname) people can use to refer to you in
any command where a player name is given (mail, finger, who, etc). 
Note that the alternate name isn't used in commands where any object
is given (x, get, smell, etc). Note also that if you @name yourself to
one of your altnames, it'll automatically create an altname for your
previous name -- this makes it easy to switch between a small set of
names and people can continue to refer to you by any of them.

Usage:
@altname                 (Lists all alternate names for you)
@altname bobo            (Adds the alternate name 'bobo' to you)
@altname remove = bobo   (Removes it)
*tail
Prints only the last portion of an object's description.

Usage:
tail very long book
*grep
Prints sections of an object's description matching the second
argument.

Usage:
grep very long book = keyword
*@google
Does a google search for the given term and returns the number of
results.

Usage:
#foo @google term           (Prints results on #foo)
@google term                (Prints results on #google)
@google term = private      (Prints results just to you) 
*@freeze
Locks out a player's account, so that they can't connect and can't
enter commands if connected. Takes an optional argument for
the duration of the freeze (default is 5 minutes). This command is
only usable by wizards. 

If the main guest account is frozen, no guests can connect (but
currently-connected guests aren't otherwise frozen, though they 
can be frozen individually).

Usage:
@freeze inky
@freeze inky = 15    # assumes minutes
@freeze inky = 3d    # or "2 hours" or whatever - some variations allowed
*@unfreeze
Removes a lock on a player's account. See @freeze for more.

Usage:
@unfreeze inky
*screenwidth
Setting the screenwidth field to a value will specify the width of
your screen, so the mud will (hopefully) truncate lines
appropriately. 
*starlimit
Setting the starlimit field to a number will make 'bb *' display at
most that many messages at a time. If unset, the default is 10. You
can also set it to 'all' (no quotes) to make 'bb *' display all the
messages at once. 
*saychannel
The saychannel @option causes text that you say with 'say' or the "
command to be parsed as if it were channel conversation, so you could
do 'say :nods his head' or '"..Jota howdy'
*decoderot13
The decoderot13 @option causes text encoded with @rot13 to be
automatically decoded for you. It will be surrounded by tags to let
you know it was originally encoded.
*@rot13
The @rot13 command is only usable on channels (or in conversation if
you have the saychannel @option set), and encodes the given text. 

See also help on the following options which customize the behavior of @rot13:
  decoderot13

Usage:
#foo @rot13 hello        (prints [foo] inky says, "uryyb"
*@resetpassword
The @resetpassword resets a user's password, and mails the new one to
the address listed in their address field, or to the one specified as
the second argument.

Usage:
@resetpassword inky          
@resetpassword inky = inky@ifmud.port4000.com
*idle
The idle command does the same as 'who me' (ie, shows your on and idle time),
without resetting your idle flag.

Usage:
idle
*qidle
This command does nothing whatsoever, even reset your idle flag. It is
useful if you would like to send a command to the mud that does
nothing. 

Usage:
qidle
*@assocchannel
This command associates a channel with a room, such that anything
said in the room is added to the channel recap, allowing people to
recap room conversation just as they would for a channel. A room may
be only associated with one channel, and a channel may only be
associated with one room.

Usage:
@assocchannel here = #lounge     (Add or change an association.)
@assocchannel #14 = clear        (Delete an association.)
@assocchannel here               (See what association, if any, exists.)
*qconnect
The qconnect command can only be used at the login screen; using qconnect 
instead of connect to log in effectively sets the quiet flag for the duration
of your session, so it doesn't announce your connect or your disconnect.
*gender
See help @gender.
*@gender
This command is used to specify your gender. @gender on its own will show your
current setting; @gender list will list the available genders, and 
@gender <name of gender> will choose that gender.

If you choose the custom gender, you can customize the output by setting 
the fields cgender_name, cgender_s, cgender_p, cgender_o, cgender_a, 
and cgender_r on yourself (see 'help subs-list' for details on the usage
of these substitutions - cgender_s defines the %s substitution, etc). 
Note that these fields are only used when your gender is set to custom.

Usage:
@gender                          (Show current setting.)
@gender list                     (List available genders.)
@gender female                   (Pick one.)
@gender clear                    (Unpick.)
*@playertitle
Set a player's title (which shows up in finger information).

Usage:
@title me                               (Show title.)
@title me = The Duke of Dunkin' Donuts  (Set title.)
@title inky = The stinkiest             (Only wizards can set other people's titles.)
@title me = clear                       (Clear title.)
*END-OF-FILE
