prev | toc | next
 

4.2 Making a Multi-Action

Over time, many players end up creating several handy little macro commands that provide shortcuts for frequent tasks, or create rooms that have a number of specific, local commands. Rather than creating a separate action for each command (an approach that quickly leads to dbase bloat and eats up your quota), you can combine a number of commands in a single action. The basic technique is to give the action an alias name for each command, store MPI strings in properties with the same names as the aliases, and use the command name typed by the user to determine which property should be executed.

The following example creates a multi-action that lets you determine the dbref of something in the same room, enter or review a page of `to do' notes, and remotely lock or unlock the door into your home. First, create the action attached to your character, and lock it to a condition that always fails. Since the action is attached to you, no one else should be able to use it... Nonetheless, it would be a good idea to secure the exit by linking it to something, such as a do-nothing program.

====================================
> @act ref;note;notes;lockhome;unlockhome = me
  Action created with number 9456 and attached.
> @lock ref = me&!me
  Locked.
> @link ref = $nothing
  Linked to gen-nothing.muf(#363FLM2).
====================================

The lock will fail unless the user is and is not you... it will always fail. Now, set the action's @fail with an MPI string that will cause other MPI strings stored in properties on the object to be executed.

====================================
> @fail ref = {exec:{&cmd}}
  Message set.
====================================

{&cmd} is a variable... it holds whatever command name the user typed. If you used the action by typing `ref', then the string `ref' would be substituted for {&cmd} when the @fail is parsed; if you used the the action by typing `notes', then `notes' would be substituted for {&cmd}.

{exec} evaluates the property following it, executing any MPI contained in it, and returning any resulting strings to the user. So, typing `notes' would cause the `notes' property on the object to be evaluated: {&cmd} would be replaced by `notes', and {exec} would use this value to determine which property it should evaluate.

Now, set a property for each alias, containing MPI that performs a function. One of the simplest ways to do this, is to force yourself to use a command. In order to do so, you need to be set X(forcible) and force_locked to yourself.

====================================
> @set me = X
  Flag set.
> @flock me = me
  Force lock set.

> @set ref =ref:{ref:{&arg}}
  Property set.
> @set note =note:{force:me,lsedit notes=notes}
  Property set.
> @desc note ={list:notes}
  Description set.
> @set notes =notes:{force:me,look notes}
  Property set.
> @set lockhome =lockhome:{force:me,@lock #17212=me&!me}
  Property set.
> @set unlockhome =unlockhome:{force:me,@unlock #17212}
  Property set.
====================================

The one action can now be used to do several different things. Typing `ref here' would show the dbref of the room you are in ({&arg}, like {&cmd}, a variable: it holds whatever was typed following the command name. If you typed `ref here', the &arg variable would hold the string `here'). Typing `note' would force you to use lsedit to edit your page of notes. Typing `notes' would force you to look at the notes: the list would be printed on your screen. Typing `lockhome' would force you to lock the exit into your home, specifying it by dbref so that it doesn't matter where on the MUCK you are located. Typing `unlockhome' would unlock the exit in the same way.

(Notice that several of the actions world by `forcing' you to do something. This is an easy way to make little macro commands. However, be aware that in order for it to work, you must be set 'Xforcible', and you must be 'force_locked' to yourself. So, do the following as well:

====================================
> @set me=X
  Flag set.
> @flock me=me
  Locked.
====================================
)

A single multi-action like this can be extended indefinitely, by adding aliases and a corresponding prop. To add a `look at my watch and check the time' function, you could rename the action and set a `watch' property that uses simple MPI.

====================================
> @name ref = ref;note;notes;lockhome;unlockhome;watch
  Name set.
> @set watch = watch:You glance at your watch. The time is {time}.
  Property set.

> watch
  You glance at your watch. The time is 14:18:46.
====================================

prev | toc | top | next