dmuck0.15-beta/docs/muf/
dmuck0.15-beta/game/
dmuck0.15-beta/game/logs/
dmuck0.15-beta/game/muf/
dmuck0.15-beta/game/muf/text/
[ Written by Garrett (durrell@hus4.harvard.edu) on TinyMUCK 1.1.  Still
  quite valid in these days of 2.2 and MUF. ]

			    Table O' Contents

I. General Concepts
	A. Terminology and Basic Stuff
	B. Sources and Destinations: A List
	C. Notes on Links With Source: Object
	D. Metalinks
	E. Multiple Destinations

II. Techie Talk
	A. New Commands and Flags
	B. Modified Commands and Flags

III. Example

I. General Concepts

This manual assumes that you have a working knowledge of TinyMUD. 
'Working knowledge' means that you understand the room/exit/object 
paradigm - you know how to dig rooms, link them together with exits, 
and so on. If you don't, a lot of what follows will not make sense to 
you.

A. Terminology and Basic Stuff

TinyMUCK generalizes the concept of links. In TinyMUD, an exit links a 
room to another room. In TinyMUCK, literally anything can be linked to 
anything else. Links/exits are activated in the normal way, by typing 
the name of the link (north, for instance), but depending on what their 
source is and what they are linked to, they may have a variety of 
effects.

Link is the term we shall use throughout this manual. Know that links 
are often also called actions or exits.

More terminology: source and destination. The source is the thing that 
the link is 'on'. The destination is the thing to which the thing is 
linked. For example, if you have State St., with an exit 'north' 
leading to N. State St., State St. is the source and N. State St. is 
the destination.

B. Sources and Destinations: A List

Here's a quick list of possible sources and destinations, with an 
explanation of the effects:

room 	->	room

	The kind of link you know and love. Takes the player
	activating it from the first room (source) to the second
	room (destination).

room	->	object

	Brings the object (destination) into the room (source).

room	->	player

	Brings the player activating the link to the location of
	the player who is the destination.

object	->	room

	Brings the player activating the link to the destination
	room.

object	->	object

	This one is tricky. There are two possibilities.
	
	a) The link is not set STICKY. In this case, the source
	   object goes home and the destination object appears in
	   its place.

	b) The link is set STICKY. In this case, the destination 
	   object appears, but the source object does not go home.

object	->	player

	This brings the player activating the link to the location
	of the destination player.

player	->	room

	This brings the player (only the player who is the source
	of this link may activate it, as is true for all links for
	which the source is a player) to the destination room.

player	->	object

	This brings the destination object into the activating 
	player's inventory.

player	->	player

	This brings the player to the location of the destination
	player. (However, see the section on the JUMP_OK flag.)

C. Notes on Links With Source: Object

Some notes: if you activate a link from an object, and that link is
a STICKY link to another object, and the source object is in your 
inventory, the source object will remain in your inventory after the 
link is activated.

If the link does have another object as the destination, the 
destination object will appear in your inventory regardless of what 
flags have been set on the link.

D. Metalinks

The astute will have noticed one rather interesting possibility left 
out in all of the above. What about links to other links? This is 
indeed possible. Such links are called 'metalinks'.

A link linked to another link simply activates the second link when the 
first link is activated. This allows for some interesting 
possibilities. For example, one might want a link in one room to move 
an object into another room. One would simply link the link in the 
first room to a link in the second room. This second link would be 
linked to the object.

Important notes about metalinks:

a) Locks do not work through metalinks. If the link my metalink is 
   linked to is locked against me, but the metalink is not, I can still 
   activate the link through the metalink.

b) Similarly, any messages associated with destination links are not 
   displayed to anyone.

E. Multiple Destinations

Yes, you can link a link to more than one destination. It's treated as 
though the single link was multiple links. For example, if one has a 
link linked from a room to both another room and an object, the 
activating player will be taken to the destination room and the 
destination object will be moved into the source room.

As one might imagine, this is particularly useful with metalinks.


II. Techie Talk

Now for the fun stuff: how is this all done?

A. New Commands and Flags

There are two new commands and one new flag. The commands are @action 
and @attach, and the flag is JUMP_OK.

@action: This is a generalized form of @open. The syntax is:

	@action <name> = <source>

This will simply open an unlinked link with <name> as the name, and 
<source> as the source. You must still link it to whatever you wish it 
to have as its destination.

@attach: This allows one to change the source of a link. Syntax:

	@attach <name> = <new source>

This moves the link named <name> to whatever is named <new source>. You 
must, of course, own this thing.

JUMP_OK: One cannot use a link to a player if the destination player is
not set JUMP_OK. Also, there might be something odd about links in rooms
unowned by link owner, if the room isn't jump_ok. look it up.

B. Modified Commands and Flags

@link and LINK_OK have slightly modified effects and/or syntax.

@link has been modified to allow multiple destinations. New syntax:

	@link <link> = <dest 1> <dest 2> <dest 3> ... <dest n>

Note: each destination is separated by spaces.
LINK_OK now applies to absolutely anything. Objects, players, and
links themselves can be LINK_OK, and you will see their numbers,
just as you see the numbers of LINK_OK rooms. You may link an exit 
to anything that is LINK_OK, or that you own. Only one player or
room can be a destination of a link; therefore you cannot have a
link that is linked to two or more players, or two or more rooms,
or both a room and a player, etc. 

III. Example

-------                     --------------                 ----------------
| egg | -- open egg ------> | eggshell a | <---- exit a -- | storage room |
-------                |    --------------   ^             ----------------
   ^                   |                     |
   |                   |    --------------   |
   |                   |--> | eggshell b | ----- fix egg ---
   |                        --------------                 |
   |                                                       |
   ---------------------------------------------------------

What's going on here:

The arrows are links. The names are, well, names. A list of links:

        link            source          destination

        open egg        egg             eggshell a, eggshell b
        fix egg         eggshell b      exit a, egg
        exit a          storage room    eggshell a

What happens: you type 'open egg.' The egg goes away, and the two 
eggshells appear in its place. You then type 'fix egg.' Two things 
happen. First of all, the egg appears, because the link is linked to 
the egg, and eggshell b vanishes, because that's the way object -> 
object links work. Secondly, exit a is activated, because 'fix egg' is 
*also* linked to that. This exit brings eggshell a from whereever it is 
to the storage room, and thus it vanishes from your hand as well. You 
are left with the original egg.

Commands to do all this:

Well, first let's define some numbers, for the sake of argument.

        object          number

        egg             1000
        eggshell a      1010
        eggshell b      1020
        storage room    1030
        open egg        1040
        fix egg         1050
        exit a          1060

OK. Commands, assuming we begin in the storage room, and that the 
objects have already been created:

@action open egg  = egg             ; attach 'open egg' to the egg
@action fix egg   = eggshell b      ; attach 'fix egg' to eggshell b
@action exit a    = here            ; attach 'exit a' to the storage
                                    ; room. This could also be
                                    ; '@open exit a'.
@link open egg    = 1010 1020       ; link 'open egg' to the eggshells
@link fix egg     = 1000 1060       ; link 'fix egg' to the egg and to
                                    ; exit a
@link exit a      = 1010            ; link 'exit a' to eggshell a

That's it!