home *** CD-ROM | disk | FTP | other *** search
/ Sunny 1,000 Collection / SUNNY1000.iso / Files / Dos / infoco3 / TAD2EX.ZIP / TADSVER.UNI < prev   
Text File  |  1994-02-06  |  78KB  |  1,611 lines

  1. TADS 2.1.2.2
  2. Unix Patchlevel 1
  3. 29-Jan-94
  4.  
  5. Unix-specific changes applied to latest TADS source.  Unix versions 2.1.0.0
  6. pl2 through pl4 were never released, so please read the notes for those as
  7. well -- this is the first release version that incorporates those changes.
  8.  
  9. The window-resizing code seems to have been broken.  Resizing the window
  10. sends the run-time into space.  I'm looking into it.  For now, don't change
  11. the window size while playing.
  12.  
  13. adv.t and std.t have been updated to 2.1.2.2 as well.
  14.  
  15.  
  16. TADS 2.1.0.0
  17. Unix Patchlevel 4
  18. 16-Nov-93
  19.  
  20. Changed the runtime and compiler so that the heapsize is always set to the
  21. maximum.  An explicit -mh setting will override this.  Note that you cannot
  22. make the heap bigger than 64K, since TADS has to run under DOS in real
  23. mode, where data structures can only be 64K or smaller.
  24.  
  25.  
  26. TADS 2.1.0.0
  27. Unix Patchlevel 3
  28. 25-Oct-93
  29.  
  30. The adv.t and std.t files have been updated to 2.1.0.0.  The ones in the
  31. earlier archives were actually the 2.0.13 ones.  (Doh!)
  32.  
  33. Now tadsr tries to save the game to file "fatal#####.sav" when it gets a
  34. fatal signal, where ##### is the process ID.  Sometimes this file will be
  35. unuseable; other times it'll work fine -- it depends on where the signal
  36. occurs during execution.
  37.  
  38. Two environment variables now affect the behavior of the runtime:
  39.  
  40.     TADSSAVE: directory for save files
  41.         TADSGAME: directory for game files
  42.  
  43. These pathnames will be prepended to any save or game file that does not
  44. already have a slash in it.  For example, if
  45.  
  46.         TADSGAME=~you/games
  47.  
  48. and you type
  49.  
  50.      tadsr foo
  51.  
  52. the run-time will look for the file ~you/games/foo.gam.  Note that if you
  53. want to prevent this, you have to explictly put a ./ in the filename, or
  54. unset the TADSGAME environment variable.  The same goes for TADSSAVE.
  55.  
  56. Since some windowing systems clear the screen when the end-of-visual
  57. terminal code is sent out, tadsr now waits for a keypress before it
  58. terminates.  There is no way to disable this -- the run-time now ignores
  59. the -p flag entirely.  You can always see usage (and game endings) now,
  60. however, which is a plus!
  61.  
  62. The Emacs-style command line editing now handles ^D (delete character after
  63. cursor) and ^K (delete to end of line).
  64.  
  65. Since most Unix boxes have loads of real memory and even more virtual
  66. memory, I increased the size of the scrollback buffer eightfold.  It's now
  67. 256K.  This should be enough for marathon play sessions.
  68.  
  69. There are some known problems with the compiler -- core dumps on at least
  70. one big game, and core dumps when dealing with precompiled headers and
  71. modify/replace in another case.  I haven't been able to track these down,
  72. but they aren't restricted to one architecture.
  73.  
  74. One thing that's been reported as a bug but isn't: If you have the margin
  75. bell on in your xterm you'll get lots of rings as TADS updates the screen.
  76. The solution: turn off the margin bell!
  77.  
  78.  
  79. TADS 2.1.0.0
  80. Unix Patchlevel 2
  81.  
  82. Output handling has been improved again.  Terminal settings are restored
  83. properly upon suspend (^Z) or resume.  I improved a few other things that I
  84. don't remember now.  :)
  85.  
  86.  
  87. TADS 2.1.0.0
  88. Unix Patchlevel 1
  89.  
  90. The programs should now be quite stable on all supported platforms.
  91. Term handling has been vastly improved, so that the run-time should be
  92. comfortable over a 2400 baud connection.  The compiler now avoids
  93. all the screen handling stuff and just uses stdio for all output.
  94.  
  95. Starting with this release, Unix versions will be given patchlevel
  96. numbers in addition to the standard High Energy version number.
  97. There's one patch number of the general Unix sources, and another for
  98. the specific platform the binaries were compiled for.
  99.  
  100. General Unix notes:
  101.  
  102. The .GAM files are now 100% portable across platforms.  You can compile
  103. a game on a PC clone or Mac and then run the resulting .GAM directly
  104. under Unix (and vice versa).  Kudos to High Energy for that!
  105.  
  106. There is no maketrx program for the Unix versions.  Now that TADS is
  107. running on a much wider range of machines, creating binaries specific
  108. to a particular machine seems rather foolish, so I have not kept
  109. support for doing that in the this port.
  110.  
  111. The TADS run-time uses termcap routines for all output.  You will
  112. therefore need to run it on a terminal with window scrolling capability
  113. (i.e., most modern terminals).  If you find that the programs don't
  114. work properly with your terminal, please let me know -- termcap hacking
  115. is very error-prone, so I may have made a mistake in there somewhere.
  116. Before assuming that the problem is with the TADS run-time, however,
  117. try other programs on your system that use termcap, like vi.  (Emacs
  118. has its own term handling code, so it's not a good test.)
  119.  
  120. There a few things special to the Unix versions:
  121.  
  122.     o (Limited) Emacs-style command line editing:
  123.  
  124.         ^F    ahead one character
  125.         ^B    back one character
  126.         ^A    beginning of line
  127.         ^E    end of line
  128.         ^P    previous command in command list
  129.         ^N    next command in command list
  130.         ^K    kill to end of line
  131.         ^D    delete character after cursor
  132.  
  133.     o ESC enters scrollback mode (instead of F1).  Scrollback control
  134.       keys are listed on the top line.
  135.  
  136.     o Press ^L at any time to redraw the entire screen (if you
  137.       get a burst of line noise, for example)
  138.  
  139.     o Press ^Z (or whatever your SIGTSTP key is) to suspend the 
  140.       run-time.
  141.  
  142.     o tadsr recognizes SIGWINCH so that you can resize your
  143.       terminal window.  Text above the current line won't be
  144.       reformatted when you do this, but all subsequent text
  145.       will be formatted to fill the screen.  
  146.  
  147.       NOTE: Resize doesn't work in an OpenWindows cmdtool.
  148.  
  149. The output handling is still not absoultely optimal, but it's probably
  150. as good as it's going to get since the machine-independent TADS source
  151. imposes certain requirements on the behavior of the windowing functions.
  152.  
  153. Finally, please report bugs directly to the person listed as the
  154. maintainer for the port in the banner, not to High Energy.  That person
  155. is the only one (besides, perhaps, me) who's going to be fixing any
  156. problems specific to the Unix ports.
  157.  
  158. Dave Baggett
  159. dmb@ai.mit.edu
  160.  
  161. *-----------------------------------------------------------------------------*
  162. General TADS notes (From the DOS version)
  163. *-----------------------------------------------------------------------------*
  164.  
  165. This file contains a list of changes that have been made to TADS
  166. since the initial 2.0 release.  Most of the changes are fixes to
  167. bugs, so they don't change the documented behavior, but a few, as
  168. explained below, add new functionality to TADS.  Releases are
  169. listed with the most recent release first; each release incorporates
  170. all new features and bug fixes of each prior release unless
  171. otherwise stated.
  172.  
  173. 2.1.2  11/22/93  enhancements, bug fixes
  174.  
  175.   - You can now detect when the player uses multiple direct objects
  176.     with a verb, and reject such commands.  Whenever the player uses
  177.     multiple direct objects with a command (or uses "all", even if it
  178.     results in a single object being used), the parser calls the
  179.     verb object's rejectMultiDobj(prep) method.  If you don't wish to
  180.     take any special action for multiple direct objects used with a
  181.     particular verb, simply return nil from this method (or don't
  182.     define the method at all for the verb).  If you want to prevent
  183.     multiple direct objects from being used, however, you should display
  184.     an appropriate message, and return true.  The parser will skip the
  185.     command entirely.  Note that the parser doesn't display any additional
  186.     message when rejectMultiDobj(prep) returns true; the method should
  187.     display whatever message is desired.  The "prep" parameter is the
  188.     preposition object used with the command; it will be nil if no
  189.     indirect object is present.  An example:
  190.  
  191.         modify inspectVerb
  192.             rejectMultiDobj(prep) =
  193.             {
  194.                 "You can only look at one thing at a time.";
  195.                 return true;
  196.             }
  197.  
  198.     The verb's rejectMultiDobj(prep) method is called immediately
  199.     before the actor's actorAction method.  Note that the parser will
  200.     continue processing any remaining commands on the line, and will
  201.     then run daemons and fuses as normal, even if rejectMultiDobj(prep)
  202.     returns true; if you want to stop the current turn altogether, use
  203.     abort.
  204.  
  205.   - The player command parser now gives you greater control over object
  206.     validation error reporting.  In previous versions, if an object was
  207.     visible but did not pass the validIo/validDo test, the parser called
  208.     the object's cantReach method to report the error (see the note below
  209.     about an additional change to object.cantReach processing).
  210.  
  211.     Now, however, the parser will call verb.cantReach instead, if the
  212.     command's deepverb object defines (or inherits) a cantReach method.
  213.     If the verb does not have a cantReach method at all, the parser
  214.     will use the old behavior instead.  The new cantReach method should
  215.     be defined as follows:
  216.  
  217.        myVerb: deepverb
  218.            verb = 'whatever'
  219.            cantReach(actor, dolist, iolist, prep) =
  220.            {
  221.                // your code here
  222.            }
  223.        ;
  224.  
  225.     This method doesn't return a value; it simply displays the appropriate
  226.     message explaining why the object can't be used with the command.
  227.     verb.cantReach is used only when the objects are visible (that is,
  228.     object.isVisible(actor) returned true for each object in the list).
  229.  
  230.     Only one of dolist or iolist will be non-nil.  If the direct object
  231.     of the command refers to one or more objects that are visible but
  232.     can't be used (according to validDo), dolist will be a list of all
  233.     such objects, and iolist will be nil.  Otherwise, iolist will be a
  234.     list of such objects used for the indirect object, and dolist will
  235.     be nil.
  236.  
  237.     adv.t has not been changed to use verb.cantReach.  This change has
  238.     been made to provide finer control for game authors implementing
  239.     their own verbs and object validation procedures.
  240.  
  241.   - The player command parser had an odd quirk when ambiguous nouns
  242.     were used with transparent items.  If the player used a command
  243.     containing a noun that referred to multiple objects that were
  244.     visible but were not valid for the verb (for example:  "take trophy"
  245.     in a room containing a closed glass trophy case containing a bowling
  246.     trophy and a tennis trophy), the parser asked the normal disambiguation
  247.     question.  This was not really necessary, because the parser already
  248.     knew that the objects were invalid.  This has been changed; the parser
  249.     now simply uses the cantReach message for *each* object that is
  250.     visible and matches the vocabulary, using the usual multiple-word
  251.     format:
  252.         bowling trophy:  You'll have to open the glass case first.
  253.         tennis trophy:  You'll have to open the glass case first.
  254.  
  255.     This new behavior should have no effect on your game code.  Note
  256.     that it is entirely irrelevant if you use the new verb.cantReach
  257.     feature described above.
  258.  
  259.   - The compiler sports a new case sensitivity option.  By default,
  260.     the compiler is case-sensitive, as it has been in past versions.
  261.     However, the new toggle option allows you to change this.  Specify
  262.     -case- to turn off case sensitivity (the default is -case+).  Note
  263.     that this is a toggle option, so simply using -case will reverse
  264.     the current case sensitivity (which is useful if you use a CONFIG.TC
  265.     file that sets a non-default case option).  When case sensitivity
  266.     is turned off, the compiler will treat upper- and lower-case letters
  267.     in symbols (names of objects, properties, functions, and local
  268.     variables) as equivalent.  Hence, foodItem = fooditem = FoodItem,
  269.     and so on.
  270.  
  271.     If you create a pre-compiled header with -w, any compilation which
  272.     reads that binary header with -l will use the same case sensitivity
  273.     as was in effect when the header was pre-compiled.  The -case option
  274.     is ignored when a pre-compiled header is loaded.  Likewise, the
  275.     debugger uses the same case sensitivity that was in effect when the
  276.     game being debugged was compiled.
  277.  
  278.   - The debugger's command set is no longer case-sensitive (hence,
  279.     BP = Bp = bP = bp).
  280.  
  281.   - adv.t has a new darkVerb class.  This is a type of deepVerb that
  282.     can be used in the dark.  The darkroom class has been changed to
  283.     accept any verb of class darkVerb in its roomAction and roomCheck
  284.     methods.  The travel verbs and system verbs have all been made
  285.     darkVerb objects, so darkroom only needs to check the single
  286.     verb type.
  287.  
  288.     In a related change, turnOnVerb and dropVerb have been changed to
  289.     be darkVerb objects, allowing the player to turn on an object or
  290.     drop it in the dark.  The verDoTurnon method in switchItem has
  291.     been changed so that it checks to see if the player is in a dark
  292.     room; if so, the item can only be turned on if the player is already
  293.     carrying the object.  This allows the player to turn on a light
  294.     source that's already being carried, but doesn't allow the player
  295.     to pick up a light source in a dark room.
  296.  
  297.   - The compiler issues a new warning message (TADS-452) if you
  298.     use the same verb with two deepverb objects.  The parser can only
  299.     choose a single deepverb object for any verb typed by the player,
  300.     so you should never define the same 'verb' vocabulary word in more
  301.     than one deepverb object.  In past versions, the compiler did not
  302.     flag this as a warning.
  303.  
  304.   - Several improvements have been made for numbers in player
  305.     commands.  First, multiple numbers are now allowed in a single
  306.     commands; for example, the player can now say "press 1, 2, 3,
  307.     4 on keypad," and the numbers are set in numObj.value, one by
  308.     one.  Second, the sdesc, adesc, and thedesc properties of
  309.     basicNumObj have been improved to show the number's value.
  310.  
  311.   - Similar improvements to those for numbers have been made for
  312.     strings.  Multiple strings are now allowed in a single command,
  313.     and the basicStrObj properties sdesc, adesc, and thedesc have
  314.     been improved to show the string's value.
  315.  
  316.   - specialWords has been enhanced.  First, in past versions, if a
  317.     game contained multiple specialWords statements, the word lists
  318.     were additive -- all specialWords lists were used in the game.
  319.     This has been changed so that each specialWords statement replaces
  320.     any previous list in effect.  However, you now can explicitly add
  321.     to the specialWords list, without removing any of the previously
  322.     defined words, by using "modify specialWords".  When you use
  323.     'modify', you can use nil in any word slot if you do not wish
  324.     to add any words for that slot.  Finally, you can use "replace
  325.     specialWords" to make the replacement explicit; this is the default
  326.     if neither 'modify' nor 'replace' is specified, but the compiler
  327.     will now issue a warning (which is harmless) if you use specialWords
  328.     without 'replace' or 'modify' and a previous specialWords list is
  329.     already in effect.
  330.  
  331.   - The words "one" and "ones" (or their equivalent for your game,
  332.     if you've changed them with specialWords) are no longer considered
  333.     reserved words within normal commands.  This allows you to use
  334.     objects such as a "one dollar bill"; previous versions rejected
  335.     player commands containing "one" or "ones".  These words are now
  336.     considered special only during the parsing of a response to a
  337.     disambiguation question, when they can be used in place of a
  338.     noun ("the red one" can be used in answer to "Which book do you
  339.     mean...").
  340.  
  341.   - The hider class has been changed so that 'it' or 'them' (as
  342.     appropriate) are set to the object or objects found when
  343.     searching the hider.
  344.  
  345.   - The verDoPutIn and verDoPutOn messages in thing and surface
  346.     (respectively) have been improved for the somewhat obscure case
  347.     of attempted circular containment - that is, putting an object
  348.     into a container, when the container is already in the first object
  349.     (either directly or by virtue of being inside another object which
  350.     is inside the first object, or inside an object which is inside an
  351.     object which is inside the first object, and so on).  The new
  352.     method thing.circularMessage(iobj) is called in these cases to
  353.     display an appropriate message; the default implementation of this
  354.     method displays the complete list of containers of the direct
  355.     object out to the indirect object.  For example, if you have a
  356.     crate which contains a box, and you try to "put crate in box",
  357.     the message is "You can't put the crate in the box, because
  358.     the box is already in the crate."
  359.  
  360.   - The default doTake method has been changed to include the weight
  361.     of any contents of the item being taken, in addition to the item
  362.     itself, to determine if the actor's inventory is too heavy.
  363.     The old doTake method only included the weight of the object
  364.     being taken, not counting its contents.
  365.  
  366.   - The Actor class has been changed to add a travelTo method.  You
  367.     can now move any actor (Me included) with travelTo(destination).
  368.     The default Actor.travelTo method moves the actor; it announces
  369.     the departure of the actor if the actor was in the same location as
  370.     Me before leaving (and the location is lit); and it announces the
  371.     arrival of the actor if the actor is moving into the same location
  372.     as the player (and the location is lit).  The departure message
  373.     is generated with a call to self.sayLeaving, and the arrival
  374.     message is generated with self.sayArriving.  The default versions
  375.     of these methods simply display "Thedesc leaves the area" and
  376.     "Thedesc enters the area", respectively; you can override these
  377.     methods if a more specific message is desired.
  378.  
  379.   - When modifying a class object with 'modify', the modified object
  380.     was not a class unless the 'class' keyword was included with the
  381.     'modify' statement ("modify class foo" rather than "modify foo").
  382.     This has been corrected; a modified class is still a class.
  383.  
  384.   - outhide(true) now returns a status indicator, which is a value that
  385.     can be used in a subsequent call to outhide() to return output
  386.     hiding to the state it was in before the outhide(true).  This
  387.     allows you to nest text hiding.  When you use the nested form
  388.     (which you do simply by using the return value of outhide(true) as
  389.     the parameter - in place of nil - to the subsequent call to outhide()),
  390.     the value returned by the second outhide() indicates whether any
  391.     text output occurred ONLY BETWEEN THE NESTED CALLS.  For example:
  392.     
  393.      old_stat1 := outhide(true);
  394.      "This is some hidden text.";
  395.      old_stat2 := outhide(true);
  396.      // write no text here
  397.      new_stat2 := outhide(old_stat2);
  398.      new_stat1 := outhide(old_stat1);
  399.  
  400.     Because outhide(old_stat2) indicates whether any output occurred
  401.     during the NESTED outhide(true), new_stat2 = nil.  However, new_stat1
  402.     = true, since output occurred after the first outhide(true).  Consider
  403.     another sequence:
  404.  
  405.      old_stat1 := outhide(true);
  406.      // write no text here
  407.      old_stat2 := outhide(true);
  408.      "This is some hidden text.";
  409.      new_stat2 := outhide(old_stat2);
  410.      new_stat1 := outhide(old_stat1);
  411.  
  412.     In this case, both new_stat1 and new_stat2 will be true, because
  413.     hidden output occurred within both nested sections.
  414.  
  415.     The general form of a nested hidden output section looks like this:
  416.  
  417.          {
  418.             local original_hide_stat;
  419.         local nested_stat;
  420.  
  421.             hide_stat := outhide(true);
  422.             // do whatever you want to do while output is hidden
  423.         nested_stat := outhide(original_hide_stat);
  424.      }
  425.  
  426.     Now nested_stat will indicate whether any output occurred during
  427.     the nested outhide() - that is, between the outhide(true) and
  428.     the outhide(original_hide_stat).  In addition, output hiding will
  429.     be returned to the same state it was in prior to the original
  430.     outhide(true).
  431.  
  432.   - The random number generator has been improved.  Many people have
  433.     complained about the many undesirable properties of the old
  434.     generator, especially when small upper limits were used.  The
  435.     interface to the new random number generator is the same as
  436.     before - call rand(upper_limit), which will return a uniformly
  437.     distributed random number from 1 to upper_limit, inclusive.
  438.  
  439.     Note that the old random number generator will still be used if
  440.     you don't call randomize().  This allows test scripts (which require
  441.     a fixed sequence of random numbers in order to be repeatable) that
  442.     were written with older versions to continue to operate unchanged.
  443.     If you want numbers from the improved generator, be sure to call
  444.     randomize().
  445.  
  446.   - When 'modify' was used on an object, the compiler sometimes did
  447.     not correctly apply the original object's vocabulary and location
  448.     to the new object.  This has been corrected.
  449.  
  450.   - restore() and undo() have been changed so that they always cancel
  451.     all pending commands on the command line.  In the past, if the
  452.     player typed several commands, and something happened (such as
  453.     the player character dying) during one of the commands that led to
  454.     an undo() or restore(), the remaining commands were still
  455.     executed.  This has been fixed.
  456.  
  457.   - If you explicitly set an object's location to nil in its object
  458.     definition, and the object inherited a location from a superclass,
  459.     the system incorrectly placed the object in the contents list of
  460.     the object named in the location inherited from the object's
  461.     superclass.  This has been corrected.
  462.  
  463.   - "abort" can now be used within a daemon or fuse, and the
  464.     expected behavior will occur.  In the past, "abort" within
  465.     a fuse (or daemon) merely exited from the current fuse,
  466.     but the remaining fuses and daemons were still executed.
  467.     Now, "abort" will cause the entire turn to end; no more
  468.     fuses or daemons will be executed on the current turn.
  469.  
  470.  
  471. 2.1.1  09/09/93  enhancements
  472.  
  473.   - You can now access objwords(1) while deciding whether to use a
  474.     default direct object in doDefault.  This is useful mostly if
  475.     you want to prevent players from being able to use "all" with
  476.     certain verbs, but still want to generate a default direct object
  477.     for the verbs.  To do this, you can detect when objwords(1) = ['A']
  478.     ('A' is the parser's internal code for "all", which saves you the
  479.     trouble of checking for "everything" and shorter abbreviations as
  480.     well as "all"):
  481.  
  482.       doDefault(actor, prep, iobj) =
  483.       {
  484.           if (objwords(1) = ['A'])
  485.           {
  486.               global.allMessage := 'You can\'t use "all" with this verb.';
  487.           return [];
  488.  
  489.       /* your normal default object code goes here */
  490.       }
  491.  
  492.     If you wish, you can also suppress the default message that the
  493.     parser will generate ("I don't see what you're referring to").
  494.     To do this, you'll have to write your own parseError() function
  495.     and detect when an "all" violation has occurred (cleverly using the
  496.     global.allMessage, which we set above for this purpose):
  497.  
  498.       parseError: function(str, num)
  499.       {
  500.           // if there's an allMessage waiting, use it instead of the default
  501.           if (global.allMessage <> nil)
  502.       {
  503.           local r;
  504.  
  505.           r := global.allMessage;
  506.           global.allMessage := nil;
  507.           return r;
  508.       }
  509.       else
  510.           return nil;
  511.       }
  512.     
  513.   - The compiler's error message format has been changed slightly
  514.     to work better with editors and workbench programs that scan error
  515.     logs to go to lines with errors.  The format is now:
  516.  
  517.         file(line): error TADS-xxxx: message
  518.  
  519.     For example:
  520.  
  521.         deep.t(1151): error TADS-300: expected colon
  522.  
  523.  
  524.   - The parser now accepts sentences of the form VERB PREP IOBJ DOBJ,
  525.     where the PREP is *not* part of the verb.  For example, GIVE TO THE
  526.     MAN THE BALL.  This change has two benefits.  First, while this
  527.     type of sentence is not common in English, some other languages
  528.     allow this type of phrasing, so the parser is now somewhat more
  529.     adaptable to non-English languages.  Second, this allows for
  530.     object defaulting and command completion when specifying just the
  531.     indirect object, which was not possible before.  For example, if
  532.     the player types ASK FOR A BEER, the parser will be able to attempt
  533.     to provide a default (if one is available), or at least ask for the
  534.     direct object.  Previous versions would simply say "I don't understand
  535.     that sentence."  Note that the parser still attempts to combine the
  536.     verb and preposition into a single phrase; the new action happens
  537.     only when the verb and preposition don't go together (that is, they
  538.     haven't been defined together as a "verb =" property of a deepverb).
  539.     For example, suppose that a line like this appears in a deepverb:
  540.  
  541.         verb = 'pick up'
  542.  
  543.     In this case, PICK UP THE BOX will use THE BOX as the direct object,
  544.     just as in previous versions.  Only when the verb-preposition combination
  545.     is not specifically defined in a verb will the new phrasing be used.
  546.  
  547.   - When no preposition is specified between the direct and indirect objects,
  548.     the parser will now evaluate a new property, nilPrep, in the deepverb
  549.     object.  This property should return the preposition object that should
  550.     be used as the preposition between the objects.  Previous versions of
  551.     TADS always looked for an object that defined the word 'to' as a
  552.     "preposition =" property.  While 'to' is almost always the correctly
  553.     the correct preposition to substitute in English, it's obviously the
  554.     wrong word in other languages; furthermore, the correct word in other
  555.     languages is sometimes a function of verb.  If no nilPrep property is
  556.     defined for the deepverb, the parser will still use the object whose
  557.     "preposition =" property matches the word 'to'.
  558.  
  559.   - The class transparentItem in adv.t has been modified so it works better
  560.     when you define an object that inherits from both transparentItem and
  561.     container or openable.  First, an ldesc has been added so that the
  562.     contents of a transparentItem are listed by default with the ldesc.
  563.     Second, the "look in" command now works on a transparentItem.  In
  564.     addition, the openable class has been changed so that the "look in"
  565.     command can be used when an openable is also a transparentItem, even
  566.     when the openable is closed (because you should be able to see the
  567.     contents of a transparentItem regardless of whether it's open or closed).
  568.     Thanks to Ron Hale-Evans for pointing out this problem and finding the
  569.     solution.
  570.  
  571. 2.1.0  04/07/93  new features, enhancements, bug fixes
  572.  
  573.   - TADS finally has a way of changing objects and functions in
  574.     adv.t without changing adv.t itself.  The new mechanism allows
  575.     you to entirely replace a previously defined object or function
  576.     with one of your own, and also lets you modify a previously
  577.     defined object by adding or overriding properties.  Two new
  578.     keywords have been added to the language to support these new
  579.     features:  "replace" and "modify".
  580.  
  581.     Using these new features, it should be possible to make most
  582.     of the changes to adv.t that are necessary while writing a game
  583.     without actually changing the file adv.t itself.  This should
  584.     make version upgrades much easier to apply, since you shouldn't
  585.     need to reconcile any changes you have made to adv.t with the
  586.     new version.
  587.  
  588.     High Energy Software requests that you advise us of any changes
  589.     to adv.t that would facilitate modification and replacement of
  590.     the objects defined in adv.t.  Examples would include common
  591.     code fragments that could be moved into a function for easy
  592.     replacement, and single deepverb objects that should be split
  593.     into multiple objects.
  594.  
  595.     You can replace a previously-defined function with a new
  596.     definition simply by prefacing your new definition with the
  597.     keyword "replace"; for example, to replace adv.t's new
  598.     scoreStatus function, you could do this:
  599.  
  600.        #include <adv.t>
  601.  
  602.        replace scoreStatus(points, turns)
  603.        {
  604.           setscore(cvtstr(pts) + ' points/' + cvtstr(turns) + ' moves');
  605.        }
  606.  
  607.     You can do the same thing with objects.  For example, to replace
  608.     a verb in adv.t, you could do something like this:
  609.  
  610.        #include <adv.t>
  611.  
  612.        /* we don't want "buckle", so replace adv.t's fastenVerb */
  613.        replace fastenVerb: deepverb
  614.           verb = 'fasten'
  615.       sdesc = "fasten"
  616.       prepDefault = toPrep
  617.       ioAction(toPrep) = 'FastenTo'
  618.        ;
  619.  
  620.     Replacing an object entirely deletes the previous definition of
  621.     the object, including all inheritance information and vocabulary.
  622.     The only properties of a replaced object are those defined in the
  623.     replacement; the original definition is entirely discarded.
  624.  
  625.     You can also modify an object, which retains its original definition
  626.     (including inheritance information, vocabulary, and properties), and
  627.     allows you to add new properties and vocabulary.  You can also
  628.     override properties, simply by redefining them in the new definition.
  629.     The most common addition to an object from adv.t will probably be
  630.     new verb associations; for example:
  631.  
  632.        modify pushVerb
  633.           verb = 'nudge'
  634.           ioAction(withPrep) = 'PushWith'
  635.        ;
  636.  
  637.     Note several things about this example.  First, no superclass
  638.     information can be specified in a "modify" statement; this is because
  639.     the superclass list for the modified object is the same as for the
  640.     original object.  Second, note that vocabulary has been added.
  641.     The additional vocabulary does NOT replace the original vocabulary,
  642.     but simply adds to the previously-defined vocabulary.  Further note
  643.     that verb association pseudo-properties, such as doAction and ioAction,
  644.     are legal in a "modify" definition.
  645.  
  646.     In a method that you redefine with "modify", you can use "pass"
  647.     or "inherited" to refer to the REPLACED method.  In essence, using
  648.     "modify" renames the original object, and then creates a new
  649.     object under the original name; the new object is created as a
  650.     subclass of the original (now unnamed) object.  There is no way
  651.     to refer to the original object, except indirectly through the
  652.     new replacement object.  Here's an example of "modify" and "pass":
  653.  
  654.         class testClass: object
  655.         sdesc = "testClass"
  656.     ;
  657.  
  658.         testObj: testClass
  659.             sdesc =
  660.         {
  661.             "testObj...";
  662.         pass sdesc;
  663.         }
  664.         ;
  665.  
  666.         modify testObj
  667.             sdesc =
  668.         {
  669.             "modified testObj...";
  670.         pass sdesc;
  671.         }
  672.     ;
  673.  
  674.     Evaluating testObj.sdesc results in this display:
  675.  
  676.         modified testObj...testObj...testClass
  677.  
  678.     However, you can override this behavior for a property by
  679.     using the replace keyword on the property.  In the example
  680.     above, we could do this instead:
  681.  
  682.         modify testObj
  683.             replace sdesc =
  684.         {
  685.             "modified testObj...";
  686.         pass sdesc;
  687.         }
  688.     ;
  689.  
  690.     This would result in the following display for testObj.sdesc:
  691.  
  692.         modified testObj...testClass
  693.  
  694.     The "replace" keyword before the property definition tells the
  695.     compiler to completely delete the previous definitions of the
  696.     property.  This allows you to completely replace the property,
  697.     and not merely override it, meaning that "pass" and "inherited"
  698.     will refer to the property actually inherited from the superclass,
  699.     and not the original definition of the property.
  700.  
  701.   - It is now possible for the player to customize the colors used
  702.     by the runtime.  A small new program, TRCOLOR, is provided to
  703.     set up the runtime screen colors.  The program is self-explanatory;
  704.     simply type TRCOLOR at the DOS prompt to invoke it.  Once you've
  705.     selected your color scheme, TRCOLOR will create a small file
  706.     called TRCOLOR.DAT (in the current directory); the runtime will
  707.     read this file in subsequent game sessions.
  708.  
  709.     Note that you can use multiple TRCOLOR.DAT files, in much the same
  710.     way you can use two CONFIG.TC files.  The runtime looks first for
  711.     TRCOLOR.DAT in the current directory; if no such file is found, the
  712.     runtime will then look in the directory where TR.EXE resides.  So,
  713.     you can set up separate color schemes for each game you're playing,
  714.     and have a default color scheme for games with no specific color
  715.     scheme of their own.
  716.  
  717.   - The user interface of the MAKETRX program has been improved.
  718.     For compatibility with existing makefiles, the old command line
  719.     syntax is still allowed; however, you can now omit most of the
  720.     arguments, and MAKETRX will use convenient new defaults.
  721.  
  722.     First, you can now omit the extensions on all the arguments.
  723.     The extension assumed for the TR.EXE program is .EXE; for the
  724.     game file it is .GAM; and for the executable output file it is .EXE.
  725.  
  726.     Second, you can now omit everything except the name of the game
  727.     file.  If you omit the name of the TR.EXE program, MAKETRX attempts
  728.     to find TR.EXE in the same directory as MAKETRX.EXE; so, if you
  729.     simply keep all of your TADS executables in a single directory,
  730.     you won't need to specify the location of TR.EXE when running MAKETRX.
  731.     If you omit the name of the destination file, MAKETRX will use the
  732.     same name as the game file, with the extension replaced by .EXE.
  733.  
  734.     The command line arguments to MAKETRX that are now understood are:
  735.  
  736.        maketrx gamefile
  737.          Converts gamefile.gam into gamefile.exe, using TR.EXE from the
  738.      same directory as MAKETRX.EXE.
  739.  
  740.        maketrx gamefile output
  741.          Converts gamefile.gam into output.exe, using TR.EXE from the
  742.      same directory as MAKETRX.EXE.
  743.  
  744.        maketrx \tads2\tr.exe gamefile output
  745.          Converts gamefile.gam into output.exe, using \tads2\tr.exe.
  746.  
  747.  
  748.   - The dobjGen and iobjGen mechanism has been changed slightly.
  749.     In the original implementation, you could prevent the system
  750.     from calling dobjGen/iobjGen by defining an appropriate verXoVerb
  751.     property in the actual object, but NOT in a superclass.  This
  752.     made it impossible to define a class that had exceptions to
  753.     dobjGen/iobjGen except by explicitly testing for those verbs
  754.     in the xobjGen routines.
  755.  
  756.     The change is that the system will now skip calling xobjGen
  757.     if an appropriate verXoVerb/xoVerb property is defined in such
  758.     a way that it "overrides" xobjGen for the object.  Here's an
  759.     example:
  760.  
  761.        class cursedItem: item
  762.            dobjGen(a, v, i, p) =
  763.        {
  764.            "As you touch <<self.thedesc>>, a bolt of lightning
  765.            leaps from the object and sends you reeling away!";
  766.        }
  767.        iobjGen(a, v, d, p) = { self.dobjGen(a, v, d, p); }
  768.        verDoInspect(actor) = { pass verDoInspect; }  // allow 'inspect'
  769.        ;
  770.  
  771.     The change means that the presence of verDoInspect in the *class*
  772.     prevents the system from calling dobjGen when the verb is "inspect",
  773.     even for subclasses.  With the old system, since the subclass objects
  774.     themselves didn't define verDoInspect, dobjGen would be called even
  775.     though the verDoInspect logically overrides the dobjGen.
  776.  
  777.   - The restore() intrinsic has been extended to allow your game
  778.     program to explicitly restore the saved game specified by the
  779.     user as a parameter to your stand-alone game program.  This is
  780.     currently only useful on the Macintosh, but the inclusion of
  781.     code to test for this case will make your game work better on
  782.     the Macintosh (and possibly other platforms in the future).
  783.  
  784.     The new functionality is invoked by calling restore(nil).  If
  785.     a saved game was specified by the user at start-up time, the
  786.     game will be restored, and nil will be returned.  If no file
  787.     was specified, or an error occurred restoring the game, the
  788.     function returns true.  To use this new behavior, we recommend
  789.     placing the following code in your init function, before your
  790.     introductory messages and other startup code:
  791.  
  792.        // check for a file to restore specified as a startup parameter
  793.        if (restore(nil) = nil)
  794.        {
  795.            "\b[Restoring saved game]\b";
  796.            scoreStatus(global.score, global.turnsofar);
  797.            Me.location.lookAround(true);
  798.            return;
  799.        }
  800.  
  801.     Note that the run-time will still automatically restore the
  802.     game provided as a parameter (on the Macintosh) after init returns
  803.     if you do NOT include this code in init.  The reason for including
  804.     this code is that it provides your game with greater control over
  805.     the sequence of events during startup.  If you allow the run-time
  806.     to perform the restore automatically, your entire init function will
  807.     be executed; this may be undesirable, because it forces the user to
  808.     view the entire introductory text even though they'll immediately
  809.     restore a game after reading it.  If you place the restore(nil) call
  810.     before your introductory text, the user will be spared the long text
  811.     display; however, you'll still have complete control over any text
  812.     that you want the user to see even when restoring a game, such as
  813.     your copyright message.
  814.  
  815.   - New built-in function:  objwords(num), which provides a list of
  816.     the actual words the user typed to refer to an object used in
  817.     the current command.  The argument (num) is a number specifying
  818.     which object you're interested in:  1 for the direct object, or
  819.     2 for the indirect object.  The return value is a list of strings;
  820.     the strings are the words used in the command.  If a special
  821.     word, such as "it", "them", or "all", was used to specify the
  822.     object, the list will have a single element, which is the special
  823.     word used.
  824.  
  825.     Examples:
  826.  
  827.        >take all
  828.        objwords(1) -> ['all']
  829.        objwords(2) -> []
  830.  
  831.        >put all in red box
  832.        objwords(1) -> ['all']
  833.        objwords(2) -> ['red' 'box']
  834.  
  835.        >put blue box in it
  836.        objwords(1) -> ['blue' 'box']
  837.        objwords(2) -> ['it']
  838.  
  839.        >put blue folder and green book in red box
  840.        blue folder:
  841.        objwords(1) -> ['blue' 'folder']
  842.        objwords(2) -> ['red' 'box']
  843.        green book:
  844.        objwords(1) -> ['green' 'book']
  845.        objwords(2) -> ['red' 'box']
  846.  
  847.     This function could potentially be useful in such cases as
  848.     "ask actor about object", because it allows you to determine
  849.     much more precisely what the player is asking about than would
  850.     otherwise be possible.
  851.  
  852.   - The setit() function now takes nil as a parameter; this prevents
  853.     using "it" in a command until another object has been referenced.
  854.     nil can be used for "him" and "her" as well, as described below.
  855.  
  856.   - Enhancements to the setit() built-in function:  you can now directly
  857.     set the 'him', 'her', and 'them' values using the setit() function.
  858.  
  859.        - To set 'them', simply call setit() with a list value:
  860.          setit([redBook blueBook boots]);
  861.  
  862.        - To set 'him', add a second argument value of 1 to the call:
  863.          setit(joe, 1);
  864.  
  865.        - To set 'her', add a second argument value of 2:
  866.          setit(harriet, 2);
  867.  
  868.   - The restart() built-in function now takes an optional set of
  869.     arguments:  a pointer to a function, and a parameter value for
  870.     the function (if one is provided, the other is also required, but
  871.     both can be omitted).  If they're provided, TADS calls the function
  872.     with the provided parameter value *after* resetting the game, and
  873.     before running the init() function.  This allows you make the game
  874.     start slightly differently after a restart than on the initial startup.
  875.     adv.t uses this feature to call the function initRestart, with the
  876.     parameter value global.initRestartParam, upon restart.  The initRestart
  877.     function defined in adv.t simply sets the flag global.restarting to
  878.     true.  Your game can test global.restarting (in the init function or
  879.     elsewhere) to determine whether the game has been restarted, or is
  880.     being run for the first time.  You can also replace initRestart()
  881.     with your own function if you wish to do something more complicated;
  882.     in this case, if you wish to pass information to the function, you
  883.     can simply store it in global.initRestartParam, and it will be passed
  884.     to the function automatically by adv.t upon restarting.
  885.  
  886.   - New built-in function:  inputkey() reads a single keystroke from
  887.     the keyboard.  The function takes no arguments.  When called,
  888.     inputkey() will flush any pending output text, then pause the game
  889.     until the player hits a key.  It then returns a string containing
  890.     the single key hit by the player.  Note that the function does NOT
  891.     provide a portable mechanism for reading non-standardized keys;
  892.     special keys such as cursor arrow keys and function keys will return
  893.     a string specific to the type of computer being used.  Your game
  894.     will not be portable if you make use of any non-standardized key
  895.     values returned by inputkey().  To ensure portability, use inputkey()
  896.     strictly with standard ASCII keys (alphabetic, numeric, and punctuation
  897.     keys).  It is also fully portable if you simply ignore the return value
  898.     and use the function only to pause and wait for a key.
  899.  
  900.   - Several changes have been made for better national language
  901.     support.  First, the DOS version now allows 8-bit characters
  902.     (characters in the extended character set, with ASCII code
  903.     from 128 to 255) in text displayed by the game, vocabulary
  904.     words, and player commands.  Characters in the extended character
  905.     set are always considered to be alphabetic, so these characters
  906.     can only be used in input as parts of words (hence, symbols
  907.     from the extended character set that appear as punctuation
  908.     marks can't be used as punctuation in player commands).
  909.  
  910.   - The debugger now has "More" mode in the command window.  When
  911.     a single display won't fit in the window (for example, a long
  912.     stack traceback), the debugger will prompt with "[More]" each
  913.     time the window fills up.  Hit the space bar to scroll by a
  914.     whole screen, or the Return/Enter key to scroll by a single line.
  915.  
  916.   - The debugger has a new "call history" feature.  This feature
  917.     captures information about every function and method call,
  918.     including argument lists and return values (if any), and saves
  919.     the information for future inspection.  Several new commands
  920.     have been added to the debugger to support call history:
  921.  
  922.         c+    Enables call history, and clears previous history.
  923.         c-    Disables call history capture.
  924.         cc    Clears all current history information.
  925.         c     Displays current history information.
  926.  
  927.     The reason that call history can be enabled and disabled is
  928.     that enabling the feature slows down the debugger substantially,
  929.     because it must store information every time a method is called.
  930.  
  931.     This feature could be useful if you're trying to figure out the
  932.     sequence of method calls that occurs during the execution of
  933.     a command.  At the debugger command line, type c+ to turn on
  934.     call history; then, type g to resume your game.  Type the command
  935.     that you want to debug, then type DEBUG at the game prompt to
  936.     return to the debugger.  Now type c- to turn off call history,
  937.     and c to display the history information from the command you
  938.     just executed.  This will allow you to see every method and
  939.     function that was called by TADS, as well as all the methods
  940.     and functions called by your code.
  941.  
  942.     The call history display will have each function/method call indented
  943.     by a number of spaces indicating the nesting depth; any method/function
  944.     called by TADS will be at the left margin, any methods/functions called
  945.     by the first one will be indented one space, any methods/functions
  946.     called by those will be indented two spaces, and so on.  The return
  947.     values will be indented by the same number of spaces as the function
  948.     itself was.  Note that a return value may be separated from its
  949.     entrypoint by several lines, because calls made by the function
  950.     will appear between the function entry and the return value.
  951.  
  952.   - Another new national language feature is the addition of
  953.     several new parser-called user functions that allow better
  954.     user control over the generation of parser messages.  The
  955.     new functions have been added because some people have found
  956.     that the parseError() function is not sufficiently flexible
  957.     for some situations, because it only allows changing the text
  958.     of messages on a piecewise basis; when complete messages need
  959.     to be built out of several pieces, it's necessary to be able to
  960.     take over the entire process of building the message.  The new
  961.     functions allow full control of the generation of certain messages.
  962.  
  963.     parseAskobj(v, ...):  This function is called when the parser
  964.     needs to ask the player for a direct or indirect object to complete
  965.     the command.  For example, if the player just types "take", and
  966.     several objects are present that could be taken, the parser must
  967.     ask the player what to take.  If a direct object is being requested,
  968.     the function will have only one argument (the verb).  If an indirect
  969.     object is being requested, the function will have *two* arguments;
  970.     the second argument will be the preposition.  Note that the preposition
  971.     can be nil, in which case you can assume that "to" is to be used.
  972.     The implementation below emulates the default behavior.
  973.  
  974.         parseAskobj: function(v, ...)
  975.     {
  976.         "What do you want to <<v.sdesc>>";
  977.         if (argcount = 2)
  978.         {
  979.             local p := getarg(2);
  980.             " it << p ? p.sdesc : "to" >>";
  981.         }
  982.         "?";
  983.     }
  984.  
  985.     parseDisambig(string, list):  This function is called by the
  986.     parser when objects need to be disambiguated.  If this optional
  987.     function is provided, it is called with the string that the player
  988.     typed which is in need of disambiguation, and a list of the objects
  989.     that match the string.  The implementation below emulates the
  990.     parser's default behavior.
  991.  
  992.         parseDisambig: function(str, lst)
  993.         {
  994.             local i, tot, cnt;
  995.         
  996.             "Which << str >> do you mean, ";
  997.             for (i := 1, cnt := length(lst) ; i <= cnt ; ++i)
  998.             {
  999.                 lst[i].thedesc;
  1000.                 if (i < cnt) ", ";
  1001.                 if (i+1 = cnt) "or ";
  1002.             }
  1003.             "?";
  1004.         }
  1005.  
  1006.     parseError2(v, d, p, i):  The parser calls this function to
  1007.     generate the default error message stating that the verb attempted
  1008.     isn't accepted by the objects involved; this happens when either
  1009.     the indirect object doesn't define an appropriate verIoXxxx method,
  1010.     or the direct object doesn't define an appropriate verDoXxxx method.
  1011.     Only one of 'd' (direct object) or 'i' (indirect object) will be
  1012.     non-nil.  If 'i' is nil, so will 'p' (preposition).  The verb, 'v',
  1013.     will never be nil.  Note that 'p' can be nil even when 'i' is not,
  1014.     in which case you should assume that the preposition is "to".
  1015.     The implementation below behaves the same as the parser's default.
  1016.  
  1017.         parseError2: function(v, d, p, i)
  1018.         {
  1019.             "I don't know how to << v.sdesc >> ";
  1020.             if (d)
  1021.                 "<< d.thedesc >>.";
  1022.             else
  1023.             "anything << p ? p.sdesc : "to" >> << i.thedesc >>.";
  1024.         }
  1025.  
  1026.     parseDefault(obj, prp):  This function is called when the parser
  1027.     is assuming a default object.  If a default direct object is being
  1028.     assumed, prp (the preposition) will be nil; otherwise, prp will have
  1029.     the object corresponding to the preposition preceding the indirect
  1030.     object.  The implementation below provides the default behavior.
  1031.  
  1032.         parseDefault: function(obj, prp)
  1033.         {
  1034.             "(";
  1035.             if (prp) "<< prp.sdesc>> ";
  1036.             obj.thedesc;
  1037.             ")";
  1038.         }
  1039.  
  1040.     Note that all three of these new functions are optional.  If any
  1041.     is omitted, the parser uses the default behavior, so existing games
  1042.     will run unchanged.  You can include any one without including the
  1043.     others; these new functions are all independent.  Note also that
  1044.     the default parser behavior continues to use parseError the same
  1045.     way it has since parseError was introduced; however, when these
  1046.     new functions are provided, the corresponding parseError calls will
  1047.     obviously no longer be made.
  1048.  
  1049.   - COMPATIBILITY NOTE:  By default, the .GAM files produced by
  1050.     the 2.1.0 compiler will NOT be compatible with previous
  1051.     versions of the runtime, due to several changes to the .GAM
  1052.     file format.  However, a new compiler option has been added
  1053.     that allows you to specify which .GAM file format to produce:
  1054.  
  1055.       -fv a   produces .GAM format compatible with 2.0.14 or earlier
  1056.       -fv b   produces game file format requiring 2.1.0 or later
  1057.       -fv *   (default) produces latest file format (currently b)
  1058.  
  1059.     If you want your game to be compatible with older versions of
  1060.     the runtime, use -fv a.  The 2.1.0 runtime is compatible with
  1061.     .GAM files produced by ANY version of the compiler; the runtime
  1062.     automatically detects which file format version it is reading.
  1063.  
  1064.     Note that using -fv a will prevent you from being able to call
  1065.     an external function from within the init function (see the bug
  1066.     fix described below).  In addition, even when using -fv a, since
  1067.     previous versions of the run-time did not provide the new built-in
  1068.     functions, your game will be incompatible with runtimes prior to
  1069.     2.1.0 -- regardless of whether you use -fv a or not -- if you
  1070.     use any new built-in functions.
  1071.  
  1072.     In the future, if there is another incompatible .GAM file format
  1073.     change, additional -fv options will be added to the new compiler.
  1074.  
  1075.   - One of the changes to the .GAM file format makes it much more
  1076.     compressible with archiving tools (such as ZIP).  Previous
  1077.     .GAM files typically compressed by only 10 to 20%; the files
  1078.     produced with file format B are generally compressible by 40
  1079.     to 50%.
  1080.  
  1081.   - runfuses and rundaemons had a bug that reset the run-time
  1082.     stack, causing problems if a nested method or function
  1083.     called these functions.  This has been corrected.
  1084.  
  1085.   - Subtracting one list from another didn't work as documented.
  1086.     This has been corrected.
  1087.  
  1088.   - In previous versions, external functions could not be called
  1089.     while the init function was running.  This was an unintentional
  1090.     side-effect of the way external functions were loaded, and the
  1091.     problem has been corrected.  External functions can now be called
  1092.     at any time.
  1093.  
  1094.   - A new warning has been added that can help you track down
  1095.     unterminated strings.  Whenever the compiler sees a line that
  1096.     begins with a semicolon or close brace (';' or '}') inside
  1097.     a string, it will issue a warning.  While this is just a guess
  1098.     that the string may be unterminated, it's often right, especially
  1099.     if you follow the general formatting style used by adv.t:  always
  1100.     end a function with a brace in the first column of a new line,
  1101.     and always end an object with a semicolon in the first column of
  1102.     a new line.
  1103.  
  1104.     Note that we strongly recommend that you follow this formatting
  1105.     style in your code, both for general readability and because it
  1106.     may enhance your code's compatibility with future High Energy
  1107.     Software products that use assumptions about formatting style
  1108.     that are similar to that used to generate the new unterminated
  1109.     string warning.
  1110.  
  1111.   - Several small enhancements and bug fixes have been made to
  1112.     adv.t:
  1113.  
  1114.        - A new property has been added to nestedroom objects:
  1115.          statusPrep, which displays "on" or "in" (or whatever),
  1116.      as appropriate, for messages such as "Spaceship, in chair".
  1117.      This defaults to "in" for nestedroom, and "on" for beditem.
  1118.      Other nestedroom objects you define may want to customize it.
  1119.  
  1120.        - There was a bug that allowed the player to throw a fixeditem
  1121.          that was (indirectly) being carried (for example, a fixeditem
  1122.          that is part of another object that can be carried) at something.
  1123.      This has been fixed.
  1124.  
  1125.        - The follower class did not 'exit' at the end of its actorAction.
  1126.          This has been fixed.
  1127.  
  1128.        - The follower class now makes use of iobjGen and dobjGen to respond
  1129.          with an appropriate message ("the actor is no longer here") to
  1130.      any command other than "follow".
  1131.  
  1132.        - The clothingItem class has been enhanced to allow "get out of"
  1133.          to be used to take off the item.
  1134.  
  1135.        - All of the verbs containing the word "look" now have synonyms
  1136.          with "l" as well:  l at, l on, l in, l under, l around, l thru,
  1137.      and so on.
  1138.  
  1139.        - A bug has been fixed that allowed the command "take all from foo"
  1140.          to remove the contents of "foo" even if it was closed.  The
  1141.      change is to the doDefault method in takeVerb.
  1142.  
  1143.        - The vehicle class has been adjusted so that the player can't
  1144.          take a vehicle or otherwise manipulate it while the player is
  1145.      currently in the vehicle -- this is important for things such
  1146.      as rubber rafts which can be used both as vehicles and ordinary
  1147.      carryable items.  dobjGen and iobjGen are used to accomplish
  1148.          this; the only allowed verbs on a vehicle while it's occupied
  1149.      by the player are inspectVerb, getOutVerb, outVerb, and putVerb
  1150.      with the vehicle as an indirect object (allowing objects to be
  1151.      put into the vehicle while it's occupied).  If you want to allow
  1152.      additional verbs in a particular vehicle, override dobjGen or
  1153.      iobjGen as appropriate, and simply return if the verb matches
  1154.      any of the verbs you wish to add:
  1155.  
  1156.          dobjGen(a, v, i, p) =
  1157.          {
  1158.              // allow "launch" and "land" while in the magic raft
  1159.              if (v <> launchVerb and v <> landVerb)
  1160.              pass dobjGen;
  1161.          }
  1162.  
  1163.   - The compiler now detects usage (both explicit and implicit)
  1164.     of "self" in functions.  This has always been illegal, but
  1165.     in previous versions the compiler did not notice; any uses
  1166.     of "self" in functions resulted in a run-time error (often
  1167.     a mysterious error, such as a cache manager severe error and
  1168.     abnormal termination due to a reference to a non-existent
  1169.     object).  This was especially troublesome when a property
  1170.     name was used as a local variable when the local variable
  1171.     wasn't declared; since the v2 compiler assumes "self" in
  1172.     references to properties that don't include an object
  1173.     qualification, the compiler would silently turn an undefined
  1174.     variable usage into a reference to "self".  The compiler will
  1175.     now flag a new error in these cases:  TADS-344, "self" is not
  1176.     valid in this context.  If you get this error without an
  1177.     explicit reference to "self", you probably have an implicit
  1178.     reference, which means you probably are using an undeclared
  1179.     local variable.  Adding a "local" declaration for the variable
  1180.     should clear the error.
  1181.  
  1182.   - "Her" was not set properly, even when the isHer property was
  1183.     set to true for an object.  This has been corrected.
  1184.  
  1185.   - A new compiler option has been added:  -v, for "verbosity".
  1186.     This option lets you tell the compiler how much warning
  1187.     information you'd like to see.  By default, the verbosity
  1188.     level is 0 (zero), which causes certain warnings to be
  1189.     suppressed.  You can specify -v followed by a number to
  1190.     set a higher verbosity level.  So far, only the messages
  1191.     listed below are affected by -v, but the verbosity level
  1192.     for certain warnings may be changed in the future (and new
  1193.     warnings may be added at high verbosity levels).  Currently,
  1194.     the general meaning of the verbosity levels is:  0, report
  1195.     only serious errors and warnings; 1, report suspicious
  1196.     situations that may or may not indicate errors; 2, report
  1197.     all information, including general warning information that
  1198.     usually does not indicate any actual problem.
  1199.  
  1200.   - A new compiler option has been added:  -e file, for "error logging".
  1201.     This option captures all messages generated by the the compiler to
  1202.     the specified file.  Messages are also displayed interactively as
  1203.     normal.  WARNING: if the file specified with -e already exists, it
  1204.     is overwritten with the error information.
  1205.  
  1206.   - The compiler warning messages about "object not found" for the
  1207.     optional objects (preinit, preparse, parseError, commandPrompt)
  1208.     are now suppressed if the verbosity level is less than 2.
  1209.     If you specify -v2 (or -v with a higher number than 2), these
  1210.     messages will be displayed for all optional objects not found;
  1211.     otherwise, no warnings will be generated.
  1212.  
  1213.   - The compiler warning messages about "#include file already included"
  1214.     are now suppressed if the verbosity level is less than 1.
  1215.  
  1216.  
  1217. 2.0.14  02/10/93  bug fixes, minor enhancements
  1218.  
  1219.   - A new backslash code has been added to the output formatter that
  1220.     causes the formatter to pass the next two bytes unchanged.
  1221.     This has been added primarily for 16-bit character sets, to allow
  1222.     two-byte characters that contain a backslash ('\', ASCII 92) as
  1223.     one of their two bytes to be passed through the formatter without
  1224.     interpretation as part of a backslash sequence.  The new code
  1225.     is "\-"; the two bytes following the \- are not interpreted by
  1226.     the formatter.  For example:
  1227.  
  1228.        "\-\bTesting...\nDone!";
  1229.  
  1230.     displays:
  1231.  
  1232.        \bTesting...
  1233.        Done!
  1234.  
  1235.     Note that the "\b" sequence is not interpreted as a blank line,
  1236.     as it would normally be, but is simply displayed, because the \-
  1237.     suppresses any interpration of the next two bytes.  The "\n",
  1238.     however, is interpreted as a newline as normal, since it is not
  1239.     quoted by a \- sequence.
  1240.  
  1241.   - You can now break out of an infinite loop in your game while
  1242.     running under the debugger.  On DOS, if your game goes into a loop,
  1243.     hit the Control + Break keys - the loop should immediately be
  1244.     aborted and control returned to the debugger command line.
  1245.     The Control-Break sequence also works with the runtime; it
  1246.     causes control to be returned to the player command line.
  1247.     Note that the interrupted command is automatically undone, so
  1248.     the interrupt sequence will not leave the game in an inconsistent
  1249.     state.  Note also that only long loops can be interrupted; the
  1250.     system only checks for interruptions once every several hundred
  1251.     instructions for greater efficiency.
  1252.  
  1253.   - The debugger will now catch run-time errors, activating the
  1254.     debugger command line when an error occurs.  The source will
  1255.     be positioned at the location of the error, as though a breakpoint
  1256.     had been set there, and the error message will be displayed.  Local
  1257.     variables can be evaluated as normal to help determine the cause of
  1258.     the error.  When you resume execution (with Trace, Step, or Go),
  1259.     the current command will be aborted and control will return to the
  1260.     player command prompt.  Note that there's no way to "fix" the error
  1261.     once it's been caught, but you can at least see exactly where the
  1262.     error occurred and determine the conditions that caused it.  Note
  1263.     also that certain types of errors, such as memory management errors,
  1264.     will not invoke the debugger; only errors that are directly caused
  1265.     by an error in your game program will trap to the debugger.
  1266.  
  1267.   - The debugger incorrectly reported files as "not found" in the
  1268.     list of modules produced by the "fl" command.
  1269.  
  1270.   - The runtime was inconsistent in its calls to ioDefault.  Sometimes
  1271.     it called ioDefault(actor, prep), and other times it called it as
  1272.     ioDefault(actor, prep, dobj) - this made it impossible to define the
  1273.     method correctly if argument checking was enabled.  This has been
  1274.     corrected so that the dobj parameter is never included.  When attempting
  1275.     to identify a default indirect object, the parser never has a direct
  1276.     object available, since the indirect object must be resolved first;
  1277.     hence, the dobj that was occasionally being passed by the parser was
  1278.     always nil.  The unnecessary extra parameter has been removed:  the
  1279.     method is now always called as ioDefault(actor, prep).
  1280.  
  1281.   - The compiler generated incorrect code if the implicit "self" object
  1282.     was used to reference an object (that is, a property was used without
  1283.     an object specifier).  This resulted in "invalid opcode" errors at
  1284.     run-time.
  1285.  
  1286.   - The compiler sometimes complained that an included file couldn't
  1287.     be found, even when the included file was explicitly loaded as part
  1288.     of a precompiled header.  This happened any time the included file
  1289.     was not in the current directory at compilation time.
  1290.  
  1291.   - The compiler aborted with an "assertion failure" (which indicates
  1292.     that the compiler detected that it was in an internally inconsistent
  1293.     state, which should not be attainable under any circumstances) when
  1294.     the game program used a variable or expression on the right hand
  1295.     side of a dot operator and an object on the left hand side.
  1296.  
  1297. 2.0.13  01/16/93  enhancements and bug fixes
  1298.  
  1299.   - If a vocabulary word contained a single quote character, the
  1300.     word could not be matched at run-time.
  1301.  
  1302.   - The run-time now allows all characters from the extended character
  1303.     set (ASCII codes above 127) to be displayed.  The run-time
  1304.     previously converted some extended characters into spaces.
  1305.  
  1306.   - The compiler did not allow a label to precede the first goto
  1307.     that referred to the label.
  1308.  
  1309.   - The debugger will now stop at a breakpoint in a method that
  1310.     is inherited by an object.  For example, if a breakpoint is
  1311.     set at room.lookAround, and startroom inherits lookAround
  1312.     from the class room, the debugger will stop at startroom.lookAround.
  1313.     It does not, however, stop on startroom.lookAround if startroom
  1314.     overrides lookAround.
  1315.  
  1316.   - The compiler will now flag an assignment to an undeclared
  1317.     symbol as an error.  It previously assumed that the symbol
  1318.     referred to a property, with an implicit object of "self".
  1319.     This was almost never desirable, because this type of
  1320.     assignment was most often coded in error -- the game author
  1321.     usually meant to code an assignment to a local variable, but
  1322.     either misspelled the variable name or forgot to declare it.
  1323.  
  1324.   - remfuse/remdaemon/unnotify no longer signal an error if the
  1325.     item being removed is not active.  Several game authors have
  1326.     indicated that this error is not helpful, since it makes it
  1327.     impossible to unconditionally remove a fuse -- you have to
  1328.     check to make sure it hasn't fired yet, which create a lot
  1329.     of unnecessary overhead.
  1330.  
  1331.   - NEW BUILT-IN FUNCTION:  intersect(list1, list2) returns the
  1332.     intersection of two lists; that is, it returns the list of
  1333.     all of the elements of the shorter of list1 and list2 that
  1334.     are also in the other list.  For example:
  1335.  
  1336.         [1 2 3 4 5] and [1 3 5 7]     ->    [1 3 5]
  1337.         ['abc' 'def'] and ['abc']     ->    ['abc']
  1338.  
  1339.     This new function can be used to improve performance in cases
  1340.     where (effectively) one list of items is being searched for
  1341.     the presence of another list of items.
  1342.  
  1343.   - NEW BUILT-IN FUNCTION:  runfuses() runs all expired fuses, if any.
  1344.     Returns true if any fuses expired, nil otherwise.  This function has
  1345.     been added to allow greater control over fuse processing.  Note that
  1346.     fuses set with both the setfuse() and notify() built-in functions
  1347.     are run.  This function takes no arguments.
  1348.  
  1349.   - NEW BUILT-IN FUNCTION:  rundaemons() runs all daemons.  This function
  1350.     runs daemons set with both the setdaemon() and notify() functions.
  1351.     rundaemons() takes no arguments and returns no value.
  1352.  
  1353.   - NEW BUILT-IN FUNCTION:  getfuse allows you to determine if a fuse
  1354.     (set with either setfuse or notify) is active.  It returns nil if
  1355.     the fuse is not active (i.e., it has been activated or removed),
  1356.     or the number of turns left.
  1357.  
  1358.     For setfuse() fuses:   getfuse(fuse_func, parameter)
  1359.     For notify() fuses:    getfuse(object, &message)
  1360.  
  1361.   - NEW BUILT-IN FUNCTION:  gettime() returns the current time.  The
  1362.     time is returned as a list of numeric values for easy processing by
  1363.     your game:
  1364.  
  1365.       [year month day weekday yearday hour minute second elapsed]
  1366.  
  1367.     The specific meanings of the values are:
  1368.  
  1369.           year        - calendar year (e.g., 1992).
  1370.           month       - month number (January = 1, February = 2, etc.)
  1371.           day         - number of the day within the current month
  1372.           weekday     - day of the week (1 = Sunday, 2 = Monday, etc.)
  1373.           yearday     - day of the year (1 = Jan 1)
  1374.           hour        - hour of the day on 24-hour clock (midnight = 0,
  1375.                         noon = 12, 3 PM = 15, etc.)
  1376.           minute      - minute within the hour (0 to 59)
  1377.           second      - second within the minute (0 to 59)
  1378.           elapsed     - the number of seconds since January 1, 1970,
  1379.                         00:00:00 GMT.  This last value is useful for
  1380.                         computing the difference between two points
  1381.                         in time.
  1382.  
  1383.   - NEW FEATURE:  The parser now calls an additional method in
  1384.     each direct and indirect object under certain circumstances.
  1385.     These new methods are called dobjGen (general use of an object
  1386.     as a direct object) and iobjGen.  These methods are called
  1387.     immediately prior to the appropriate verXo<Verb> method.  The
  1388.     sequence of calls depends on the command, as detailed below.
  1389.  
  1390.     The purpose of these methods is to allow you to define a catch-all
  1391.     routine that is called whenever an object is used in a command.
  1392.     It is sometimes desirable to be able to take some action whenever
  1393.     an object is mentioned, regardless of the verb involved.  For
  1394.     example, you might wish to define a cursed object that damages
  1395.     the player (such as by taking away a treasure) whenever the
  1396.     object is touched or manipulated in any way; these new methods
  1397.     make it possible to do this without having to override every
  1398.     possible verb handler.
  1399.  
  1400.     When a command is issued with an indirect object, the parser
  1401.     checks to see if the indirect object *directly* defines the
  1402.     io<Verb> method.  If not, the parser calls iobj.iobjGen(actor,
  1403.     verb, dobj, prep).  The parser then checks to see if the direct
  1404.     object *directly* defines the verDo<Verb> method.  If not, the
  1405.     parser calls dobj.dobjGen(actor, verb, iobj, prep).
  1406.  
  1407.     When a command is issued with only a direct object, the parser
  1408.     checks to see if the object *directly* defines the do<Verb> method.
  1409.     If not, the parser calls dobj.dobjGen(actor, verb, nil, nil).
  1410.  
  1411.     Note that an object "directly defines" a method if the method
  1412.     is defined in the object itself -- that is, the object does
  1413.     not merely inherit the method from its class.
  1414.     
  1415.     These new methods have no return value, and need not do anything.
  1416.     If they're undefined, the behavior is exactly the same as in
  1417.     previous versions.  So, existing games should continue to run
  1418.     unchanged.
  1419.  
  1420.     The reason that these methods are not called when the object
  1421.     directly defines an appropriate verb handler is that these
  1422.     methods are intended as a generic catch-all verb handler.
  1423.     When a specific handler for the current verb is already defined
  1424.     in the object, there should be no need to call the generic
  1425.     handler, since the object already defines specific behavior
  1426.     for that verb.
  1427.  
  1428.  
  1429. 2.0.12  No such release (for internal release coordination)  bug fixes
  1430.  
  1431.   - Switch statements did not properly process all datatypes.
  1432.  
  1433.   - Assignment operations did not work correctly on list elements.
  1434.     For example:  l := [1 2 3]; l[2] += 5; did not properly leave
  1435.     the value of l as [1 7 3].
  1436.  
  1437. 2.0.11  12/20/92  bug fixes
  1438.  
  1439.   - Goto statement labels were occasionally not released properly,
  1440.     resulting in spurious internal errors.
  1441.  
  1442.   - The 'continue' statement did not work as documented in 'for'
  1443.     statements.  Instead of jumping to the re-initializer expression,
  1444.     as it now does, the 'continue' incorrectly jumped to the condition.
  1445.  
  1446.   - The run-time is slightly smaller and faster.
  1447.  
  1448.   - The compiler did not process locals correctly when multiple disjoint
  1449.     blocks within a function or method had locals, and a later block had
  1450.     fewer locals than a previous block (yes, it's a somewhat obscure bug).
  1451.  
  1452. 2.0.10  No such release (to synchronize with Mac release levels)
  1453.  
  1454. 2.0.9  12/12/92  MS-DOS bug fixes and new features
  1455.  
  1456.   - The file selector dialog displayed incorrect information when a
  1457.     directory name that used all 11 characters was displayed.
  1458.  
  1459.   - The file selector now saves and restores all default directory and
  1460.     disk information.  The current disk, and the current directory on
  1461.     each disk, will be the same when TR is terminated as it was when
  1462.     TR was first run.  (This applies to TDB as well.  It's particularly
  1463.     important for TDB, because TDB needs to have the source files in
  1464.     the current working directory if an absolute path was not specified
  1465.     with -I.)
  1466.  
  1467.   - NEW FEATURE:  the new user function commandPrompt, if provided by
  1468.     the user's game program, will be called prior to each player command.
  1469.     If the commandPrompt function is provided, the default ">" prompt is
  1470.     NOT displayed; if no commandPrompt function is defined, the default ">"
  1471.     is used.  This should not affect existing games at all, unless a game
  1472.     defines its own function, method, or property called commandPrompt
  1473.     having a different purpose.  The commandPrompt function returns no
  1474.     value.  The function takes a single argument:  a number, indicating
  1475.     the type of command that the system is prompting for:
  1476.  
  1477.        0  - normal command
  1478.        1  - command after invalid word (allowing "oops" to be used)
  1479.        2  - disambiguation (after "which x do you mean..." question)
  1480.        3  - command after askdo (after "what do you want to x?")
  1481.        4  - command after askio
  1482.  
  1483.     Note that the default prompt in all cases is simply ">", and in all
  1484.     cases a new command can be entered.  However, when the type code is
  1485.     2, 3, or 4, a question has just been displayed by the run-time, so
  1486.     the commandPrompt function may want to suppress any pre-command
  1487.     information or prompt text.  Case 1 is generally identical to case 0.
  1488.  
  1489.     NOTE:  As with the other optional user-provided functions, the
  1490.     compiler will issue a warning message if commandPrompt is not
  1491.     defined by your game.  If your game doesn't provide a commandPrompt
  1492.     function, you can ignore this warning.  The warning is provided so
  1493.     that, if you intended to provide a commandPrompt function, you will
  1494.     be informed if the compiler didn't find it (which could mean that
  1495.     you forgot to define it, or misspelled it).
  1496.  
  1497.   - NEW FEATURE:  A new built-in function has been added, which allows
  1498.     the game program to suppress the display of text that would normally
  1499.     be displayed with double-quoted strings or the say() function.  The
  1500.     function is called outhide(), and it takes one argument:  a flag,
  1501.     indicating whether to suppress or re-enable the display of output.
  1502.     If the flag is true, output is suppressed; if the flag is nil, output
  1503.     is re-enabled.  Any output that occurs between outhide(true) and
  1504.     outhide(nil) is discarded.  However, outhide(nil) returns a value
  1505.     indicating whether any output did in fact occur since the call to
  1506.     outhide(true); this allows you to determine if any output would have
  1507.     occurred, even though the output is not seen by the player.  Note
  1508.     that this is effectively the same mechanism used by the player command
  1509.     parser for noun disambiguation using the verDoXxx and verIoXxx
  1510.     methods, as described in the TADS author's manual.  There is no way
  1511.     to recover the text that was suppressed by outhide(); the text is
  1512.     simply discarded, so the only information available is whether any
  1513.     text was generated.
  1514.  
  1515. 2.0.8  12/03/92  (tc/tdb 2.0.7, tr 2.0.8) MS-DOS bug fixes and minor changes
  1516.  
  1517.   - The display initialization code was incorrectly attempting to clear
  1518.     a zero-line region of the display.  This resulted in extremely long
  1519.     delays on some computers (due to an incorrect BIOS call made by TADS).
  1520.  
  1521.   - NEW FEATURE:  When the keyword $$ABEND is typed as the entire command,
  1522.     the run-time immediately terminates and returns to DOS.  This emergency
  1523.     escape is provided so that TR can be terminated if the game somehow
  1524.     gets into a state where a more graceful exit is not possible.
  1525.  
  1526.   - The compiler did properly detect when an undefined object was used
  1527.     as the superclass of another object.  This generally resulted in
  1528.     unpredictable behavior during execution of preinit.
  1529.  
  1530.   - NEW FEATURE:  The parser now calls two new optional methods in the
  1531.     game program.  These new methods are intended to help speed up the
  1532.     identification of words when many objects have the same vocabulary.
  1533.     If the new methods are not present, behavior is the same as before,
  1534.     so existing games will run unchanged.  The new methods are validDoList
  1535.     and validIoList; they are associated with the "deepverb" object for
  1536.     the current command.  They are called with three parameters:  the actor,
  1537.     the prep, and the other object (indirect object for validDoList and
  1538.     direct object for validIoList; the value of the parameter will be nil
  1539.     if not applicable).  These methods are called prior to the disambiguation
  1540.     pass (using verDoXxx/verIoXxx), and prior to testing any objects with
  1541.     validDo/validIo.
  1542.  
  1543.     The return value of validDoList/validIoList is a list of all of the
  1544.     valid objects for the verb.  It is fine for these methods to return
  1545.     *too many* objects, since each object is still tested with validDo
  1546.     (or validIo) and the appropriate verDoXxx/verIoXxx methods.  Generally,
  1547.     these methods should simply return a list of all of the accessible
  1548.     objects in the actor's current location (or the actor's location's
  1549.     location), plus a list of all of the "floating" objects (which use
  1550.     methods for the location properties).
  1551.  
  1552.     An appropriate definition for validDoList in the deepverb object
  1553.     appears below:
  1554.  
  1555.        validDoList(actor, prep, iobj) =
  1556.        {
  1557.            local ret;
  1558.           local loc;
  1559.  
  1560.        loc := actor.location;
  1561.        while (loc.location) loc := loc.location;
  1562.        ret := visibleList(actor) + visibleList(loc)
  1563.               + global.floatingList;
  1564.        return(ret);
  1565.        }
  1566.  
  1567.     This same definition (with the name changed) is appropriate
  1568.     for validIoList in deepverb.  This returns a list of all of the
  1569.     objects visible in the current location, plus the global list of
  1570.     all floating objects; this should be a superset of the list of
  1571.     accessible objects in most games.  The only verbs that normally
  1572.     requires a different value of validIoList/validDoList are verbs
  1573.     such as "ask" and "tell" that allow any object (whether accessible
  1574.     or not) to be used as indirect objects; for these, simply use this
  1575.     definition:
  1576.  
  1577.        validIoList = nil
  1578.  
  1579.     This takes advantage of the reverse compatibility feature:  when the
  1580.     method returns nil, all objects with matching vocabulary are used.
  1581.  
  1582.     The one additional game change required to take advantage of this
  1583.     new feature is that global.floatingList must be built during
  1584.     initialization.  This can be done easily with the following loop:
  1585.  
  1586.        global.floatingList := [];
  1587.        for (o := firstobj(floatingItem) ; o ; o := nextobj(o, floatingItem))
  1588.           global.floatingList += o;
  1589.  
  1590.     This should be placed in the preinit or init function.  Note that
  1591.     all objects which have location methods should be declared to be
  1592.     of class floatingItem:
  1593.  
  1594.       class floatingItem: object;
  1595.  
  1596.     This class doesn't do anything except serve as a flag that an
  1597.     object should be placed in the floatingList.
  1598.  
  1599. 2.0.7  12/01/92  MS-DOS bug fix release
  1600.  
  1601.   - The run-time occasionally missed the \ in an escape sequence in
  1602.     output strings.
  1603.  
  1604.   - The run-time couldn't operate in 132 column mode.
  1605.  
  1606.   - The run-time abnormally terminated in the file selection dialog
  1607.     when the dialog box was exactly filled.
  1608.  
  1609. 2.0.6  11/24/92  first general MS-DOS TADS 2.0 release
  1610.  
  1611.