*
* Modification History
*
* Where a contibutor's code has been included, the contributor's
* name appears in an accompanying comment.
*
* When someone reports a bug and I fix it, I now label the explanation
* of the fix in the modification history with the bug reporter's name.
*
* If you have contributed and I have left your name off, send me
* mail and I'll add you. I do not intened to slight anyone, but
* I do make mistakes.
*
* Initials:
* dmb David M. Baggett
* djh David Haire
*
*-------------------------------------------------------------------------
*
* 9-Nov-93 dmb Started.
* 16-Feb-94 dmb Deemed worthy of "version 1.0" monnicker.
* 28-Feb-94 dmb Got rid of vocabulary in classes. Having them
* there confuses the disambiguator, thereby
* causing "Which button do you mean, the launch button,
* or the launch button?" type problems.
* 13-Mar-94 dmb Extended verb requirements to include prep.
* 1-Jun-94 dmb Changed listcontentsX -- added "alwaysname" method
* to listable sounds, etc. so that things that
* don't appear in visual listings can still be
* named (instead of being referred to as "something").
* 22-Aug-94 dmb A few minor bugs fixed.
* 5-Sep-94 dmb Added 'inside' and 'outside' to inPrep and outPrep.
* Added doEnter and doExit to Chair and Ledge.
* Added _here_ parameter to listcontentsX to fix
* bug with Nestedroom.
* 6-Sep-94 dmb Changed the definition of doDefault and ioDefault
* in Verb to handle Nestedrooms better.
* Updated some verb's vocabulary to extend the set of
* prepositions allowed. (E.g.: lookinVerb)
* 7-Sep-94 dmb Added global.searchisexamine.
* 13-Sep-94 dmb Revised Chair and Stool again.
* 18-Sep-94 dmb Moved some code from init to userinit. This code
* handles the standard game start tasks, like
* printing the room description for the player's
* initial location. The old code didn't work with
* initial locations that were Nestedrooms -- the
* new code does.
*
* As a result, the procedure now is to *replace*
* userpreinit and userinit -- before they weren't
* provided at all. Second, there is no requirement
* that the starting location be called "startroom";
* the default userinit routine just looks at the
* location, locationtype, and position fields of
* Me to figure out where the player starts out.
* [v1.1]
* 24-Sep-94 dmb Added doAction = 'Lock' to lockVerb.
* Added doAction = 'Unlock' to unlockVerb.
* Changed "I can't imagine what you're referring to."
* in Verb.cantReach to "You don't know what that is."
* Changed Thing.isknownto slightly.
* Changed Player.passgen to better handle "actor, take
* item from me" and related commands.
* Added allowedverbs to Distant.
* Added roomdescprop to Ground, Walls, and Ceiling.
* Fixed bugs in Attachpoint that prevented plugable
* and tieable from working properly.
* Put commas in lists where necessary to disambiguate
* & operator, for TADS 2.2.
* [v1.1.1]
* 28-Sep-94 dmb Removed no-longer-needed XOuthide function.
* Debugverbs are now disabled unless global.playtesting
* is set to true. Cleaned up the standard Debugverbs
* a bit.
* Updated maxinlist and mininlist to return nil when
* given an empty list or nil.
* Improved comments in the first third of the file.
* [v1.1.2]
* 1-Oct-94 dmb Added code to print "(trying to ___ the ___ first)"
* when a verb requirement fails. E.g.,:
*
* >eat key
* (trying to take the key first)
*
* The key is stuck in the lock.
*
* [v1.1.3]
* 11-Oct-94 dmb Separated out most of the code in die and moved
* it to end, which is useful for demos, where you
* have to end the game, but not because of player
* death.
* 12-Oct-94 dmb Spell-checked all double quoted text and fixed
* the typos.
*
* Added a check for global.silentincscore to incscore.
* By setting global.silentincscore to true, you can
* disable the WorldClass default behavior, which is
* to tell the player when his score has gone up.
*
* Made changes to allow footnotes with predefined
* numbers (i.e., hardcoded footnum values) to
* coexist peacefully with footnotes numbered at
* run-time. (Previously, the run-time footnote
* number could assign a number that was already used
* by a "hand-numbered" footnote.)
*
* Added methods smellaround, listenaround and
* feelaround to Room. Nestedroom overrides these.
* These are called when the player types "smell"
* "listen" and "feel" (or "feel around") without
* a direct object. This change fixes a bug, where
* listable sounds etc. would not get listed if
* the player "listen"'ed while in/on a Nestedroom.
*
* Added new class Floor, for use when you want
* to do something fancy with the floor that Ground
* can't handle. Ground now inherits from Floor.
* Added roomdescprop to Everywhere.
*
* Nestedroom now passes ground, ceiling, and walls
* methods to its parent location. I.e., Nestedrooms
* have the same ground, ceiling, and walls as their
* containing Rooms.
* [v1.1.4]
* 16-Oct-94 dmb Fixed a bug where "if (isclass(obj, Floor))"
* was run in verDoTakeX even if obj was nil.
* Corrected bogus reference to global.turnsofar.
* Changed note function to return the empty
* string so it can be used in <<...>> expressions
* within double quotes.
* [v1.1.5]
* 25-Oct-94 dmb Added verDoBreak to Thing. Fixed a typo in
* Thing.verIoCleanwith. [Tom Koelman]
* [v1.1.6]
* 2-Nov-94 dmb Fixed a typo in Ledge.doEnter. [Duncan Anker]
* 5-Nov-94 dmb Added eatdesc to Edible.
* Added pullable and moveable to Switch.
* Added &cantouch to global.senses -- this is
* the list of senses used when an action fails,
* so that WorldClass can say "(trying to X the Y)"
* to let the player know which "atomic" action
* failed.
* Added a clause to Item.doTake to allow the
* command "take X" or "take X <prep> Y" when the
* actor already has the Item, but the Item is not
* in the player's top level contents (i.e., not
* merely in a container the actor's carrying).
*
* *** Last version for TADS 2.1 ***
*
* [v1.1.7]
* 6-Nov-94 dmb Changed Room.statusLine to elide status lines
* that are longer than global.statuslinewidth
* with an ellipsis.
* Added [ver]DoClose [ver]DoOpen to Desk.
* [v1.1.8]
* 7-Nov-94 dmb Added check for obj = nil in Thing.blocksreach.
* Added actor parameter to Edible.eatdesc.
* Further revised Edible, and similarly revised
* Drinkable.
* Added multisdesc to Thing -- this just prints
* the sdesc text highlighted.
* Added #pragma C- at top of file.
* Added any = either to specialWords.
* Added Thing.construct and Thing.destruct to
* support dynamic objects.
* 9-Nov-94 dmb Removed actor parameter from message printed
* by Thing.verDoLookon to eliminate incorrect
* reflexives.
* Added to comment preceding Desk.
* Cleaned up Verb.checkCommon a bit.
* Corrected capitalization error in
* swVerb. [Paul Gilbert]
* 11-Nov-94 dmb Created CASE_INSENSITIVE flag. (But you can't
* actually compile this file in case insensitive
* mode yet.)
*
* Added support for indistinguishable objects:
* - Thing.listprops ........ created
* - Thing.listdesc ......... modified
* - Thing.listpluraldesc ... created
* - Thing.pluraldesc ....... created
* - listcontentsX .......... modified
* - indistinguishable ...... created
* - saynum ................. created
*
* NOTE: Users must override pluraldesc for
* words like "box", "watch", etc. whose plurals
* are not formed by appending an "s".
*
* Two Things are indistinguishable (and will hence
* be listed as a unit with prepended number) if
* both have the same immediate superclass and
* both have isequivalent set to true. (Actually,
* it's not quite this simple -- look at the
* indistinguishable function for details.)
*
* NOTE: There seems to be a bug in TADS that prevents
* the new code from being very useful. So don't
* expect it to work right just yet.
*
* Removed old listcontents code. (This code is now
* archived in the 1.1.7 freeze code.)
* Added a comment explaining Thing.seecontX and related
* methods.
* [v1.2.0]
* 12-Nov-94 dmb Added nondeterministic = true to global to make
* the random number functions really random by
* default.
*
* New feature: You can now use Thing.movingout and
* Thing.movingin to monitor movement of objects
* in and out of containers. This makes it
* easy to define, for example, a magic box that
* curses every item moved into it (by any means),
* or a pedestal that triggers a trap when enough
* weight is taken off of it.
*
* Note also that Thing.moveinto now returns a
* boolean indicating whether or not it succeeded.
* This is just for robustness; you should not
* have moveinto fail for any reason but an error.
*
* Implementing this feature involved the following
* changes:
*
* - Thing.movingin ............ created
* - Thing.movingout ........... created
* - Thing.moveinto ............ modifie
* - Thing.notifycontainers .... created
* - Holder.ioPutX ............. modified
* - Attachable.moveinto ....... modified
* - Attachable.doAttachto ..... modified
* - Clothing.moveinto ......... modified
* - Clothing.doWear ........... modified
* - Actor.moveinto ............ modified
* - Chair, Ledge, Stool:
* doEnter, doGeton ....... modified
*
* Added verDoLock and verDoUnlock to Thing.
* Changed the Lockable class to support these
* new methods. IMPORTANT: Previously, setting
* key = nil in Lockable meant that the Lockable
* could not be unlocked or locked. Now this
* means that the Lockable *can* be locked and
* unlocked, and without any key.
* [v1.3.0]
* 13-Nov-94 dmb Fixed a bug in Thing.construct. [Mike Roberts]
* 15-Nov-94 dmb Fixed verSouthwest -> verGoSouthwest and
* verDown -> verGoDown.
* 19-Nov-94 dmb Fixed a typo in Actor.speech_handler.
* [Adam Thornton]
* 21-Nov-94 dmb Fixed a serious bug in Thing.moveinto.
* [v1.3.1]
* 7-Jan-95 dmb Moved meat of preparse into WorldClassPreparse.
* [v1.3.2]
* 10-Feb-95 dmb Added call to upper() in indistinguishable
* to make the comparison ignore case.
* [Carl Muckenhoupt]. [v1.3.3]
* 2-May-95 dmb Trivial change to warnsave for better formatting.
* [v1.3.4]
* 25-Apr-96 dmb Typo in Door fixed. [v1.3.5]
* 15-Nov-96 dmb Fixed a bug in Clothing.doWear. [Patrick Kellum]
* [v1.3.6]
* 7-Apr-97 dmb Fixed a typo affected doors that can be locked with
* no key. [Shay Caron]
* 21-Jul-98 djh Unofficially took over maintenance from dmb.
* Fixed a bug in listcontentsX that listed more than
* one indistinguishable item with 'is here.' if nothing
* else was listed in the room.
* 25-Jul-98 djh It's now official.
* Fixed another bug in listcontentsX. If there were more
* than one set of indistinguishable items to be listed,
* they were being listed with the wrong quantities.
* [v1.3.7]
* 2-Aug-98 djh Replaced all occurrences of 'Me' with the TADS
* 2.2.4 function parserGetMe().
* Added new functions initRestore() and initCommon(). Any
* game-specific initialisation should be placed in
* initCommon() rather than in userinit(). Note that
* contrary to the TADS release notes, initRestore() is
* called AFTER init() rather than instead of it, unless the
* game is compiled with the '-ds' option.
* Moved code from userinit() into gameinit(). All
* userinit() does now is call gameinit(). If you replace
* userinit(), you should ensure that your replacement
* either calls gameinit() or provides the same
* functionality.
* Moved code from restoreVerb.soloaction into
* mainRestore(). This function is called both by the
* restore command and when a save game is specified on the
* command line.
* Added HTML enabling hook to init().
* Modified Room.statusLine for HTML compatibility.
* 7-Aug-98 djh Added version tracking information to the library.
* [Jeff Laing]
* All WorldClass extension modules should contain an entry
* called xxxVersion, where xxx is a unique identifier for
* the extension module. This should have a class of
* versionTag, and should contain three properties:
* id: A double-quoted string giving the module's
* version and date.
* author: The name of the person who created the
* module.
* func: A short description or title of the module.
* The versionTag for the version tracking routines has been
* included in WorldClass, so you can use that as a
* template.
* Added direction lists to global to enable modules such as
* 'actors' and 'goto' to access them without having to
* ensure that they are defined. Useful if you want to
* include both of these modules.
* Added global.justTesting. Functions that call verGoX and
* goX direction methods in order to determine if travel is
* possible in a certain direction should set this flag to
* 'true', and reset it to 'nil' when finished. Direction
* methods (goX) should check the value of
* global.justTesting before modifying the game state in any
* other manner than moving the actor to a new location.
* Added the autosave function that was written by Paul
* Gilbert. This routine replaces the warnsave function.
* By default, autosave will be off. It can be turned on/off
* with the command 'autosave on' or 'autosave off', and the
* time between saves can be set with 'autosave xx', where
* xx is the number of WorldClass ticks between saves. It
* will ask for a filename the first time, and then use that
* continually.
* Added 'look out of' and 'look out' to the verb list for
* lookthroughVerb.
* 11-Aug-98 djh Added HTML hook to change the display colors when
* the player enters a particular room. The property
* 'bgcolor' controls the background color in each room, and
* the property 'textcolor' controls the foreground color.
* If one of these properties is not defined, the relevant
* default color will be used.
* Fixed bug in Item.verDoPutX that returned an "object
* required" error if the player entered "put" with no
* direct or indirect objects. [Shay Caron]
* Fixed bug in Ledge that prevented you from lying on the
* ledge if you were already sitting on it, and vice versa.
* [Shay Caron]
* Fixed bug in Floor that told the player "You can't get
* off of (the player's location)." when he or she was
* standing and tried to get on the ground. [Shay Caron]
* Corrected typo in verDoAskFor that printed the indirect
* object in "You can't ask (x) for anything." (Should be
* the direct object). [Shay Caron]
* Fixed bug in 'give x to y' which produced the message
* "You can't do that, because you can't put anything the
* (y)." (Missing preposition)
* 13-Aug-98 djh Added code to prevent the room description from
* being displayed by actor.travelto(room) unless the actor
* doing the travelling is the player (parserGetMe()).
* [Jason Noble]
* Added commandPrompt() and commandAfterRead() functions.
* All the former does at present is turn emboldening on and
* display the '>' prompt before the command is entered, and
* the latter turns emboldening off again after the command
* has been entered. Replace these functions with your own
* as required.
* Rewrote the initRestore() routine so that it will not
* duplicate work performed by init() if it is called after
* init(). The property global.initcalled is used to check
* whether the init() function has been called. When the
* runtime is fixed so that initRestore() is called instead
* of init() when a saved game is specified on the command
* line, this property may be used to determine whether a
* saved game was restored at startup, if required
* (initcalled will be nil).
* 19-Aug-98 djh Added preparseCmd function. This function simply
* calls another function (WorldClassPreparseCmd), which
* will convert commands in the form "tell <actor> to
* <command>" and "ask <actor> to <command>" to the standard
* format "<actor>,<command>". To include your own code in
* preparseCmd, simply replace it and call
* WorldClassPreparseCmd after your code.
* 20-Aug-98 djh Fixed minor typo in 'maxinlist' and 'mininlist'.
* Minor alteration to listcontentsX to list fixtures and
* actors separately. The listing of actors is now no longer
* dependent on the listing of fixtures.
* Various cosmetic changes to 'Thing', primarily to shorten
* the listing.
* Added class 'Qopenable' for an Openable that does not
* list its contents in a room description.
* Corrected typo in Player.sleepmessage.
* Added 'get outfromunderneath' as a synonym of
* getoutfromunderVerb.
* Added more synonyms to climbVerb.
* Added 'desc' property to verbs that have a plural that
* isn't simply a case of adding an 's'.
* Added 'Openwith' action to openVerb to allow "open <x>
* with <y>".
* [v1.4.0]
*
* 18-Jan-99 djh It's been a while. I've been kinda busy.
* Moved versioninfo() from init() into gameinit(), so that
* it is displayed after the introduction. As gameinit() is
* only called when a new game is started, versioninfo() is
* also called from initRestore().
* Version 2.2.6 of the interpreter has fixed the
* initRestore() bug that caused init() to be called as
* well. It now works as stated in the release notes.
* Modified Room.enter(actor) to set the text and background
* colours only if they are stated in the room attributes.
* [Shay Caron]
* Corrected verification routine names in outVerb,
* downstreamVerb and jumpVerb. [Shay Caron]
* Added code to Actor.travelto to make the actor and
* everything the actor is carrying known to the player when
* the actor is moved into the player's location.
* 1-Apr-99 djh Added new version of verifyinsertion() to the
* holder class to provide a more realistic handling of
* maximum bulks and weights for containers. The function
* recurses through the hierarchy of containers to ensure
* that none of the maximums are exceeded.
* Added the property 'fullscore' to global.
* Added a new score routine that lists the percentage of
* rooms and items that the player has seen. This is
* conditioned on the new 'fullscore' property. To override
* the basic score routine, replace or modify
* old_score_and_rank() rather than score_and_rank().
* Added 'look through' methods to the Transparent class to
* allow objects defined with this property to be looked
* through.
* Added the moveinto() function to the Part class to sever
* the connection between the part and its parent if the
* part is moved.
* Added 'lift' and 'raise' as synonyms for moveVerb.
* Corrected a couple of grammatical errors in
* Lockable.doLock. [Shay Caron]
* Added code to commandPrompt and commandAfterRead to
* switch to the TADS-Input font for the player's input then
* revert to the original font for output.
* Added new prompt parameters to the askfile() function.
* These let you specify what type of prompt to show and
* what type of file to request. These new arguments are
* hints to the system-specific code that displays the "open
* file" dialog; by specifying this new information, you
* help the system code show the correct type of dialog.
* Added new global properties 'datedisp', 'timedisp',
* and 'scoredisp' to determine whether the current date,
* current time, and score information are displayed in the
* status line. Any combination is allowed, the default is
* to display just the score and turns.
* [v1.5.0]