Well you can't have one! At least that was the message I got when asking around. Everyone said it was difficult but when I got my paws on the documentation and one piece of key information I found it rather simple. Matter of opinion, I guess...
The key piece of information is of course the address of the program that
works the magic. Once you have that you can call up a couple of pages of
documentaion - this is one of the programs/program sets that's actually
documented! ;)
Basically, two programs are used: TRaM-start and
TRaM-end. To make it simple for now, the numbers on "my"
mucks are:
FurryMuck | SpinDizzy | |
---|---|---|
TRaM-Start | #73337 | #3727 |
TRaM-End | #73333 | #3208 |
Programs are called the usual way. You can set up an action and link it to the program, or you can include a call to the program in a message! (To side track a bit, this is how the exit lister works on most mucks - a program that lists all non dark exits in a room is called from the room's @succ line.) So you can set up a room to transform you when you enter or leave, or an object to transform you when you look at it!
The end program is simplest to use, it just requires an action and a link. The start program, however, needs a properly set up database. This is the tricky part, I guess. To have a look at the official docs get on the muck and type
@view #3727or whatever the number of the program is on your muck. The file you should get a copy of if you had the sense to turn on the log looks rather confusing but most of it is about different options. Here's the basics:
The database can be stored on the action that called it, or on some other object (This makes it possible to have several actions or program calls use the same database, and because one option is to set the database public you can use other people's databases too! I assume that is how SV's foxxer works...). To keep it simple, put your first TRaM database on the calling action (and use an action to call the program, the other methods are more advanced...). Let's say you call the action tram, then all properties on it should be set with
@set tram=(property):(value)(There is no special program to help you with this, so you have to set everything manually. There's at least one other Muck that has a "TRaM Hammer" program installed but I don't know of any such program on Furry...)
To make a long story short, here is a little database I cooked up to experiment with the software. [To use it, you must first create an action called tram, then use whatever option your MUD client/telnet program has to send the file to the server. Oh, and link it to the tram start prog of course!] It's kind of boring, all it does is change your species and give you a plain description telling you what just happened. But it's a start and kind of serves to point out one thing: The real fun about TRaM devices isn't that you get transformed at random, it's what you get turned into. (This is presumably why the VVM was so popular. <G>.) So unless you're pretty good at coming up with interesting descriptions you should probably get another hobby...
The following things are needed for the program to work:
The morph#/ directory should contain the following for each morph (which should be consecutively numbered, don't know what happens if you skip numbers):
From here on in... anything goes! Unlike plain morphing, the TRaM program can be used to set any prop you want. (Skunkie's plushie, for instance, would set your Doing line to "Waiting for this morph to wear off!"!) You just have to include all the properties you want to change, in the same directory. Example:
@set tram=morph#/1:dog
@set tram=morph#/1/<:_/de:species
@set tram=morph#/1/species:dog
@set tram=morph#/1/_/de:{name:this} has turned into a dog!
(Well, remember what I said about basics? ;))
One note: The TRaM program can only handle single properties (and as I have kind of just shown, the replacement props should be named exactly the same as the props they replace), so you can't use MPI lists. Duh. If you want formatted text you must put all the lines together separated by {nl} in the _/de prop. Example:
morph#/2/_/de:{name:this} is a dog!{nl}Woof!
will cause anyone who has this morph forced on them to look like this (using Yip as an example):
Yip is a dog!
Woof!
(This and the example above also show how to put a character's real name (not the %nickname) in a message btw.)
Talking of nicknames: The default message when someone changes is:
*Bamf!* You changed!
for the victim and
*Bamf!* (nickname) changed!
for any witnesses who may be nearby. (nickname) stands for the
victim's nickname of course (?). Unfortunately these messages do not use MPI,
so you can't use {name:me} to insert the victim's true name. But
you can change the messages. Just use LSedit to create a couple
of lists containing the message(s) you want to show. If you have more than
one the program will pick one from each list at random.
This is really more an advanced topic (so I'll just refer you to the
official docs found on the muck for further information, such as what the
different lists are called...!), just thought I'd clarify one thing. Each list pair has a corresponding prop called (name)-paired.
What does this do? Well maybe you figured it out the first time you read it
and I'm just slow, but the way it works is that if this prop is set to
yes the program will only generate one random number and then pick
that line from both lists. For example, line 3 and line 3. (It still uses a
separate random number to determine which morph is selected, so this is not
a way to have one special message for each morph...)
Some food for thought at the end: The TRaM program can change your description. Descriptions can contain calls to programs. Imagine a device that not just transforms people who use it or look at it, but gives them descriptions that contain calls to the TRaM program! Then everyone who looked at the TRaM victims would get transformed as well! And then the new victims would be just like the old... This would require setting up a public database though, and is beyond the scope of this little tutorial(?).