home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 May / Amiga_Games_Extra_CD_5-96.bin / spiele / publicdomain / amclnt / doc / building.txt next >
Text File  |  1996-02-19  |  101KB  |  2,364 lines

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