home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / game / role / amigamud / client / doc / building.txt next >
Text File  |  1994-06-19  |  100KB  |  2,340 lines

  1. AmigaMUD, Copyright 1994 by Chris Gray
  2.  
  3.  
  4.         Online Building With the Standard Scenario
  5.  
  6. The standard AmigaMUD scenario contains a set of commands (the "build"
  7. commands) which allow players to add rooms and objects to the
  8. scenario, from within the scenario itself. In order to use these
  9. commands, a character must be a "builder". Only SysAdmin can make
  10. someone a builder, using the command
  11.  
  12.     cast makebuilder <character-name>
  13.  
  14. where <character-name> is the name of the character who is to be given
  15. builder privileges. The build commands do not provide the full power
  16. of construction and programming that is available to wizards and
  17. apprentices, but they provide enough to allow potential wizards to try
  18. out some of their ideas. If the player is using the AmigaMUD remote
  19. client interface, many of the build commands are available as mouse-
  20. clicks, and a few additional ones are available for customizing the
  21. automatically generated room graphics.
  22.  
  23. This document is divided into the following sections:
  24.  
  25.     - basic concepts
  26.  
  27.     - miscellaneous build commands
  28.  
  29.     - building rooms using commands
  30.  
  31.     - building objects using commands
  32.  
  33.     - miscellaneous operations using the mouse
  34.  
  35.     - building rooms using the mouse
  36.  
  37.     - building objects using the mouse
  38.  
  39.     - defining and attaching special actions
  40.  
  41. The basic "build" command, which can also be abbreviated as "b", "@"
  42. or "construct", swallows the remainder of the input line (or upto a
  43. period on the line), and parses it as a complete command. If the first
  44. word in the build command (after the "build", etc.) is "room" or
  45. "object", then this idea is applied again. Thus, in the build command:
  46.  
  47.     build room new north indoors in a test room
  48.  
  49. which can be abbreviated as:
  50.  
  51.     @r new n indoors in a test room
  52.  
  53. the real verb is the "new". The "build room" merely identifies the set
  54. of commands (called a "grammar" in AmigaMUD) to use.
  55.  
  56. The command forms of the build commands are described before the
  57. mouse-oriented forms since the command forms are likely to be more
  58. familiar to users of other MUDs. Also, many users will learn the
  59. mouse commands by experimentation, and will not need to read about
  60. them. Most of the build commands will show a usage line if they are
  61. used without the proper parameters. This is often quite helpful.
  62.  
  63. It must be noted that the build commands do not even come close to
  64. allowing builders to do everything that they might want to do. There
  65. are many things that can be done by a wizard or apprentice that cannot
  66. be done using the build commands. I am open to suggests for important
  67. things to add to the set of build commands, but such new commands must
  68. add significantly to the capabilities of builders, since there is a
  69. very large number of such possible new build commands.
  70.  
  71.  
  72. Basic Concepts
  73.  
  74. The basic entity in an AmigaMUD database is called a "thing". Things
  75. are little more than a pointer to a parent thing and a list of
  76. properties and values. Rooms and objects are just things. What makes
  77. them different is the set of properties they have. Rooms have
  78. properties that are pointers to other rooms they connect to, the name
  79. of the room, its description, etc. Objects also have names and
  80. descriptions, but can also have text that can be read, messages
  81. printed when they are touched or smelled, etc.
  82.  
  83. When some code in the scenario wants to find the value of a property
  84. of a thing, it doesn't just look at that thing. If the thing has a
  85. value for the property, then it is done, but if it doesn't have a
  86. value, then AmigaMUD will look at the parent of the thing (if it has
  87. one), looking for the property there. This will continue until a
  88. value is found for the property or there are no more parents. This
  89. type of searching for properties through ancestors is called
  90. "inheritance" in object-orient programming languages. Thus, AmigaMUD
  91. is sort-of an object-oriented system.
  92.  
  93. All rooms in the standard scenario present some sort of graphics to a
  94. player using the full graphics client. Much of the graphics is
  95. generated automatically, based on the type of room and the obvious
  96. exits from it. The AmigaMUD procedures to do the drawing are attached
  97. to empty rooms as properties. These "model" rooms are then made the
  98. parents of new rooms, and thus the new rooms will inherit the
  99. procedures to draw them. The connections to other rooms are examined
  100. in both the new rooms and the model rooms, but this works fine since
  101. the model rooms don't connect to any other rooms. The model rooms also
  102. contain the basic "scenery" words, as appropriate. For example, the
  103. indoors models include "floor" and "ceiling", while the outdoors
  104. models include "sky" and "ground".
  105.  
  106. Creating a new room in the scenario requires creating a new "thing";
  107. making it inherit scenery and graphics from the appropriate model
  108. room; and adding connections to other rooms. The room can also be
  109. decorated, by adding a general description, descriptions specific to
  110. directions, etc.
  111.  
  112. Creating a new object usually requires creating a new model object.
  113. This is so that several characters can have copies or clones of the
  114. object. For example, most characters will have a pen and a pad,
  115. purchased in the the store in the mall. These are just nearly empty
  116. "things" which inherit their descriptions from the models. When the
  117. scenario is checking to see if a character has a pen and pad in order
  118. to write a letter, it isn't looking at the names of things - it is
  119. checking that the character has an object whose parent is the pen
  120. model and another object whose parent is the pad model. The scenario
  121. could just check names if it was appropriate, and in some cases it
  122. does.
  123.  
  124. Ambitious players may want to add large, well-decorated areas to the
  125. database. It is convenient (almost required, when building) to have
  126. single-word symbols used to name the rooms and objects that are built.
  127. If a lot of building is done, the set of these symbols can be large
  128. and unwieldy. This situation arose during the construction of the
  129. standard scenario itself. To get around this problem, AmigaMUD has the
  130. concept of a "table", which is like a symbol table in a programming
  131. language. A table contains a bunch of symbols or names, and is
  132. independent of any other table. Thus, if a player has constructed two
  133. separate areas, he or she can use separate tables for their symbols,
  134. and thus have two rooms called "northRoom" without conflict. Several
  135. of the miscellaneous building commands deal with these tables.
  136.  
  137. The system uses tables itself for some internal purposes. There is a
  138. single "global table", which is the starting point for finding
  139. anything. This global table is always accessible, and is used to look
  140. up symbols if they aren't found anywhere else. Each character has
  141. their own "private table", which is not accessible to other
  142. characters. Builders can create other tables within their private
  143. tables. It is not desireable to always search all tables when looking
  144. for a symbol, otherwise the point of having separate ones is lost. So,
  145. there is the idea of a table being "in use". A table in use will be
  146. searched when looking up a symbol; all other tables are not searched.
  147. The character's private table and the public table are always in use,
  148. and are searched, in that order, after any other in use tables.
  149.  
  150. Things that can be put into tables include the names of rooms, the
  151. names of objects and the names of new properties that the builder
  152. creates. The AmigaMUD system also allows wizards and apprentices to
  153. define new AmigaMUD programs, and the names of these can also be put
  154. into tables. The build commands allow builders to define actions that
  155. can be attached to rooms and objects. These are actually converted
  156. into AmigaMUD programs by the build commands, and so can also be
  157. stored in builders' tables. Builders are shielded from the much more
  158. complex (and much more powerful) AmigaMUD programming language,
  159. however. Those interested in trying actual AmigaMUD programming must
  160. be raised to wizard or apprentice level by another wizard or
  161. apprentice. Initially, there are no apprentices in the system, and the
  162. only wizard is SysAdmin.
  163.  
  164. Here is a log of a sample build session. Commentary is indented and
  165. surrounded with square brackets.
  166.  
  167. input> look around
  168. You are west of the fountain.
  169. You see nothing special here.
  170. Obvious exits: north south
  171.  
  172.     [I am in the park in the standard scenario.]
  173.  
  174. input> build table private park
  175. input> @use park
  176.  
  177.     [I create a new table, in my private table, called "park", and add
  178.     the new table to my set of "in use" tables.]
  179.  
  180. input> build room new west indoors in the ice-cream parlour
  181. New room created and linked.
  182.  
  183.     [I create a new room, which is of type 'indoors'. It is to the
  184.     west of where I am now, and it is called "in the ice-cream
  185.     parlour".]
  186.  
  187. input> look
  188. You are west of the fountain.
  189. You see nothing special here.
  190. Obvious exits: north south west 
  191.  
  192.     [The exit to the new room shows up.]
  193.  
  194. input> west
  195. You are in the ice-cream parlour.
  196. You see nothing special here.
  197. Obvious exits: east
  198.  
  199.     [I go into the new room.]
  200.  
  201. input> @r same east out
  202. Link made.
  203. input> exits
  204. Obvious exits: east out 
  205.  
  206.     [I make the 'out' direction go the same place as 'east'.]
  207.  
  208. input> @r newdesc
  209. Room decorated.
  210. input> l
  211. You are in the ice-cream parlour.
  212. This is a small ice-cream parlour in the park. It serves several flavours of
  213. ice-cream, along with hot dogs and candy bars. The service counter is along
  214. the west wall, and includes the ice-cream freezers and covered racks for the
  215. candy bars. There are a half-dozen red metal tables in the front part of the
  216. parlour. Each table has four matching chairs. The door out is to the east.
  217. Obvious exits: east out 
  218.  
  219.     [I put a whole new description (it didn't have one before) on the
  220.     new room. Since I was using the full client program, it put me
  221.     into its internal editor to type in the description. If I hadn't
  222.     been using the full client, I would have been prompted to type the
  223.     description in line by line.]
  224.  
  225. input> @r dirdesc west
  226. Direction decorated.
  227. input> look west
  228. To the west is the service counter. Behind it is another counter for the
  229. servers to work on, a couple of refrigerators, a hot dog rotisserie and some
  230. storage cupboards.
  231.  
  232.     [I similarly add a direction-specific description.]
  233.  
  234. input> build object new park tables "tables;red,metal"
  235. Object created - you are carrying it.
  236. input> drop tables
  237. red metal tables: dropped.
  238. input> l tables
  239. You see nothing special about the red metal tables.
  240. input> @o newdesc tables
  241. Object description entered.
  242. input> look tables
  243. The tables are nothing special. They have curved metal legs with a bit of
  244. scrollwork, and a flat metal top.
  245.  
  246.     [I create a 'tables' object, and decorate it. Note that I call it
  247.     "tables" and not just "table", since there are more than one in
  248.     the room, and I want the messages to come out right. The symbol I
  249.     use for it/them in my symbol table doesn't matter, however.]
  250.  
  251. input> @o new park chairs "chairs;red,metal"
  252. Object created - you are carrying it.
  253. input> drop chairs
  254. red metal chairs: dropped.
  255. input> @o newdesc chairs
  256. Object description entered.
  257. input> l chairs
  258. The chairs are as simple as the tables. They have a solid metal seat and a
  259. mesh metal back, all held in place by curved tubes, which also form the legs.
  260.  
  261.     [Some chairs to go along with the tables.]
  262.  
  263. input> @o gettable tables no
  264. tables marked as not gettable.
  265. input> @o gettable chairs no
  266. chairs marked as not gettable.
  267. input> get tables
  268. You cannot get the red metal tables.
  269.  
  270.     [Don't want people stealing my decorations!]
  271.  
  272. input> look
  273. You are in the ice-cream parlour.
  274. This is a small ice-cream parlour in the park. It serves several flavours of
  275. ice-cream, along with hot dogs and candy bars. The service counter is along
  276. the west wall, and includes the ice-cream freezers and covered racks for the
  277. candy bars. There are a half-dozen red metal tables in the front part of the
  278. parlour. Each table has four matching chairs. The door out is to the east.
  279. Obvious exits: east out 
  280. Nearby:
  281.   red metal tables
  282.   red metal chairs
  283.  
  284.     [Hmmm. I don't want them showing up this way.]
  285.  
  286. input> @o invisible tables true
  287. tables marked as invisible.
  288. input> @o invisible chairs true
  289. chairs marked as invisible.
  290. input> l
  291. You are in the ice-cream parlour.
  292. This is a small ice-cream parlour in the park. It serves several flavours of
  293. ice-cream, along with hot dogs and candy bars. The service counter is along
  294. the west wall, and includes the ice-cream freezers and covered racks for the
  295. candy bars. There are a half-dozen red metal tables in the front part of the
  296. parlour. Each table has four matching chairs. The door out is to the east.
  297. Obvious exits: east out 
  298.  
  299.     [That's better.]
  300.  
  301. input> out
  302. You are west of the fountain.
  303. You see nothing special here.
  304. Obvious exits: north south west 
  305. input> @r adddesc
  306. Room redecorated.
  307. input> look
  308. You are west of the fountain.
  309. There is an ice-cream parlour to the west.
  310. Obvious exits: north south west 
  311.  
  312.     [Let people outside know that my new room is here.]
  313.  
  314. input> @showtable park
  315. Symbols in table:
  316.  chairs        tables    
  317.  
  318.     [What symbols do I have in my 'park' table?]
  319.  
  320. input> @describe park chairs
  321. chairs: thing, parent <NIL-THING>, owner SysAdmin, useCount 2, propCount 6,
  322.     ts_public:
  323.   p_oName: "chairs;red,metal"
  324.   <PROPERTY>: <THING>
  325.   p_oCreator: <THING>
  326.   <PROPERTY>: <THING>
  327.   <PROPERTY>:
  328. "The chairs are as simple as the tables. They have a solid metal seat and a "
  329. "mesh metal back, all held in place by curved tubes, which also form the "
  330. "legs."
  331.   <PROPERTY>: true
  332.   <PROPERTY>: true
  333.  
  334.     [I'll add a public table to my 'in use' list and redo that.]
  335.  
  336. input> @use t_base
  337. input> @describe park chairs
  338. chairs: thing, parent <NIL-THING>, owner SysAdmin, useCount 2, propCount 6,
  339.     ts_public:
  340.   p_oName: "chairs;red,metal"
  341.   p_oHome: <THING>
  342.   p_oCreator: <THING>
  343.   p_oWhere: <THING>
  344.   p_oDesc:
  345. "The chairs are as simple as the tables. They have a solid metal seat and a "
  346. "mesh metal back, all held in place by curved tubes, which also form the "
  347. "legs."
  348.   p_oNotGettable: true
  349.   p_oInvisible: true
  350.  
  351.  
  352. Miscellaneous Build Commands
  353.  
  354. A summary of these commands can be found on-line by going into the
  355. Builder's Guild library and reading the "Book of Introduction". In
  356. these commands <table> refers to any table that you have access to.
  357. Initially this is just "private" or "public", but if you create new
  358. tables using the "@table" command, you can use them too. <symbol>
  359. refers to any valid symbol. Valid symbols start with a letter or an
  360. underscore (_) and contain only letters, underscores and digits. Note
  361. that the system will actually allow other symbols, e.g. ones with
  362. spaces in them, but it is not advisable to use such symbols, for a
  363. couple of reasons. One is that you will always have to put them in
  364. quotes to refer to them. The other is that they cannot be referred to
  365. from the AmigaMUD programming language; so you would have trouble with
  366. them if you ever became a wizard or apprentice.
  367.  
  368. Note that many of these commands are only of use to those who will be
  369. writing actions to attach to rooms and objects. Beginning readers may
  370. wish to skip the descriptions of "@flag", "@counter", and "@string",
  371. and much of the description of "@use".
  372.  
  373. The miscellaneous build commands are:
  374.  
  375.     @showtable <table> - this command shows the symbols defined in a
  376.     given table. The <table> can be a symbol which is defined in a
  377.     table which is currently in use, or can be "public" (referring
  378.     to the system-wide global table) or "private" (referring to
  379.     your private symbol table).
  380.  
  381.     @describesymbol <table> <symbol> - this command will dump out the
  382.     value of the given symbol defined in the given table. The
  383.     output format will vary, depending on the nature of the symbol
  384.     being defined. Some details of the output may not be obvious -
  385.     they are explained in the "Wizard" document. "@describesymbol"
  386.     can be abbreviated as "@describe" or just "@d".
  387.  
  388.     @deletesymbol <table> <symbol> - the given symbol is deleted from
  389.     the table. The system will not let you delete symbols which
  390.     are the only pointer to something that it cannot delete. For
  391.     example, if you have a property called "frotz" which you have
  392.     used on some of your objects, then you cannot delete the
  393.     symbol table entry for "frotz" until all of those objects (and
  394.     any descendants of them) are gone. "@deletesymbol" can be
  395.     abbreviated as "@delete".
  396.  
  397.     @movesymbol <from-table> <to-table> <symbol> - this command is
  398.     used to move symbols from one table to another. This is useful
  399.     if a table is getting too full for convenient use, and you
  400.     want to split it up and move symbols to another, new table.
  401.     Alternatively, if a table created for some purpose proved to
  402.     be not necessary, the symbols can be moved out of it and the
  403.     table deleted. "@movesymbol" can be abbreviated as "@move".
  404.  
  405.     @renamesymbol <table> <old-symbol> <new-symbol> - this command
  406.     allows you to change the name of a symbol. The new name must
  407.     not already exist in the table. Beware of changing a symbol
  408.     to a name that already exists in another table that you might
  409.     need to "use" at the same time. There is no restriction on
  410.     doing so, but it can cause troubles when trying to refer to a
  411.     specific one of the symbols. "@renamesymbol" can be
  412.     abbreviated as "@rename".
  413.  
  414.     @flag <table> <symbol> - this command creates a new "flag"
  415.     property. Flag properties are those which can hold only a
  416.     "true" or "false" value, and which can be tested in actions.
  417.     In the terminology of the AmigaMUD programming language, flags
  418.     are of type "property bool". In the above example,
  419.     "p_oNotGettable" and "p_oInvisible" are flags. The naming
  420.     convention I have used there is that property names start with
  421.     "p_", and properties specifically for objects start with
  422.     "p_o". You need not follow this convention, but others might
  423.     be able to understand your creations better if you do.
  424.  
  425.     @counter <table> <symbol> - this command creates a new "counter"
  426.     property. Counter properties hold numbers, either positive or
  427.     negative. In AmigaMUD terminology they are "property int".
  428.     Note that the numbers that they hold cannot have a decimal
  429.     point in them - AmigaMUD has no provisions for that.
  430.  
  431.     @string <table> <symbol> - this command creates a new "string"
  432.     property. String properties hold character strings, such as
  433.     "this is a string" or "Fred". In AmigaMUD terminology they are
  434.     "property string". In AmigaMUD, strings are limited to about
  435.     4000 characters.
  436.  
  437.     @table <existing-table-name> <new-table-name> - this command is
  438.     used to create new tables, as in the example above. If you
  439.     find yourself doing a lot of building and defining a lot of
  440.     symbols, you should probably create some tables to put some of
  441.     the symbols in, so that you can organize them better. For
  442.     example, if you build a castle to the north of the town, you
  443.     might want to create a table called "castle" and put all of
  444.     the castle-related symbols in there. Then, they won't get
  445.     mixed up with symbols for, say, a tunnel area, the symbols
  446.     for which you can keep in a table called "tunnels".
  447.  
  448.     @use <table> - this command adds a table to your set of "in use"
  449.     tables. This concept might be a bit foreign for some, so I'll
  450.     try to explain in more detail. Lets say that you have created
  451.     a castle area, whose symbols you have put into a "castle"
  452.     table, and you have created a tunnel area, whose symbols you
  453.     have put into a "tunnels" table. Now you want to make the
  454.     castle bigger by adding a dungeon. To keep the new dungeon
  455.     symbols from getting mixed up with the rest of the castle
  456.     (both might have a "northEastCorner" room for example), you
  457.     create a table called "dungeon", in the "castle" table, and
  458.     put the new symbols in it. If we then draw your set of
  459.     symbols, it looks like an upside-down tree, as in:
  460.  
  461.         public           private
  462.         / | \           /  |  \ \ \
  463.            /  |  \          /   |   \ \ \
  464.           /   |   \      /    |    \ \ \
  465.      "t_base"        /     |     \ \ \
  466.              "tunnels" "castle"  others
  467.               / |  \    /  | \
  468.              /  |    \  /   |  \
  469.             /   |    |  |   |  "dungeon"
  470.  
  471.     If you want to rename symbol "room1" in "dungeon" to "room2",
  472.     how do you do it? The @rename command only takes a table name,
  473.     and the system can only find "tunnels" and "castle" in your
  474.     private table. We don't want the system to search all tables,
  475.     since then there is no point in having multiple ones. Also, in
  476.     the AmigaMUD programming language, and when using build
  477.     commands to write actions, there is no opportunity to specify
  478.     a table - the name must be found directly. Instead, the system
  479.     has a list of "in use" tables which it will search in for
  480.     symbols. So, to do the rename mentioned above, you could do:
  481.  
  482.         @use castle
  483.         @rename dungeon room1 room2
  484.  
  485.     and to then be able to refer to "room2" in an action, you
  486.     could do:
  487.  
  488.         @use castle
  489.         @use dungeon
  490.         ... refer to "room2" ...
  491.  
  492.     Note the use of "@use t_base" in the example at the end of the
  493.     previous section. "t_base" is a table inside the global table
  494.     ("public") which contains such things as "p_oNotGettable",
  495.     "p_oName", etc. Most of the public symbols that a builder
  496.     might want to know about are in that table, but if you want to
  497.     really explore the standard scenario, you can do something
  498.     like this:
  499.  
  500.         @showtable public
  501.         @describe public t_fight
  502.         @showtable t_fight
  503.         @describe t_fight p_pHitMax
  504.         ... etc. ...
  505.  
  506.     Doing this, you will soon end up @describe-ing AmigaMUD
  507.     procedures. In them, you will see a lot of "<REF>"'s. This
  508.     means that the procedure references a symbol that is not
  509.     defined in your current set of "in use" tables. When exploring
  510.     like this, it is useful to have the table you are looking at
  511.     "in use", (here "t_fight"), along with "t_base", "t_util",
  512.     "t_graphics" and "t_icons".
  513.  
  514.     @unuse <table> - this command removes a table from your list of
  515.     "in use" tables.
  516.  
  517.     @symbolhere <table> <symbol> - this command defines a symbol as a
  518.     name for the current location. This allows you to name the
  519.     rooms that you create, which allows you to "@poof" to them.
  520.  
  521.     @poof <symbol> - this command allows you to instantaneously
  522.     teleport from the current room, which you must have built, to
  523.     the named room (named with "@symbolhere"), which you must also
  524.     have built. This is very handy when you are building large
  525.     areas, since it can be quite tedious to have to go back and
  526.     forth in the area to add connections between rooms, etc. It's
  527.     also great for impressing players that aren't builders and
  528.     can't do it, or who don't know about it.
  529.  
  530.  
  531. Building Rooms Using Commands
  532.  
  533. Commands for building rooms are all under the "room" (or just "r")
  534. build command. A summary of them can be found on-line by reading the
  535. "Book of Rooms" in the Builder's Guild library. In order to be able to
  536. build in or onto a room, one of the following must hold:
  537.  
  538.     - you are SysAdmin
  539.     - you own the room (you built it)
  540.     - the room's thing has status "ts_public"
  541.     - the room's thing has status "ts_wizard" and you are a wizard
  542.  
  543. The last condition allows wizards to protect critical areas from
  544. mistakes made by beginners, while at the same time allowing other
  545. wizards to build from them. The room-building commands are:
  546.  
  547.     @r new <dir> <kind> <room-name> - this is the basic command for
  548.     building new rooms, and it was illustrated in the initial
  549.     building example. It builds a new room in the direction <dir>
  550.     from the current room. <dir> can be a full direction name or
  551.     an abbreviation. <kind> is the kind of room, which controls
  552.     what its default automatic graphics will look like, and what
  553.     it has for default scenery. <kind> can be one of: indoors,
  554.     outdoors, forest, field, path, road, sidewalk, park or tunnel.
  555.     <room-name> is a sequence of words (does not need to be
  556.     quoted), which makes sense as the short description of the
  557.     room when used in the form "You are <room-name>.". The
  558.     scenario adds the "You are " and the period and newline when
  559.     it is printing the message - there is no way to get rid of
  560.     them. This was a deliberate choice, to prevent confusion. When
  561.     a room is created, the current room is given an obvious exit
  562.     to it (the direction shows up in the "exits" list), and the
  563.     new room is given an obvious exit in the reverse direction
  564.     back to the current room.
  565.  
  566.     @r newname <room-name> - allows you to change the name of the
  567.     current room. See the "@r new" discussion for the format of
  568.     room names.
  569.  
  570.     @r hide <dir> - allows you to hide or unhide an exit from the
  571.     current room. A hidden exit does not appear in the "exits"
  572.     list. Hiding a hidden exit makes it unhidden.
  573.  
  574.     @r same <old-dir> <new-dir> - this command makes a new obvious
  575.     exit from the current room in direction <new-dir> that goes to
  576.     the same room as <old-dir>. This is most often used to make
  577.     directions "in" and "out" work. Note that the connection made
  578.     is only in the one direction - the reverse link is not
  579.     automatically made, as it is in "@r new".
  580.  
  581.     @r scenery <word> ... <word> - the <word>'s are made available in
  582.     this location as scenery words. That is, they can be used in
  583.     commands by a player, but cannot be manipulated. This is like
  584.     "ceiling" or "sky". This setup is used to avoid having to
  585.     build objects for everything in the room's description, so
  586.     that player's don't get annoyed by the repeated "There is no
  587.     <whatever> here." messages. The <word>'s can be full object
  588.     names as in "book;big,black" (see the later section on
  589.     building objects), but must then be quoted. The object names
  590.     should not contain periods, since periods are used to separate
  591.     the individual scenery <word>'s internally.
  592.  
  593.     @r newdesc - this command allows you to replace the description of
  594.     the current room. The scenario prints this long description
  595.     exactly as you type it. As with all such descriptions in
  596.     AmigaMUD, however, the exact line structure of the description
  597.     is not preserved - it is reformatted according to the width of
  598.     the user's display (not the builder's display!). If you are
  599.     using the full AmigaMUD client program, you will be put into
  600.     either the internal editor or your external editor to edit the
  601.     description, otherwise you will be prompted to enter the
  602.     description line by line. Also, if an editor is used, the old
  603.     description is put into the editor for you. If you delete the
  604.     entire description, or enter no lines for the new description,
  605.     then the room is left with no long description.
  606.  
  607.     @r adddesc - this command allows you to append to the current
  608.     description. It is very similar to "@r newdesc". The
  609.     differences are that if you are using the full client, and you
  610.     end with an empty buffer, then the description is not changed;
  611.     and if you are not using the full client, then any lines you
  612.     enter are appended (with a space added if needed) to any
  613.     existing description.
  614.  
  615.     @r linkto <dir> <room-name> - this command makes a link from the
  616.     current room, in the indicated direction, to the room which
  617.     has been named <room-name> (using the @symbolhere command).
  618.     This command is useful for building circular room structures,
  619.     non-flat interconnections, etc.
  620.  
  621.     @r unlink <dir> - use this command to remove an exit from the
  622.     current room. Be careful not to remove all exits to or from a
  623.     given room unless you have a symbol for it, or you want it to
  624.     disappear.
  625.  
  626.     @r dark [y|n] - use this command to make a room dark or not dark.
  627.     All rooms created with these commands are initially not dark.
  628.     If no 'y' or 'n' is given, then 'y' is assumed.
  629.  
  630.     @r lock [y|n] - this command allows you to "lock" the current
  631.     room. Locking a room prevents anyone other than you or
  632.     SysAdmin from entering it. This is useful when you are just
  633.     building an area and you don't want people in it until you are
  634.     finished with it. Usually, just locking the entrance room to
  635.     an area is sufficient.
  636.  
  637.     @r status {readonly|wizard|public} - this command sets the "thing
  638.     status" of the current room. A room which is "readonly" cannot
  639.     be changed by anyone other than you and SysAdmin. A room which
  640.     has status "wizard" can only be changed by wizards, and a room
  641.     with status "public" can be changed by any builder. As a vague
  642.     rule, rooms should be public if things built on to them would
  643.     not harm the consistency or flavour of your area. They should
  644.     be "wizard" if careful construction wouldn't hurt, but random
  645.     changes would.
  646.  
  647.     @r dirdesc <dir> - this command allows you to enter a direction
  648.     specific description to the current room. This is a message
  649.     that will be seen by characters who look in that direction
  650.     from the room. An example direction description would be
  651.     something like "There is a dark tunnel to the north.".
  652.  
  653.     @r dirmessage <dir> - this command adds a direction specific
  654.     message to the room. This is a message which is seen by
  655.     characters as they leave the room in that direction. This can
  656.     be used for things like "You enter the dark tunnel.".
  657.  
  658.     @r diromessage <dir> - this command adds a direction specific
  659.     message for other characters. This is a message which is shown
  660.     to other characters in the room when someone leaves in the
  661.     indicated direction. The name of the character leaving and a
  662.     space is printed before the text of the message. An example
  663.     would be "enters the dark tunnel.".
  664.  
  665.     @r diremessage <dir> - this command adds a direction specific
  666.     exiting message. This is a message seen by other characters in
  667.     the room when a character enters the room from the given
  668.     direction. An example would be "comes out of the dark
  669.     tunnel.".
  670.  
  671.     @r makebank - this command makes the current room into a bank.
  672.     This adds the special commands "balance", "deposit" and
  673.     "withdraw" to the room. Note that all banks are independent -
  674.     funds in one cannot be accessed from another. Using this
  675.     command on a bank will make it not be a bank, so long as no
  676.     character has an account at it.
  677.  
  678.     @r makestore - this command makes the current room into a store.
  679.     This makes it possible for characters to use the "shop"
  680.     command, and to "buy" items which are for sale. If used in a
  681.     room which is already a store, then the room will be made not
  682.     a store, but only if there is nothing for sale in it yet.
  683.  
  684.     @r addforsale <object-symbol> <price> - this will make the given
  685.     object (see the next section for how to create objects) for
  686.     sale at this store for the indicated price. Note that when a
  687.     character buys at a store, they get a copy (actually a thing
  688.     whose parent is the one you specify here) of the object, and
  689.     not the object itself. Thus, there is no limit to the number
  690.     of the objects which various characters can buy.
  691.  
  692.     @r subforsale <object-symbol> - make the object be no longer for
  693.     sale in this room. Note that there is no button corresponding
  694.     to this command.
  695.  
  696.     @r descaction <table> <action-symbol> - this command is used to
  697.     define actions which are suitable for use as room description
  698.     actions.
  699.  
  700.     @r setdescaction <action-symbol> - this command sets the
  701.     description of the current room to be the named action (see a
  702.     later section on creating actions). Using an action as a
  703.     description instead of a string allows the description to
  704.     change, based on whatever the action chooses to test. If
  705.     <action-symbol> is "nil", then the description action is
  706.     removed.
  707.  
  708.     @r checker <table> <action-symbol> - this command allows you to
  709.     define a room action. It is placed in the indicated table.
  710.     Actions are discussed later. An action produced this way is
  711.     suitable for use as a "direction checker".
  712.  
  713.     @r adddircheck <dir> <action-symbol> - this command adds a
  714.     "checker" action to the indicated direction from the current
  715.     room. Such an action is called when a character attempts to
  716.     leave in the indicated direction. The action (actions are
  717.     described later) can prevent the character leaving, based on
  718.     some conditions as determined by the checker, and can print to
  719.     the character and others messages depending on the success or
  720.     failure of the exiting. The action can also modify the
  721.     character or the room. The <dir> in this case can also be
  722.     "anyenter" or "anyexit", indicating that the checker is called
  723.     when a character attempts to enter the room from any
  724.     direction, or attempts to leave the room by any direction,
  725.     respectively. There can be more than one "checker" associated
  726.     with any direction. All can block passage.
  727.  
  728.     @r subdircheck <dir> <action-symbol> - this command allows a
  729.     builder to remove a specific checker from the indicated
  730.     direction.
  731.  
  732.     @r showdirchecks <dir> - this command shows the direction
  733.     "checkers" attached to the given direction from this room. If
  734.     a particular checker is yours, then just its symbol is
  735.     printed, otherwise a printout of the AmigaMUD programming
  736.     language code of the checker is produced. In the latter, it is
  737.     likely that you will see "<REF>"'s, since flags, etc. tested
  738.     will be in other builders' private symbol tables.
  739.  
  740.     @r specialaction <table> <action-symbol> - define an action that
  741.     can be used to execute a special command in a room. The
  742.     special commands can be added using "@r addspecialaction".
  743.  
  744.     @r addspecialaction <action-symbol> <verb-form> - this command
  745.     allows you to add special commands to the current room. This
  746.     is the same internal technique which was used to add the
  747.     special commands to banks. <action-symbol> is the name of an
  748.     action, defined using "@r specialaction", which is to be
  749.     executed to do the command. <verb-form> is either a single
  750.     word or a quoted, comma-separated list of words giving the
  751.     word or words that is to operate in this room. E.g. if a
  752.     special action named "doSmoogle" is defined in an in-use
  753.     table, then:
  754.  
  755.         @r addspecialaction doSmoogle "smoogle,frink"
  756.  
  757.     would enable commands "smoogle" and "frink" in the current
  758.     room, with action "doSmoogle" setup to handle the command.
  759.     Actions are described in a later section. More than one
  760.     special action can be added to a given room.
  761.  
  762.     @r subspecialaction <action-symbol> <verb-form> - this is the
  763.     reverse of the previous command - it allows special commands
  764.     to be removed from the current room.
  765.  
  766.  
  767. Building Objects Using Commands
  768.  
  769. Commands for building objects are all under the "object" (or just "o")
  770. build command. A summary of them can be found on-line by reading the
  771. "Book of Objects" in the Builder's Guild library. In many cases,
  772. copies or clones of objects will exist. E.g. if a builder creates a
  773. "glass vase" and makes it available for sale in a store, any number of
  774. characters can buy such vases. Each will be a simple "thing" with the
  775. master vase as its parent. This means that any changes made to the
  776. main vase object, using the object building commands, will be
  777. immediately reflected in all of the purchased ones. This can be quite
  778. confusing to players who don't understand what is happening, so it is
  779. a good idea to not make your new objects accessible in this way until
  780. you have finished modifying them.
  781.  
  782. One aspect of objects should be handled carefully. This is the name of
  783. the object (not the symbol you define, but the name by which they will
  784. appear to players). These are given in a standardized, internal form.
  785. This form is handled by several built-in AmigaMUD functions, including
  786. the parser, and the code which searches for matching objects on lists
  787. of them. The basic form is that of a noun, optionally followed by a
  788. semicolon and a comma-separated list of adjectives. The example above
  789. shows two examples of this form. Additionally, the noun can be a
  790. comma-separated list of alternative forms. E.g.
  791.  
  792.     rock,stone;large,granite
  793.  
  794. When the system shows an object with this name in a room or being
  795. carried, etc., it will be printed as "large granite rock". Only the
  796. first noun alternative is printed, and the adjectives are printed
  797. before it. When referred to by a player, any of the following forms
  798. will match it:
  799.  
  800.     stone
  801.     rock
  802.     granite rock
  803.     large stone
  804.     large granite rock
  805.     granite large large large stone
  806.     ...
  807.  
  808. Additionally, the names given to objects can be a period-separated
  809. list of the above internal forms. E.g.
  810.  
  811.     shelf;wooden,book.shelve,shelf,bookshelf,book-shelf;book,wooden,wood
  812.  
  813. This example would be printed as "wooden book shelf". The second
  814. alternative will not be printed by the system (which is good, since it
  815. would come out as "book wooden wood shelve"). It is there to allow a
  816. good selection of alternative inputs by players, like:
  817.  
  818.     wooden book shelf
  819.     wooden book-shelf
  820.     wood book shelves
  821.     ...
  822.  
  823. The system will automatically handle simple plurals when matching. In
  824. the following descriptions, this general form will be indicated by
  825. using "<name-alternatives>".
  826.  
  827. The object-building commands are:
  828.  
  829.     @o new <table> <object-symbol> "<name-alternatives>" - this
  830.     command creates a new object. The object will have no
  831.     properties other than its name, and the builder will be
  832.     carrying it. The builder must have carrying capacity for the
  833.     additional object. A symbol for the object is added to the
  834.     given table. The object's "thing" will have no parent, i.e.
  835.     the object will not inherit any properties. The <name-
  836.     alternatives> should be given in quotes since otherwise the
  837.     punctuation inside it would prematurely terminate the entire
  838.     command.
  839.  
  840.     @o destroy <table> <object-symbol> - this command is used to
  841.     destroy an object that is no longer needed. You must be
  842.     carrying the object in order to destroy it (carrying a clone
  843.     of the object is not good enough). The "usecount" of an object
  844.     should be '2' in order to properly destroy it (one use is the
  845.     symbol which names the object, and the other is that of the
  846.     object being carried). Being for sale in a store adds to an
  847.     object's usecount, so it should not be destroyed if it is for
  848.     sale. This command will let you destroy an object which has
  849.     existing clones, but this is not a good thing to do, and will
  850.     leave a mess that SysAdmin will have to try to clean up. There
  851.     is no way within the system to find objects which are clones
  852.     of another.
  853.  
  854.     @o newname <object-symbol> "<name-alternatives>" - this command
  855.     simply provides a new name for an existing object. This
  856.     command can be abbreviated as "@o name".
  857.  
  858.     @o newdesc <object-symbol> - this command allows you to enter a
  859.     description of the object. As in entering room descriptions,
  860.     players using the full AmigaMUD client program will be put
  861.     into the editor to edit the description. Finishing with an
  862.     empty description will delete the description from the object.
  863.     "@o newdesc" can be abbreviated as "@o desc".
  864.  
  865.     @o readstring <object-symbol> - this command allows you to enter a
  866.     string that is the readable message on the indicated object.
  867.     Finishing with an empty readstring will delete the readstring
  868.     from the object.
  869.  
  870.     @o gettable <object-symbol> [yes|no] - this command allows the
  871.     builder to control whether or not an object can be picked up.
  872.     Typically, object which are part of the scenery in a room are
  873.     made not gettable. If no "yes" or "no" is given, then "yes" is
  874.     assumed.
  875.  
  876.     @o islight <object-symbol> [yes|no] - this command controls
  877.     whether or not an object emits light. For example, a
  878.     flashlight emits light. Using this command, there is no way to
  879.     make a light which can be turned on and off. If no "yes" or
  880.     "no" is given, then "yes" is assumed. "@o islight" can be
  881.     abbreviated as "@o light".
  882.  
  883.     @o invisible <object-symbol> [yes|no] - this command is used to
  884.     make an object invisible or not. Invisible objects do not show
  885.     up in a room's contents or in the inventory of a character.
  886.     They are mostly used in rooms as decorations, such as the
  887.     tables and chairs in the above example. If no "yes" or "no" is
  888.     given, then "yes" is assumed.
  889.  
  890.     @o container <object-symbol> <count> - this command controls
  891.     whether or not an object is a container. <count> is the number
  892.     of objects that the container can hold. If count is 0, then
  893.     the object is made to be no longer a container. Note that when
  894.     objects which are containers are purchased in a store, the
  895.     "containerness" of them is attached to the newly created
  896.     purchased object. Thus, making an object no longer a container
  897.     does not make any existing clones not be containers.
  898.  
  899.     @o sitin <object-symbol> <count>
  900.     @o siton <object-symbol> <count>
  901.     @o liein <object-symbol> <count>
  902.     @o lieon <object-symbol> <count> - these commands are use to make
  903.     an object available for the indicated action. A count of 0
  904.     removes the action. A non-zero count indicates how many
  905.     characters can simultaneously use the action. For example:
  906.  
  907.         @o new private bench "bench;short,wooden"
  908.         @o gettable bench no
  909.         @o invisible bench yes
  910.         @o siton bench 2
  911.         drop bench
  912.  
  913.     sets up a bench in the current room, such that two characters
  914.     can sit on it. Such characters will be described as sitting on
  915.     the bench when others look around the room.
  916.  
  917.     @o setactword <object-symbol> "word,synonym,..." - this command
  918.     allows the builder to add a single arbitrary action that can
  919.     be performed when the object is being carried. Either a single
  920.     word that is the new command is given, or a list of alternate
  921.     words separated by commas is given. For example, using:
  922.  
  923.         @o setactword vase "blorple,snooble"
  924.  
  925.     makes new command "blorple" (or its equivalent "snooble")
  926.     available to any character carrying the vase. The command can
  927.     either just print a string or can be an action, as described
  928.     below.
  929.  
  930.     @o setactstring <object-symbol> - this commands enters a string
  931.     which is to be shown to a character who uses the special "act"
  932.     command of the object. Printing the string will be the only
  933.     result of using the "act" command.
  934.  
  935.     @o actaction <table> <action-symbol> - this command defines a new
  936.     "act" action, which is suitable for use with the
  937.     "@o setactaction" command. Actions in general are described in
  938.     a later section.
  939.  
  940.     @o setactaction <object-symbol> <action-symbol> - this command
  941.     sets the given action to be done as the result of a player
  942.     using the "act" command of the object. The action is created
  943.     using the "@o actaction" command. If <action-symbol> is "nil"
  944.     then any actaction on the object is removed.
  945.  
  946.     @o descaction <table> <action-symbol> - this command defines a new
  947.     object description action, which is suitable for use with the
  948.     "@o setdescaction" and "@o setreadaction" commands.
  949.  
  950.     @o setdescaction <object-symbol> <action-symbol> - this command
  951.     sets an object description action as the description for the
  952.     named object. Using an action as the description allows the
  953.     description to change, depending on circumstances. The action
  954.     can be created using "@o descaction". If <action-symbol> is
  955.     "nil", then any description action on the object is removed.
  956.  
  957.     @o setreadaction <object-symbol> <action-symbol> - this command
  958.     sets an object read action as the readable text for the named
  959.     object. The action can be created using "@o descaction". If
  960.     <action-symbol> is "nil", then any read action is removed.
  961.  
  962.     @o playstring <object-symbol>
  963.     @o erasestring <object-symbol>
  964.     @o eatstring <object-symbol>
  965.     @o usestring <object-symbol>
  966.     @o activatestring <object-symbol>
  967.     @o deactivatestring <object-symbol>
  968.     @o lightstring <object-symbol>
  969.     @o extinguishstring <object-symbol>
  970.     @o wearstring <object-symbol>
  971.     @o touchstring <object-symbol>
  972.     @o smellstring <object-symbol>
  973.     @o listenstring <object-symbol>
  974.     @o openstring <object-symbol>
  975.     @o closestring <object-symbol>
  976.     @o pushstring <object-symbol>
  977.     @o pullstring <object-symbol>
  978.     @o turnstring <object-symbol>
  979.     @o liftstring <object-symbol>
  980.     @o lowerstring <object-symbol>
  981.     @o getstring <object-symbol>
  982.     @o unlockstring <object-symbol> - these commands allow the builder
  983.     to set a string on an object which is displayed when a
  984.     character applies the corresponding command to that object.
  985.     E.g.
  986.  
  987.         input> eat vase
  988.         You cannot eat the vase.
  989.         input> @o eatstring vase
  990.         Object eat string entered.
  991.         input> eat vase
  992.         The vase is much too valuable to waste by eating it.
  993.         Besides, the glaze is probably poisonous.
  994.         input>
  995.  
  996.     As usual, builders using the AmigaMUD client program will be
  997.     put into an editor to enter or change the string, while others
  998.     will be prompted to enter it line by line.
  999.  
  1000.     @o checker <table> <action-symbol> - this command defines a new
  1001.     object checker action, which is suitable for use with the set
  1002.     of "@o XXXchecker" commands described immediately below.
  1003.  
  1004.     @o playchecker <object-symbol> <action-symbol>
  1005.     @o erasechecker <object-symbol> <action-symbol>
  1006.     @o eatchecker <object-symbol> <action-symbol>
  1007.     @o usechecker <object-symbol> <action-symbol>
  1008.     @o activatechecker <object-symbol> <action-symbol>
  1009.     @o deactivatechecker <object-symbol> <action-symbol>
  1010.     @o lightchecker <object-symbol> <action-symbol>
  1011.     @o extinguishchecker <object-symbol> <action-symbol>
  1012.     @o wearchecker <object-symbol> <action-symbol>
  1013.     @o touchchecker <object-symbol> <action-symbol>
  1014.     @o smellchecker <object-symbol> <action-symbol>
  1015.     @o listenchecker <object-symbol> <action-symbol>
  1016.     @o openchecker <object-symbol> <action-symbol>
  1017.     @o closechecker <object-symbol> <action-symbol>
  1018.     @o pushchecker <object-symbol> <action-symbol>
  1019.     @o pullchecker <object-symbol> <action-symbol>
  1020.     @o turnchecker <object-symbol> <action-symbol>
  1021.     @o liftchecker <object-symbol> <action-symbol>
  1022.     @o lowerchecker <object-symbol> <action-symbol> - these build
  1023.     commands will enter an action as the response to using the
  1024.     given verb on the indicated object. Appropriate actions can be
  1025.     built using the "@o checker" command. There are no "getaction"
  1026.     or "unlockaction" commands - the options here are more complex
  1027.     and can only be setup by a wizard or apprentice. Note that the
  1028.     combat code in the standard scenario uses the "use" and "wear"
  1029.     verbs for shields and armour respectively. That code uses
  1030.     internal use/wear actions that reference internal properties
  1031.     indicating the item's effectiveness. The builder code cannot
  1032.     affect those properties, so shields and armour cannot be built
  1033.     using the builder code. If <action-symbol> is "nil" then any
  1034.     such action on the object is removed.
  1035.  
  1036.  
  1037. Miscellaneous Operations Using the Mouse
  1038.  
  1039. The build buttons in the standard AmigaMUD scenario often require more
  1040. complex interaction from the user. Some, such as making a room light
  1041. or dark, can happen without further interaction. Most buttons will
  1042. indicate their activity through messages in the text window. Some
  1043. buttons will simply bring up a different set of buttons. Others will
  1044. bring up a simple requester, into which you must type the required
  1045. value. Clicking on the 'CANCEL' gadget in the requester will abort the
  1046. current build operation. Some buttons (such as changing the
  1047. description of the current room) will put you into the visual editor
  1048. to edit something. This can either be the client program's internal
  1049. editor, or an external editor, depending on how you have configured
  1050. the client program.
  1051.  
  1052. Users of the AmigaMUD client program can do most building activities
  1053. using mouse-clicks instead of hard-to-remember commands. When a
  1054. character is enabled as a builder, the standard set of buttons
  1055. appearing on the screen will look somewhat like this:
  1056.  
  1057.          +-+      +--+ +-+ +--+
  1058.          |@|      |NW| |N| |NE|
  1059.          +-+  +-+ +--+ +-+ +--+ +-+
  1060.               |I|        |U|
  1061.               +-+ +-+  +-+  +-+ +-+
  1062.               |W|  |L|  |E|
  1063.               +-+ +-+  +-+  +-+ +-+
  1064.               |O|        |D|
  1065.               +-+ +--+ +-+ +--+ +-+
  1066.               |SW| |S| |SE|
  1067.               +--+ +-+ +--+
  1068.  
  1069. The only difference from the buttons available to a non-builder is the
  1070. '@' button in the top-left corner. Clicking on the '@' button will
  1071. bring up the top-level build buttons:
  1072.  
  1073.         +----+    +----+    +------+
  1074.         |EXIT|    |Room|    |Object|
  1075.         +----+    +----+    +------+
  1076.  
  1077.         +----+       +-----------+
  1078.         |Poof|       |Symbol Here|
  1079.         +----+       +-----------+
  1080.  
  1081.         +------+
  1082.         |Tables|
  1083.         +------+
  1084.  
  1085. Clicking on 'EXIT' removes the build buttons and restores the standard
  1086. movement/look button set. Clicking on 'Room' brings up the top of the
  1087. room-building buttons, which are discussed later. Clicking on 'Object'
  1088. brings up the top of the object-building buttons, also discussed
  1089. later. Clicking 'Poof' will bring up a requester for the symbol of a
  1090. room to "Poof" to (to teleport to). You can only Poof from rooms you
  1091. own (have built) to other rooms you own. Note that the symbol for the
  1092. room must be in a table that is currently in use. Tables can be made
  1093. in use through the 'Tables' items, or via the '@use' command. Clicking
  1094. on 'Symbol Here' will request a symbol to enter into the currently
  1095. selected table as a symbol for the current room. Clicking on the
  1096. 'Tables' button will bring up the symbol table manipulation buttons,
  1097. as follows:
  1098.  
  1099.         +----+     +---+     +------+
  1100.         |EXIT|     |New|     |Select|
  1101.         +----+     +---+     +------+
  1102.         
  1103.         +---+          +-----+
  1104.         |Use|          |UnUse|
  1105.         +---+          +-----+
  1106.         
  1107.         +-------+      +--------+
  1108.         |Symbols|      |Describe|
  1109.         +-------+      +--------+
  1110.  
  1111.     EXIT - return to the top-level build buttons.
  1112.  
  1113.     New - create a new symbol table in the current table. A requester
  1114.     will appear for the name of the new table.
  1115.  
  1116.     Select - a requester requests the symbol for a table to be made
  1117.     the selected table. The selected table is the one used for all
  1118.     symbol operations using buttons. By default, the selected
  1119.     table is your private table. The name of the table can also be
  1120.     'public' or 'private', selecting the system global symbol
  1121.     table or your private table.
  1122.  
  1123.     Use - requests the name of a table to add to your current set of
  1124.     in-use tables. Note that the set of in-use tables is NOT
  1125.     preserved across sessions.
  1126.  
  1127.     UnUse - requests the name of a table to remove from your current
  1128.     set of in-use tables.
  1129.  
  1130.     Symbols - shows (in the text window) the symbols in the currently
  1131.     selected table. Note that some tables (e.g. the system
  1132.     'Builtin' table) have a large number of symbols in them, and
  1133.     the output will not fit in the default-sized output history of
  1134.     the AmigaMUD client program.
  1135.  
  1136.     Describe - requests a symbol to describe. The symbol must be
  1137.     defined in the currently selected table. See the discussion
  1138.     above on the '@describe' command, and the Wizard documentation
  1139.     for more details on the output from this button.
  1140.  
  1141.  
  1142. Building Rooms Using the Mouse
  1143.  
  1144. Clicking on 'Rooms' in the top-level set of build buttons will bring
  1145. up the top level of the room-building buttons, as follows:
  1146.  
  1147.         +----+          +----+
  1148.         |EXIT|          |MORE|
  1149.         +----+          +----+
  1150.         +---+  +----+    +------+
  1151.         |New|  |Link|    |Unlink|
  1152.         +---+  +----+    +------+
  1153.         +----++----++----++----+
  1154.         |Same||Hide||Shop||Sell|
  1155.         +----++----++----++----+
  1156.         +----++----++----++----+
  1157.         |Bank||Name||Desc||Auto|
  1158.         +----++----++----++----+
  1159.  
  1160.     EXIT - goes back to the top-level build buttons.
  1161.  
  1162.     New - used to build a new room. The sequence of operations is as
  1163.     follows:
  1164.  
  1165.     - the standard direction buttons (minus the 'L' and the '@')
  1166.         with added 'EXIT' and 'HELP' buttons is displayed. You
  1167.         must select a direction from the current room that the new
  1168.         room is to be constructed in.
  1169.  
  1170.     - a set of buttons containing 'Indoors', 'Outdoors', 'Forest',
  1171.         'Field', 'Path', 'Road' 'Sidewalk', 'Park' and 'Tunnel' is
  1172.         displayed. You must select the type of room for the new
  1173.         room. This type controls the default autographics that
  1174.         will be used for the room, along with setting the default
  1175.         scenery (sky, ceiling, etc.) for the room.
  1176.  
  1177.     - a requester appears for the name of the room. This room name
  1178.         must be something that makes sense in a sentence by itself
  1179.         starting with "You are". The requester shows the example
  1180.         of "in the pawnshop".
  1181.  
  1182.     At this point (unless you cancelled or exited somewhere in the
  1183.     sequence, or something else prevented construction of the
  1184.     room) the new room will be built. If the current room is one
  1185.     which shows autographics, then the new exit direction will be
  1186.     shown right away. You will typically then go into the new room
  1187.     in order to build on to it or to decorate it, etc. This button
  1188.     automatically builds a reverse link from the new room to the
  1189.     current room.
  1190.  
  1191.     Link - this button creates a connection from the current room to a
  1192.     selected other room. It first puts up the direction buttons,
  1193.     and you must select the direction for the link to go from the
  1194.     current room. After that, you must enter the symbol for the
  1195.     room to link to. The link built is a one-way only link.
  1196.  
  1197.     UnLink - this button puts up the direction buttons, asking for the
  1198.     direction of the link to remove. If a reverse link exists, it
  1199.     is not removed.
  1200.  
  1201.     Same - this button is used to create a link from the current room
  1202.     that goes to the same room as an already existing link, but
  1203.     via a different direction. Typically, it is used to make 'OUT'
  1204.     go to the outside room. First, the set of direction buttons is
  1205.     put up to select the direction of the existing link to copy,
  1206.     then they are put up again to select the new direction that is
  1207.     to receive a copy of the link.
  1208.  
  1209.     Hide - this button is used to make a link be hidden, or to unhide
  1210.     an already hidden link. A hidden link does not show up on the
  1211.     exits list, and does not appear on autographics. The standard
  1212.     set of direction buttons selects the link to hide.
  1213.  
  1214.     Shop - this button will toggle the current room between being a
  1215.     store and not being a store. A store can only be made not a
  1216.     store if there is nothing for sale at it.
  1217.  
  1218.     Sell - this button is used to put specific items up for sale at
  1219.     the current location, which must be a store. There is no
  1220.     button to make something be no longer for sale. You must use
  1221.     the "@r subforsale" command to do that.
  1222.  
  1223.     Bank - this button will toggle the current room between being a
  1224.     bank and not being a bank. A bank can not be unmade if some
  1225.     character has opened an account at it. All banks are separate
  1226.     - they do not share accounts.
  1227.  
  1228.     Name - this button allows you to change the name of the current
  1229.     room. The name entered into the requester must be of the same
  1230.     form as discussed under the 'New' button.
  1231.  
  1232.     Desc - this button allows you to change the description of the
  1233.     current room. Either the built-in editor or an external editor
  1234.     will be called up to edit the description, depending on your
  1235.     AmigaMUD client options.
  1236.  
  1237.     Auto - clicking on this button will bring up buttons dealing with
  1238.     the autographics for the current room, as follows:
  1239.  
  1240.         +----+          +----+
  1241.         |EXIT|          |Kind|
  1242.         +----+          +----+
  1243.         +--------+    +--------+
  1244.         |Bgnd Pen|    |Fgnd pen|
  1245.         +--------+    +--------+
  1246.         +--------+    +--------+
  1247.         |Edge Pen|    |Door Pen|
  1248.         +--------+    +--------+
  1249.         +-----+      +-----+
  1250.         |Name1|      |Name2|
  1251.         +-----+      +-----+
  1252.  
  1253.     EXIT - returns to the first page of room-building buttons.
  1254.  
  1255.     Kind - brings up a set of buttons which allows you to choose
  1256.         the style of autographics for the current room. The
  1257.         available styles are:
  1258.  
  1259.         'Road' - wide rectangles drawn with BROWN foreground
  1260.             on DARK GREEN background.
  1261.  
  1262.         'Path' - narrow rectangles draw with TAN foreground on
  1263.             FOREST GREEN background.
  1264.  
  1265.         'HallRoom' - a central BLACK rectangle, with smaller
  1266.             rectangles going off in the obvious exits, drawn
  1267.             on a MEDIUM GREY background.
  1268.  
  1269.         'DoorRoom' - a central BLACK rectangle on a MEDIUM
  1270.             GREY background, outlined with a TAN border. Doors
  1271.             to obvious exits are drawn in BROWN.
  1272.  
  1273.         'Hallway' - this style will not handle the diagonal
  1274.             direction. This is in a style similar to that of
  1275.             'HallRoom' - black rectangles, outlined in TAN, on
  1276.             a MEDIUM GREY background.
  1277.  
  1278.         'OpenArea' - this style is intended to represent open
  1279.             fields, etc. It consists of a small border of DARK
  1280.             BROWN around a large rectangle of DARK GREEN. In
  1281.             the directions of obvious exits, the border is
  1282.             replaced by more of the foreground DARK GREEN.
  1283.  
  1284.         'Tunnel' - this style consists of medium-width LIGHT
  1285.             GREY passages drawn on a DARK GREY background.
  1286.  
  1287.         'Chamber' - this style draw underground tunnels around
  1288.             a large central chamber. The tunnels and chamber
  1289.             are drawn in the foreground LIGHT GREY, and the
  1290.             "solid rock" is drawn in the background DARK GREY.
  1291.  
  1292.     Bgnd Pen
  1293.     Fgnd Pen
  1294.     Edge Pen
  1295.     Door Pen - these buttons bring up a requester which lets you
  1296.         change the pen (colour) to be used for the corresponding
  1297.         drawing of autographics. Note that most autographics only
  1298.         use the background and foreground pens. The defined colour
  1299.         names are: BLACK, DARK GREY, MEDIUM GREY, LIGHT GREY,
  1300.         WHITE, BRICK RED, RED, RED-ORANGE, ORANGE, GOLD, CADMIUM
  1301.         YELLOW, LEMON YELLOW, LIME GREEN, GREEN, LIGHT GREEN, DARK
  1302.         GREEN, FOREST GREEN, GREEN-BLUE, AQUA, LIGHT AQUA, SKY
  1303.         BLUE, LIGHT BLUE, BLUE, DARK BLUE, VIOLET, PURPLE,
  1304.         MAGENTA, PINK, TAN, BROWN, MEDIUM BROWN and DARK BROWN.
  1305.  
  1306.     Name1
  1307.     Name1 - these buttons let you change the name of the room as
  1308.         it appears in the box above the movement buttons.
  1309.         Normally, this is the last word in the room name,
  1310.         capitalized. If you specify Name1 and not Name2, then the
  1311.         Name1 is used, centered in the room name box. If you give
  1312.         both Name1 and Name2, then two lines of room name are
  1313.         displayed, taken from the centered forms of both.
  1314.  
  1315.     MORE - goes to the second set of room-building buttons:
  1316.  
  1317.         +----+          +----+
  1318.         |EXIT|          |MORE|
  1319.         +----+          +----+
  1320.         +----+ +----+ +--------+
  1321.         |Dark| |Lock| |Readonly|
  1322.         +----+ +----+ +--------+
  1323.         +------+    +------+
  1324.         |Wizard|    |Public|
  1325.         +------+    +------+
  1326.         +--+   +--+  +--+   +--+
  1327.         |DD|   |DM|  |OM|   |EM|
  1328.         +--+   +--+  +--+   +--+
  1329.  
  1330.     EXIT - returns to the top level of building buttons.
  1331.  
  1332.     MORE - returns to the first page of room-building buttons.
  1333.  
  1334.     Dark - toggles the current room between being dark and not
  1335.         being dark.
  1336.  
  1337.     Lock - toggles the locking of the current room on and off.
  1338.         Players other than the room's owner and SysAdmin cannot go
  1339.         into a locked room. This is useful for keeping other
  1340.         characters out of an area while it is under construction.
  1341.  
  1342.     Readonly
  1343.     Wizard
  1344.     Public - these buttons set the status of the thing underlying
  1345.         the room. If the thing is 'Readonly', then only the owner
  1346.         of the room (and SysAdmin) can perform any room-building
  1347.         actions here. If it is 'Wizard', then any full wizard can
  1348.         also build here, and if it is 'Public', apprentices and
  1349.         builders can build here. In general, a room needs to be
  1350.         'Readonly' only if any modifications, no matter how
  1351.         carefully done, will destroy the concept of the room.
  1352.         Making a room 'Wizard' allows full-fledged wizards to
  1353.         build onto the room, under the assumption that they didn't
  1354.         get to be wizards without showing their own skill in
  1355.         building, and thus won't mess it up.
  1356.  
  1357.     DD - this button enters the editor to add a direction-specific
  1358.         description to the room. This is a description that
  1359.         characters will see if they look in the specified
  1360.         direction. The direction buttons will appear to allow
  1361.         selection of the direction, followed by the builder being
  1362.         put into an editor to edit the direction description. An
  1363.         example would be "You see a dark passage to the north."
  1364.  
  1365.     DM - this allows entry of a direction-specific message. This
  1366.         message will be displayed to a character when he/she
  1367.         leaves in the chosen direction. An example would be "You
  1368.         enter the dark passage."
  1369.  
  1370.     OM - this allows entry of a direction-specific message that
  1371.         will be displayed to other characters in the room as a
  1372.         character exits in the chosen direction. The name of the
  1373.         exiting character is printed before the message. An
  1374.         example would be "enters the dark passage.".
  1375.  
  1376.     EM - this allows entry of a direction-specific message that
  1377.         will be displayed to other characters in the room as a
  1378.         character enters from the chosen direciton. The name of
  1379.         the entering character is printed before the message. An
  1380.         example would be "comes out of the dark passage.".
  1381.  
  1382.  
  1383. Building Objects Using the Mouse
  1384.  
  1385. Clicking on 'Objects' in the top-level set of build buttons will bring
  1386. up the top level of the object-building buttons, as follows:
  1387.  
  1388.         +----+    +---+  +------+
  1389.         |EXIT|    |New|  |Select|
  1390.         +----+    +---+  +------+
  1391.         +----++----++---++----+
  1392.         |Desc||Name||Act||Cont|
  1393.         +----++----++---++----+
  1394.         +---++----++-----++---+
  1395.         |Get||Lite||Invis||Pos|
  1396.         +---++----++-----++---+
  1397.         +-------+   +---------+
  1398.         |ActWord|   |ActString|
  1399.         +-------+   +---------+
  1400.  
  1401.     EXIT - returns to the top-level build buttons.
  1402.  
  1403.     New - used to create a new object. First, a string requester will
  1404.     appear, requesting the symbol for the new object. That symbol
  1405.     will be entered into the currently selected table. Next, a
  1406.     requester will ask for the name of the object, suggesting an
  1407.     example of the form "vase;blue.glass'. See the beginning of
  1408.     the "Building Objects Using Commands" section above for a
  1409.     description of how to format object names.
  1410.  
  1411.     Select - this button requests the symbol of an object to make into
  1412.     the currently selected object. All of the remaining object
  1413.     building buttons operation on the selected object. The table
  1414.     containing the symbol for theobject must be 'in-use'. The
  1415.     default table, your private symbol table, is always 'in-use'.
  1416.  
  1417.     Desc - this lets you edit the description of the object. This is
  1418.     the string which is printed when a character looks at the
  1419.     object. An explicit build command ("@o setdescaction") allows
  1420.     an action to be used as the description of an object, so that
  1421.     it can change depending on circumstances.
  1422.  
  1423.     Name - this lets you change the name of the object. This is the
  1424.     name as entered in 'New' above.
  1425.  
  1426.     Act - this brings up the first of two pages of buttons which let
  1427.     you set the string which is the object's response to
  1428.     performing the indicated action on it. The two pages both have
  1429.     an 'EXIT' button to return to this set of buttons, and a
  1430.     'MORE' button to switch to the other set of 'Act' buttons. The
  1431.     'Act' buttons are: 'Play', 'Erase', 'Eat', 'Read', 'Open',
  1432.     'Close', 'Turn', 'Lift', 'Use', 'Activate', 'Listen', 'Wear',
  1433.     'Push', 'Pull', 'Lower', 'Touch', and 'Smell'. Explicit build
  1434.     commands add 'Deactivate', 'Light', and 'Extinguish'. Explicit
  1435.     build commands can also make the response be an action, so
  1436.     that it can change, depending on circumstances.
  1437.  
  1438.     Cont - controls whether or not the selected object is a container.
  1439.     A requester will ask for the capacity of the object. This is
  1440.     the number of other objects that it can contain. A capacity of
  1441.     zero will make the object no longer a container.
  1442.  
  1443.     Get - this button toggles whether or not the current object is
  1444.     "gettable". An object which is not gettable cannot be picked
  1445.     up from the room it is in. This is useful for objects which
  1446.     are part of the scenery, and not meant to be carried around.
  1447.  
  1448.     Lite - this button toggles whether or not the current object emits
  1449.     light. An object which emits light will, unless it is inside a
  1450.     container, light up any dark room it is in. All occupants of
  1451.     the room will be able to see. This kind of light object cannot
  1452.     be switched on and off except by its builder.
  1453.  
  1454.     Invis - this button toggles whether or not the current object is
  1455.     invisible. Invisible objects do not show up in a room or in an
  1456.     inventory. They can be used as decorations in rooms since they
  1457.     can have descriptions, etc. which characters can see when they
  1458.     look at them.
  1459.  
  1460.     Pos - this button brings up a set of buttons which are used to
  1461.     control the object's occupancy capabilities. The buttons,
  1462.     asside from the usual 'EXIT' are: 'Sit In', 'Sit On', 'Lie
  1463.     In', 'Lie On', 'Stand In' and 'Stand On'. Each will bring up a
  1464.     requester for the maximum number of occupants the object can
  1465.     have. A value of 0 means that the object cannot be occupied in
  1466.     that manner.
  1467.  
  1468.     ActWord - this button is used to define a special action that can
  1469.     be done with the object. It is entered into the requester as a
  1470.     comma-separated list of synonyms for the action.
  1471.  
  1472.     ActString - this button brings up the editor (or line-by-line
  1473.     entry) for the message to be given to the character when the
  1474.     object's special action is performed. More complex operation
  1475.     can be setup using the '@o setactaction' build command.
  1476.  
  1477.  
  1478. Defining and Attaching Special Actions
  1479.  
  1480. The building commands and buttons discussed above allow a reasonable
  1481. amount of creativity in what can be built. All of the constructions
  1482. are quite static, however, in that they do not change over time or as
  1483. characters interact with them. A full wizard or an apprentice can use
  1484. the AmigaMUD programming language (described separately) to produce
  1485. just about any kind of effect they can imagine, but that power is not
  1486. available to normal characters. Also, many builders do not want to
  1487. learn a full programming language, with all of its concerns with
  1488. syntax and declarations, etc. In an attempt to bridge these gaps
  1489. somewhat, the standard AmigaMUD scenario provides the capability of
  1490. writing "actions" which have limited capabilities for variation, but
  1491. are much simpler than the full programming language. Do not confuse
  1492. these actions with full procedures in the programming language, which
  1493. are values of AmigaMUD type 'action'. As they are implemented, these
  1494. builder actions are in fact translated by the scenario into full
  1495. AmigaMUD procedures, but the builder does not have to be concerned
  1496. about that when setting up actions.
  1497.  
  1498. When the already discussed commands and buttons are used to build
  1499. rooms and objects, the only reactions to character operations that are
  1500. possible are fixed messages to the character. Using builder actions,
  1501. it is possible to remember pieces of information over time, give
  1502. messages to other characters in the room, modify characters, objects
  1503. and rooms, and do all of these things depending on conditions tested
  1504. on the character, object or room involved.
  1505.  
  1506. The scenario knows about six kinds of actions:
  1507.  
  1508.     room checkers - these actions are chiefly used to determine
  1509.     whether or not a character can leave the room in a given
  1510.     direction, but can also do all of the things mentioned above.
  1511.  
  1512.     object checkers - these actions are set up to be performed when a
  1513.     character does a given operation on an object. They determine
  1514.     the success or failure of the operation.
  1515.  
  1516.     room descriptions - these actions return a string value which is
  1517.     printed when the character looks around the room. The string,
  1518.     or parts of it, can include names, etc. stored with the room
  1519.     or character.
  1520.  
  1521.     object descriptions - these are similar to room descriptions, but
  1522.     can also make reference to the object being examined.
  1523.  
  1524.     room actions - these are actions performed when a character enters
  1525.     one of the special commands that has been associated with the
  1526.     room he/she is in. They neither succeed nor fail, but can do
  1527.     all of the things mentioned in the paragraph above.
  1528.  
  1529.     object actions - these are actions performed when a character does
  1530.     the special action associated with an object.
  1531.  
  1532. The basic structure of an action is that of a simple condition with
  1533. both success and failure parts:
  1534.  
  1535.     unconditional things to do
  1536.     the condition(s) to test
  1537.     the things to do if the condition succeeds
  1538.     the things to do if the condition fails
  1539.  
  1540. In the case of room and object actions, there is no condition in the
  1541. action (unless introduced with an internal 'if', discussed below), and
  1542. all of the actions commands are in the unconditional portion.
  1543.  
  1544. For description actions, the total result of the entire action must be
  1545. a string, which is the description of the room or object. Each branch
  1546. (success and failure) of the condition must be followed by a string
  1547. which is the returned description. The prompt for these will be set to
  1548. "* description result> ".
  1549.  
  1550. Actions are always entered line by line - editors are not used. The
  1551. prompt changes as different parts of the total action are entered.
  1552. Each section is ended by entering a line consisting only of a period.
  1553. Here is a log of a session where a room checker is built, installed,
  1554. and tested. The checker will not let the character pass unless the
  1555. character is carrying something whose name matches the form "apple;
  1556. juicy,red". The line numbers to the left are used in the following
  1557. more detailed discussion of this log.
  1558.  
  1559. 01  input> @r checker private entercheck
  1560. 02  Enter the pre-condition actions:
  1561. 03  * pre-condition actions> .
  1562. 04  Now enter the conditions for the test:
  1563. 05  * condition> characterhasname "apple;juicy,red"
  1564. 06  * condition> .
  1565. 07  Now enter the actions to do if condition is true:
  1566. 08  * true actions> saycharacter
  1567. 09  Enter the text to be shown to the character:
  1568. 10  * character text> You pass into the test room.
  1569. 11  * character text> .
  1570. 12  Continue entering the true actions:
  1571. 13  * true actions> sayothers
  1572. 14  Enter the text to be shown to others:
  1573. 15  * others text> @charactername
  1574. 16  * others text> passes into the test room.
  1575. 17  * others text> .
  1576. 18  Continue entering the true actions:
  1577. 19  * true actions> .
  1578. 20  Now enter the actions to do if condition is false:
  1579. 21  * false actions> saycharacter
  1580. 22  Enter the text to be shown to the character:
  1581. 23  * character text> Something prevents you from entering.
  1582. 24  * character text> .
  1583. 25  Continue entering the false actions:
  1584. 26  * false actions> .
  1585. 27  Action 'entercheck' defined.
  1586. 28  input> @r adddircheck south entercheck
  1587. 29  Dircheck entered.
  1588. 30  input> south
  1589. 31  Something prevents you from entering.
  1590. 32  input> @o new private apple "apple;juicy,red"
  1591. 33  Object created - you are carrying it.
  1592. 34  input> south
  1593. 35  You pass into the test room.
  1594. 36  You are in a test room.
  1595. 37  You see nothing special here.
  1596. 38  Obvious exits: north
  1597. 39  input>
  1598.  
  1599. In more detail:
  1600.  
  1601. 01  I start creating the action. It is a room checker action, whose
  1602.     symbol will be 'entercheck' in my private symbol table.
  1603. 02  I am supposed to enter the unconditional actions to be done before
  1604.     the condition is tested.
  1605. 03  There aren't any actions I want to do unconditionally, so I enter
  1606.     just a period to end this phase. Note that the prompt had changed
  1607.     for this.
  1608. 04  Now I should enter the conditions for the test.
  1609. 05  I enter the first (and only) condition for this test. The word
  1610.     "characterhasname" indicates a test that the character is carrying
  1611.     an object whose name matches the internal form given. Another
  1612.     prompt change occurred.
  1613. 06  There are no more conditions, so I enter just a period.
  1614. 07  Now I should enter the actions that I want done if the condition
  1615.     is true, i.e. if the character is to be allowed to use the exit.
  1616.     Note that these actions will be performed while the character is
  1617.     in the current room, before he/she moves into the other one.
  1618. 08  I want to output some text to the character. "saycharacter" is the
  1619.     build action command to do that.
  1620. 09  I now must enter the text that I want shown to the character.
  1621. 10  The prompt changes as usual, and I enter the simple message.
  1622. 11  There can be several lines of text, so I must enter a single
  1623.     period to end the total text.
  1624. 12  I am now back entering the actions to be done on success.
  1625. 13  I want to output a message to others in the same room.
  1626. 14
  1627. 15  I want the first thing output to others to be the name of the
  1628.     character who is taking the checked exit.
  1629. 16  The character name is followed by some fixed text. I do not enter
  1630.     a leading space - the build action code will do that for me.
  1631. 17  I am now done with the text to be shown to others...
  1632. 18  ... and am back entering actions to do upon success
  1633. 19  There are no more success actions.
  1634. 20  Now I must enter the actions to do if the condition for the exit
  1635.     fails, i.e. if the character is prevented from taking the exit.
  1636. 21  I want to show a failure message to the character.
  1637. 22
  1638. 23  It is just a simple string.
  1639. 24
  1640. 25
  1641. 26  There are no more false actions. (I don't want to tell others that
  1642.     the character failed to take the exit.)
  1643. 27  The checker action is completed successfully. It is now entered
  1644.     into my private symbol table.
  1645. 28  I attach the new checker action as a direction checker going south
  1646. 29  from the current room.
  1647. 30  I now try to go south, triggering the checker.
  1648. 31  I don't have an apple, so am prevented from going south.
  1649. 32  I am a builder - I have the power. So, I make an apple.
  1650. 33
  1651. 34
  1652. 35  Now I can pass through. Others in the room I was in would have
  1653.     seen the message saying I was passing into the test room.
  1654. 36  The regular stuff, done whenever a character enters a room, is now
  1655.     done.
  1656.  
  1657. The simplest thing that a builder action can do is to output a
  1658. message, either to the character who triggered the action, or to other
  1659. characters in the same room. Messages can consist of fixed text and
  1660. information from the character or room, or, in the case of object
  1661. actions, from the object being manipulated. When a message is being
  1662. entered, the prompt switches to either "character text> " or "others
  1663. text> ", as appropriate. If a line of input for message output begins
  1664. with an '@', then it is a special item to be inserted into the
  1665. message. Values of special items are determined when the action is
  1666. running, not when it is being defined. A quick summary of these string
  1667. escapes can be found online in the "Book of Strings" in the Builder's
  1668. Guild library. The following special items are available (the 'object'
  1669. variants are only available when defining object actions):
  1670.  
  1671.     @characterstring <string-symbol>
  1672.     @roomstring <string-symbol>
  1673.     @objectstring <string-symbol> - these escapes insert the value of
  1674.     a string property (as defined using "@string") retrieved from
  1675.     the character, room or object, as appropriate. Values for
  1676.     these string can be set by build actions using the
  1677.     "XXXsetstring" action commands.
  1678.  
  1679.     @charactercounter <counter-symbol>
  1680.     @roomcounter <counter-symbol>
  1681.     @objectcounter <counter-symbol> - these escapes are similar to the
  1682.     above ones, except that the string inserted is the string form
  1683.     of the counter (number) property indicated. These values can
  1684.     be set using the "XXXsetcounter", "XXXinccounter" and
  1685.     "XXXdeccounter" action commands.
  1686.  
  1687.     @charactername
  1688.     @roomname
  1689.     @objectname - these escapes insert the name of the character, room
  1690.     or object. Object names are converted from the internal form
  1691.     to the external form, as are character names (so they work out
  1692.     properly for non-player-characters with multi-word names).
  1693.  
  1694. The tests which control whether or not a checker action allows the
  1695. operation are called 'conditionals'. A checker action succeeds only if
  1696. all of its conditionals succeed. Each conditional is a simple name and
  1697. parameters on a single input line. The sense of a conditional can be
  1698. reversed by putting the word "not" before it (with a separating
  1699. space). For example, in the above log, if the conditional had been
  1700. entered as 'not characterhasname "apple;juicy,red"', then the player
  1701. would be allowed to take the exit only if he/she is not carrying any
  1702. object whose name matches "apple;juicy,red".
  1703.  
  1704. As with string escapes, conditionals referencing objects can only be
  1705. used with actions which are intended to be attached to objects. The
  1706. available conditionals are:
  1707.  
  1708.     fail - this conditional always fails.
  1709.  
  1710.     characterflag <flag-symbol>
  1711.     roomflag <flag-symbol>
  1712.     objectflag <flag-symbol> - these conditionals test for the
  1713.     presense of the named flag on the character, room or object,
  1714.     as appropriate. The flags can be set using the corresponding
  1715.     "setflag" action commands. If the flag is present, then the
  1716.     conditional succeeds, else it fails.
  1717.  
  1718.     charactercounter <counter-symbol> <value>
  1719.     roomcounter <counter-symbol> <value>
  1720.     objectcounter <counter-symbol> <value> - these conditionals test
  1721.     whether or not the counter is equal to the given value, which
  1722.     must be a valid number (positive or negative). E.g. the
  1723.     conditional   "roomcounter passcount 10"   succeeds only when
  1724.     the "passcount" counter attached to the room is equal to 10.
  1725.  
  1726.     characterhasspecific <object-symbol>
  1727.     roomhasspecific <object-symbol>
  1728.     objecthasspecific <object-symbol> - these conditionals are used to
  1729.     test for the presense (or absense with "not") of a specific
  1730.     object. Note that this is THE specific object named - a clone
  1731.     of it (as purchased at a store) is not sufficient. This is
  1732.     useful when a unique object is being used as a key, etc. When
  1733.     testing a character, the object must be being carried directly
  1734.     (not in a container being carried) by the character. When
  1735.     testing a room, the object must be directly in the room. When
  1736.     testing an object, the named object must be inside the object
  1737.     that the action is attached to.
  1738.  
  1739.     characterhaschild <object-symbol>
  1740.     roomhaschild <object-symbol>
  1741.     objecthaschild <object-symbol> - these conditionals are very
  1742.     similar to the previous set, except that here, any child of
  1743.     the named object (e.g. as purchased in a store) is sufficient,
  1744.     and the original object is not.
  1745.  
  1746.     characterhasname <object-symbol>
  1747.     roomhasname <object-symbol>
  1748.     objecthasname <object-symbol> - these conditionals are again
  1749.     similar, except that any object whose name matches the given
  1750.     <object-symbol> is sufficient, regardless of which true object
  1751.     has the name. As usual, the name must be given in the internal
  1752.     form, as "noun;adjective,adjective,...".
  1753.  
  1754.     characterhasflag <flag-symbol>
  1755.     roomhasflag <flag-symbol>
  1756.     objecthasflag <flag-symbol> - these conditionals are quite
  1757.     different from the above "XXXflag" conditionals. In those, the
  1758.     character, room or object itself had to have the flag set. In
  1759.     these, the flag must be set on at least one object which is
  1760.     being carried by the character, is present in the room, or is
  1761.     contained in the object, as appropriate.
  1762.  
  1763.     random <range> - this conditional is used to add randomness to the
  1764.     way actions work. A random number between 0 and <range> - 1 is
  1765.     generated. If that value is 0, then the conditional succeeds,
  1766.     else it fails. Thus  "random 100"  has a one percent chance of
  1767.     succeeding and    "random 2"  has a fifty percent chance.
  1768.  
  1769. The actual condition for an action can consist of any number of these
  1770. conditionals, given one after another. The total condition succeeds
  1771. only if ALL of the individual conditionals succeed. E.g.
  1772.  
  1773.     * condition> not characterhasflag p_pKilledBalrog
  1774.     * condition> roomhasspecific o_BalrogCorpse
  1775.     * condition> .
  1776.  
  1777. would succeed only if the character does not have flag
  1778. "p_pKilledBalrog" and the object "o_BalrogCorpse" is in the room.
  1779.  
  1780. If no conditionals are entered (an ending "dot-line" is given on the
  1781. first prompt for a conditional), then the condition will be omitted in
  1782. the resulting action, and the action will always succeed. An action
  1783. that always fails can be set up using just the "fail" conditional.
  1784.  
  1785. Actions can have any number of action commands, some conditional,
  1786. others not. The actions are done in the same order that they are
  1787. entered. Sometimes the order doesn't matter (such as giving messages
  1788. to the character and others) but sometimes it does. As usual, object
  1789. action commands are only available when defining actions to be
  1790. attached to objects. The action commands available are:
  1791.  
  1792.     charactersetflag <flag-symbol>
  1793.     roomsetflag <flag-symbol>
  1794.     objectsetflag <flag-symbol>
  1795.     characterclearflag <flag-symbol>
  1796.     roomclearflag <flag-symbol>
  1797.     objectclearflag <flag-symbol> - these action commands simply set
  1798.     or clear the named flag directly on the character, room or
  1799.     object, as appropriate. Using a flag on a character, for
  1800.     example, allows the builder's actions to record that the
  1801.     character has performed a given task, or that some other
  1802.     important condition has occurred.
  1803.  
  1804.     characterinccounter <counter-symbol>[<value>]
  1805.     roominccounter <counter-symbol> [<value>]
  1806.     objectinccounter <counter-symbol> [<value>]
  1807.     characterdeccounter <counter-symbol> [<value>]
  1808.     roomdeccounter <counter-symbol> [<value>]
  1809.     objectdeccounter <counter-symbol> [<value>] - these actions
  1810.     commands are useful for modifying counters. If no <value> is
  1811.     given, then the named counter is incremented (decremented) by
  1812.     one. If a <value> is given (it must be a positive number),
  1813.     then the named counter is incremented or decremented by that
  1814.     value.
  1815.  
  1816.     charactersetcounter <counter-symbol> <value>
  1817.     roomsetcounter <counter-symbol> <value>
  1818.     objectsetcounter <counter-symbol> <value> - these action commands
  1819.     give an explicit value to a counter property. The <value> can
  1820.     be either positive or negative.
  1821.  
  1822.     charactersetstring <string-name> <string-identifier>
  1823.     roomsetstring <string-name> <string-identifier>
  1824.     objectsetstring <string-name> <string-identifier> - these action
  1825.     commands store a string value in a string property. The values
  1826.     for <string-identifier> can be:
  1827.     
  1828.         date/time - the time and date are stored
  1829.         charactername - the name of the character is stored. It
  1830.         is stored in external format, not internal.
  1831.         roomname - the name of the room (e.g. "in the PlayPen") is
  1832.         stored.
  1833.         objectname - the external form of the object name is
  1834.         stored. This form can only be used with object
  1835.         actions.
  1836.  
  1837.     characterclearstring <string-name>
  1838.     roomclearstring <string-name>
  1839.     objectclearstring <string-name> - these action commands remove a
  1840.     string property from the character, room or object, as
  1841.     appropriate. This is equivalent to setting its value to be an
  1842.     empty string.
  1843.  
  1844.     clonehere <object-symbol>
  1845.     cloneat <room-symbol> <object-symbol> - these action commands have
  1846.     a more noticeable effect on the world. They create a copy of
  1847.     the named object, and deposit it either in the current room, or
  1848.     in the named room. The new object will have whatever properties
  1849.     the specified one does, and is in most ways exactly the same
  1850.     as an object purchased at a store. The newly created object is
  1851.     made the current object, and from this point on, object
  1852.     actions commands can be used, and object references will
  1853.     refer to the new object.
  1854.  
  1855.     destruct - this action command can only be used with object
  1856.     actions. It results in the object itself being destroyed. This
  1857.     would normally be arranged to destroy a cloned object, and not
  1858.     an original object.
  1859.  
  1860.     drop - this action command can also only be used with object
  1861.     actions. It arranges for the object to be dropped, and thus
  1862.     assumes that the object is being carried.
  1863.  
  1864.     dropto <room-symbol> - this action command is the same as 'drop',
  1865.     except that the current object is dropped in the named room.
  1866.     This is useful for "resetting" things back to their proper
  1867.     places.
  1868.  
  1869.     setit <object-kind> {<object-symbol>|<flag-symbol>|<string>} -
  1870.     these action commands are used to change the object that the
  1871.     commands in an action can refer to. This can be used in a room
  1872.     action to turn it into an object action, and from then on,
  1873.     object references can be used and will refer to the designated
  1874.     object. <object-kind> is one of the following:
  1875.  
  1876.         specific - the second argument must be the symbol of an
  1877.         object, which will become the new current object.
  1878.  
  1879.         characterchild
  1880.         roomchild
  1881.         objectchild - the second argument must be the symbol of an
  1882.         object which is carried by the character, present in
  1883.         the room, or contained in the previous current object.
  1884.         The action ASSUMES that there is such an object, so
  1885.         you are wise to check for it first, with a conditional
  1886.         in this action. That object becomes the new current
  1887.         object.
  1888.  
  1889.         characterflag
  1890.         roomflag
  1891.         objectflag - this is similar to the previous set of
  1892.         <object-kind>'s, except that instead of looking for a
  1893.         specific object, any object with the <flag-symbol> set
  1894.         on it is made the current object.
  1895.  
  1896.         charactername
  1897.         roomname
  1898.         objectname - this set of <object-kind>'s is also similar -
  1899.         the new current object is the first whose name matches
  1900.         the object name string given (which must, as usual, be
  1901.         given in the internal form).
  1902.  
  1903.     saycharacter - this is the simplest and most common action
  1904.     command. It switches input processing to expect string escapes
  1905.     and fixed portions of strings, as described previously. The
  1906.     resulting string will be displayed to the character whose
  1907.     activities triggered this action.
  1908.  
  1909.     sayothers - this action command is very similar to 'saycharacter',
  1910.     except that the resulting message is displayed to all other
  1911.     characters in the same room, instead of to the character.
  1912.  
  1913.     if - this action command allows the builder to add internal
  1914.     conditional actions to an action, whether the action normally
  1915.     countains a condition or not. The input mode will change to
  1916.     expect the conditionals for this internal 'if'. The rules for
  1917.     conditionals, and how to end the conditionals and the success
  1918.     and failure halves of the 'if' are the same as those for
  1919.     normal conditions in checker and description actions.
  1920.  
  1921.  
  1922. Example Log of Building Session
  1923.  
  1924. This section contains a log of an AmigaMUD session in which a player
  1925. used the building commands to create a small area of four rooms,
  1926. several objects, and a trivial puzzle. To create this log, I used the
  1927. '-E' option on MUD, so that no editor was available, and I was
  1928. prompted for the various description strings directly. If you actually
  1929. build on-line, you will use an editor for description strings if you
  1930. are using the full MUD client. In truth, this is not a log of a fully
  1931. interactive session, but rather is a log of sourcing an input file
  1932. containing the session - even I don't know the building commands well
  1933. enough to get it all correct in an interactive session! Comments about
  1934. what is going on are indented beneath the lines they describe.
  1935.  
  1936. ::Sourcing file 'st:buildtest.so'...
  1937. input> look around
  1938. You are on the north sidewalk, east of the main intersection.
  1939. You see nothing special here.
  1940. Obvious exits: west east
  1941.  
  1942.     I'm adding this little area just to the east of the intersection,
  1943.     on the north side of the east-west road.
  1944.  
  1945. input> @table private newTable
  1946. input> @use newTable
  1947. input> @showtable newTable
  1948. Table has no entries.
  1949. input> @describe private newTable
  1950. newTable: table, owner SysAdmin, useCount 1, entries 0
  1951.  
  1952.     a new table to put my symbols in
  1953.  
  1954. input> @room new north indoors in the entrance room
  1955. New room created and linked.
  1956.  
  1957.     create a new room as the start of my little area
  1958.  
  1959. input> @room adddesc
  1960. Edit room description. End with a line containing only a single period.
  1961. * add room desc> A plain wooden door leads north into the building.
  1962. * add room desc> .
  1963. Room redecorated.
  1964. input> @room scenery "door;plain,wooden,wood" building
  1965. New scenery words added.
  1966. input> look around
  1967. You are on the north sidewalk, east of the main intersection.
  1968. A plain wooden door leads north into the building.
  1969. Obvious exits: west east north
  1970. input> Examine the plain wood door.
  1971. You see nothing special about the plain wood door.
  1972.  
  1973.     I've fixed up the outside area. The use of scenery makes things
  1974.     look more polished.
  1975.  
  1976. input> north
  1977. You are in the entrance room.
  1978. You see nothing special here.
  1979. Obvious exits: south
  1980. input> @room newdesc
  1981. Enter room description. End with a line containing only a single period.
  1982. * new room desc> This is the entry foyer to a small office. There are a few
  1983. * new room desc> comfortable looking chairs for waiting in, and a magazine
  1984. * new room desc> rack full of magazines. Interior doors lead further north,
  1985. * new room desc> northeast and east, while the door out is to the south.
  1986. * new room desc> .
  1987. Room decorated.
  1988. input> look around
  1989. You are in the entrance room.
  1990. This is the entry foyer to a small office. There are a few comfortable looking
  1991. chairs for waiting in, and a magazine rack full of magazines. Interior doors
  1992. lead further north, northeast and east, while the door out is to the south.
  1993. Obvious exits: south
  1994. input> @room scenery entry foyer "office;small"
  1995. New scenery words added.
  1996. input> @room same south out
  1997. Link made.
  1998.  
  1999.     some initial setup of the first room
  2000.  
  2001. input> @object new newTable chairs "chair;few,comfortable,looking"
  2002. Object created - you are carrying it.
  2003. input> @object gettable chairs no
  2004. chairs marked as not gettable.
  2005. input> @object invisible chairs yes
  2006. chairs marked as invisible.
  2007. input> @object siton chairs 3
  2008. 3 can now 'siton' 'chairs'
  2009. input> @object newdesc chairs
  2010. Enter new description. End with a line containing only a single period.
  2011. * new object desc> The chairs are large, and well padded. They are uphostered
  2012. * new object desc> in drab looking tan material.
  2013. * new object desc> .
  2014. Object description entered.
  2015. input> drop chairs
  2016. few comfortable looking chair: dropped.
  2017. input> look chairs
  2018. The chairs are large, and well padded. They are uphostered in drab looking tan
  2019. material.
  2020.  
  2021.     The chairs are really just scenery, but I've made them useable.
  2022.  
  2023. input> @object new newTable rack "rack;magazine"
  2024. Object created - you are carrying it.
  2025. input> @object gettable rack no
  2026. rack marked as not gettable.
  2027. input> @object invisible rack yes
  2028. rack marked as invisible.
  2029. input> @object newdesc rack
  2030. Enter new description. End with a line containing only a single period.
  2031. * new object desc> The magazine rack is just a U-shaped wooden bin full of
  2032. * new object desc> magazines.
  2033. * new object desc> .
  2034. Object description entered.
  2035. input> drop rack
  2036. magazine rack: dropped.
  2037.  
  2038.     The magazine rack is also just scenery, but it is there to point
  2039.     the player towards the magazines:
  2040.  
  2041. input> @object new newTable magazines magazine
  2042. Object created - you are carrying it.
  2043. input> @object invisible magazines yes
  2044. magazines marked as invisible.
  2045. input> @object gettable magazines no
  2046. magazines marked as not gettable.
  2047. input> @object getstring magazines
  2048. Enter get string. End with a line containing only a single period.
  2049. * get string> Please leave the magazines here for others to read.
  2050. * get string> .
  2051. Object get string entered.
  2052. input> @object readstring magazines
  2053. Enter read string. End with a line containing only a single period.
  2054. * read string> The magazines are mostly about etiquette. They talk about such
  2055. * read string> things as properly using your knife and fork.
  2056. * read string> .
  2057. Object read string entered.
  2058. input> @object newdesc magazines
  2059. Enter new description. End with a line containing only a single period.
  2060. * new object desc> The magazines are well-thumbed, but still quite readable.
  2061. * new object desc> .
  2062. Object description entered.
  2063. input> drop magazines
  2064. magazine: dropped.
  2065. input> get magazine
  2066. Please leave the magazines here for others to read.
  2067. input> look magazine
  2068. The magazines are well-thumbed, but still quite readable.
  2069. input> read magazine
  2070. The magazines are mostly about etiquette. They talk about such things as
  2071. properly using your knife and fork.
  2072.  
  2073.     The magzines are there to provide the clue about the cutlery.
  2074.  
  2075. input> @room new north indoors "in the north office"
  2076. New room created and linked.
  2077. input> north
  2078. You are in the north office.
  2079. You see nothing special here.
  2080. Obvious exits: south
  2081. input> @room newdesc
  2082. Enter room description. End with a line containing only a single period.
  2083. * new room desc> This appears to be the office of someone in middle
  2084. * new room desc> management. There is a computer on the desk, but it looks
  2085. * new room desc> to be a power-user status symbol more than anything else.
  2086. * new room desc> .
  2087. Room decorated.
  2088. input> @room scenery computer desk chair door
  2089. New scenery words added.
  2090. input> @room scenery "symbol;power-user,power,user,status"
  2091. New scenery words added.
  2092.  
  2093.     Scenery words just add on to whatever is already there.
  2094.  
  2095. input> look at the power-user status symbol
  2096. You see nothing special about the power-user status symbol.
  2097. input> l power user symbol
  2098. You see nothing special about the power user symbol.
  2099.  
  2100.     The parser's full flexibility works on scenery words.
  2101.  
  2102. input> @room same south out
  2103. Link made.
  2104. input> @object new newTable knife "knife;simple,table"
  2105. Object created - you are carrying it.
  2106. input> drop knife
  2107. simple table knife: dropped.
  2108. input> @symbolhere newTable r_north
  2109.  
  2110.     I need to name this room so I can reset the knife back to here.
  2111.  
  2112. input> south
  2113. You are in the entrance room.
  2114. This is the entry foyer to a small office. There are a few comfortable looking
  2115. chairs for waiting in, and a magazine rack full of magazines. Interior doors
  2116. lead further north, northeast and east, while the door out is to the south.
  2117. Obvious exits: south out north
  2118. input> @room new east indoors "in the east office"
  2119. New room created and linked.
  2120. input> east
  2121. You are in the east office.
  2122. You see nothing special here.
  2123. Obvious exits: west
  2124. input> @room newdesc
  2125. Enter room description. End with a line containing only a single period.
  2126. * new room desc> This office looks quite practical. It must be used by a
  2127. * new room desc> secretary or some other useful person.
  2128. * new room desc> .
  2129. Room decorated.
  2130. input> @object new newTable plants "plant.plant-pot.pot;plant"
  2131. Object created - you are carrying it.
  2132. input> @object gettable plants no
  2133. plants marked as not gettable.
  2134. input> @object getstring plants
  2135. Enter get string. End with a line containing only a single period.
  2136. * get string> Please leave the plants here - the owner of this office will
  2137. * get string> probably take better care of them than you would.
  2138. * get string> .
  2139. Object get string entered.
  2140. input> @object smellstring plants
  2141. Enter smell string. End with a line containing only a single period.
  2142. * smell string> The plants smell slightly minty.
  2143. * smell string> .
  2144. Object smell string entered.
  2145. input> @object touchstring plants
  2146. Enter touch string. End with a line containing only a single period.
  2147. * touch string> The plants feel like plants.
  2148. * touch string> .
  2149. Object touch string entered.
  2150. input> @object newdesc plants
  2151. Enter new description. End with a line containing only a single period.
  2152. * new object desc> The plants are pretty plain-looking. They don't seem to
  2153. * new object desc> have any flowers at the moment (if they ever do!).
  2154. * new object desc> .
  2155. Object description entered.
  2156. input> drop plants
  2157. plant: dropped.
  2158. input> @object new newTable fork "fork;simple,table"
  2159. Object created - you are carrying it.
  2160. input> drop fork
  2161. simple table fork: dropped.
  2162. input> @symbolhere newTable r_east
  2163. input> @room same west out
  2164. Link made.
  2165.  
  2166.     This east office is setup similarly to the north office.
  2167.  
  2168. input> west
  2169. You are in the entrance room.
  2170. This is the entry foyer to a small office. There are a few comfortable looking
  2171. chairs for waiting in, and a magazine rack full of magazines. Interior doors
  2172. lead further north, northeast and east, while the door out is to the south.
  2173. Obvious exits: south out north east
  2174. input> @room new northeast indoors "in the boss's office"
  2175. New room created and linked.
  2176. input> northeast
  2177. You are in the boss's office.
  2178. You see nothing special here.
  2179. Obvious exits: southwest
  2180. input> @room newdesc
  2181. Enter room description. End with a line containing only a single period.
  2182. * new room desc> You can tell this is the boss's office by the size of the
  2183. * new room desc> desk and chair, and by the fact that it doesn't look like
  2184. * new room desc> any work goes on here.
  2185. * new room desc> .
  2186. Room decorated.
  2187. input> @room same southwest out
  2188. Link made.
  2189. input> @object new newTable desk "desk;large,massive,big,redish,red,wood"
  2190. Object created - you are carrying it.
  2191. input> @object newdesc desk
  2192. Enter new description. End with a line containing only a single period.
  2193. * new object desc> The desk is quite massive. It is made from some kind of
  2194. * new object desc> very pretty redish wood. There don't seem to be any
  2195. * new object desc> scratches onthe highly-polished top, but there are some
  2196. * new object desc> ugly coffee-cup rings there.
  2197. * new object desc> .
  2198. Object description entered.
  2199. input> @room scenery "stains;ugly,coffee-cup,coffee,cup"
  2200. New scenery words added.
  2201. input> @object gettable desk no
  2202. desk marked as not gettable.
  2203. input> @object invisible desk yes
  2204. desk marked as invisible.
  2205. input> drop desk
  2206. large massive big redish red wood desk: dropped.
  2207.  
  2208.     Because the desk is invisible, I can have an ugly name string like
  2209.     that; no-one can ever see the string - it is only used to match
  2210.     against to find the object.
  2211.  
  2212. input> @object new newTable chair "chair;large,big,black,leather"
  2213. Object created - you are carrying it.
  2214. input> @object newdesc chair
  2215. Enter new description. End with a line containing only a single period.
  2216. * new object desc> The chair looks extremely comfortable. It is on casters,
  2217. * new object desc> pivots, and rocks back and forth. It is finished in what
  2218. * new object desc> looks like very fine black leather.
  2219. * new object desc> .
  2220. Object description entered.
  2221. input> @object gettable chair no
  2222. chair marked as not gettable.
  2223. input> @object invisible chair yes
  2224. chair marked as invisible.
  2225. input> drop chair
  2226. large big black leather chair: dropped.
  2227. input> southwest
  2228. You are in the entrance room.
  2229. This is the entry foyer to a small office. There are a few comfortable looking
  2230. chairs for waiting in, and a magazine rack full of magazines. Interior doors
  2231. lead further north, northeast and east, while the door out is to the south.
  2232. Obvious exits: south out north east northeast
  2233.  
  2234.     Now comes the "puzzle" part: the character must be carrying the
  2235.     knife but not the fork in order to enter the boss's office.
  2236.  
  2237. input> @room checker newTable bossEnter
  2238. Enter the pre-condition actions:
  2239. * pre-condition actions> .
  2240. Now enter the conditions for the test:
  2241. * condition> characterhasspecific knife
  2242. * condition> not characterhasspecific fork
  2243. * condition> .
  2244. Now enter the actions to do if condition is true:
  2245. * true actions> saycharacter
  2246. Enter the text to be shown to the character:
  2247. * character text> Congratulations on properly using your cutlery!
  2248. * character text> .
  2249. Continue entering the true actions:
  2250. * true actions> .
  2251. Now enter the actions to do if condition is false:
  2252. * false actions> saycharacter
  2253. Enter the text to be shown to the character:
  2254. * character text> Something prevents you from entering the room. Perhaps
  2255. * character text> bad etiquette?
  2256. * character text> .
  2257. Continue entering the false actions:
  2258. * false actions> .
  2259. Action 'bossEnter' defined.
  2260. input> @room adddircheck northeast bossEnter
  2261. Dircheck entered.
  2262.  
  2263.     OK, the puzzle exists. Now I want to make sure that when any
  2264.     character leaves my little area with one of my special objects
  2265.     that are gettable, the object is put back where it started from.
  2266.  
  2267. input> @room checker newTable resetAll
  2268. Enter the pre-condition actions:
  2269. * pre-condition actions> .
  2270. Now enter the conditions for the test:
  2271. * condition> not fail
  2272. * condition> .
  2273. Now enter the actions to do if condition is true:
  2274. * true actions> if
  2275. Enter the condition for the if:
  2276. * condition> characterhasspecific knife
  2277. * condition> .
  2278. Now enter the actions to do if condition is true:
  2279. * true actions> setit specific knife
  2280. * true actions> dropto r_north
  2281. * true actions> .
  2282. Now enter the actions to do if condition is false:
  2283. * false actions> .
  2284. Continue entering the true actions:
  2285. * true actions> if
  2286. Enter the condition for the if:
  2287. * condition> characterhasspecific fork
  2288. * condition> .
  2289. Now enter the actions to do if condition is true:
  2290. * true actions> setit specific fork
  2291. * true actions> dropto r_east
  2292. * true actions> .
  2293. Now enter the actions to do if condition is false:
  2294. * false actions> .
  2295. Continue entering the true actions:
  2296. * true actions> .
  2297. Now enter the actions to do if condition is false:
  2298. * false actions> .
  2299. Action 'resetAll' defined.
  2300. input> @room adddircheck south resetAll
  2301. Dircheck entered.
  2302. input> @room adddircheck out resetAll
  2303. Dircheck entered.
  2304.  
  2305.     There are two directions that can be used to leave, so I put the
  2306.     checker on both of them. I don't want the checker run if the
  2307.     character leaves this room to one of my other three, so I don't
  2308.     want an 'anyexit' checker.
  2309.  
  2310. input> @showtable newTable
  2311. Symbols in table:
  2312.  magazines       fork          desk           bossEnter    
  2313.  resetAll       chairs         plants           r_east        
  2314.  r_north       chair         knife           rack        
  2315.  
  2316.     All of these symbols were defined during this build session.
  2317.  
  2318. input> @describe newTable resetAll
  2319. resetAll: proc, owner SysAdmin, useCount 3:
  2320. proc resetAll()status:
  2321.     if not false then
  2322.     if FindElement(Me()@p_pCarrying, knife) ~= - 1 then
  2323.         SetIt(knife);
  2324.         ignore DoDrop(r_north, Me(), It());
  2325.     fi;
  2326.     if FindElement(Me()@p_pCarrying, fork) ~= - 1 then
  2327.         SetIt(fork);
  2328.         ignore DoDrop(r_east, Me(), It());
  2329.     fi;
  2330.     succeed
  2331.     else
  2332.     fail
  2333.     fi
  2334. corp
  2335.  
  2336.     This is how AmigaMUD actually sees my 'resetAll' action.
  2337.     Programmers will notice that it is clearly machine-generated.
  2338.  
  2339. ::...done
  2340.