So you Desire a Streetcar of your own?

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

For a hint on how to find out the numbers on other mucks check the bottom of the page.

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 #3727

or 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!

(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(?).

A little warning: Most of the times the program just won't run if you made an error in the database, but some errors will make it start the process then give up halfway. Which leaves you in a rather nasty state of being halfway transformed! The problem is that not only is the TRaM-start program unable to finish the process because of corrupt data, but for exactly the same reason the TRaM-end program is unable to undo it!
If this happens to you (during testing I hope?), don't panic. Take a deep breath and start with @kill me to unschedule the scheduled TRaM-end call. Then just find out how the program can tell you're TRAMmed, and undo it.
Just kidding. I have got that figured out already. The TRaM programs store all the stuff they handle in a directory called _/TRaM/ (on your character). Erase this with @set me=_/tram: and Bob's your uncle. (Well, at least you will start with blank pages next time you get on the TRaM...)

I've got your number!

Right at the top I gave you the numbers for the programs used on FurryMuck and SpinDizzy, but what about other mucks? Well, you could ask someone, or (with a bit of luck) find out yourself!
How to find the number for the TRaM-end program is simple and outlined on the
main TRaM page. The number for the TRaM-start program is a bit harder to find. What you need is a TRaM device with the popular (?) delay feature enabled. What this means is that you don't get transformed immediately but after (typically) a few seconds. If you can type @ps within that time (press the button and pray very fast, as Lennier might say <g>), the table that comes up will show you (under Prog#) which program is scheduled to run next, and if you're lucky that is the TRaM-start program. If you were too slow you got the number of the TRaM-end program instead, but don't despair. Just try again (perhaps using a macro) and if it still doesn't work, either find a device with a longer delay or remember that the programs were installed at the same time and should have more or less similar numbers (like 73337 and 73333 on Furry). Check the other numbers in the same range with ex until you find one with the same owner, then @view it and see if you get the standard TRaM docs...
Extra bonus for those who have actually read this far: Here is another version of the database creating file above. This one does all the work for you: Creates an object called Magic Wand, sets up the database and creates a couple of actions... and tests it! ;).
Just one little thing: 142457 is the number of my Magic Wand, but it still works because I set my database public (one of the advanced options). To make the wand use your database just change the number to the number of your wand. (Actually this is only necessary if you want to experiment with editing the data...)
New: I have been working a bit on my Magic Wands and added "some" species... about 305 to be precise. So if you link a tram action to my database you should get a lot of variation! (The descriptions are pretty generic though, but it's still one of the biggest objects in the database...)
NOTE! This file use the program numbers from FurryMUCK. Change as appropriate for other mucks.
© 1999-2K1 by Ragnar Fyri. All rights reserved.
(Dedicated to Kristie and Skunkie with thanks for their help.)