This version of code is based on the PernMUSH 1.15 code, formerly maintained by Moonchilde (JT Traub, jt1o@andrew.cmu.edu). It has been heavily modified by me in an attempt to increase compatibility with TinyMUSH 2.0 and to add many features. The file which follows is a detailed log of the changes. ------------------------------------------------------------------------------ January 14, 1992 -- Lydia Leong (lwl@eniac.seas.upenn.edu) Release level 1.16 -- Probable last release of the PernMUSH code. The 1.x code family will be maintained by T'nor, and will be known as SC-MUSH 1.0. That code is based on PernMUSH 1.15, although it incorporates most of the features in this release. A similar but different code, which diverged from the main PernMUSH line at version 1.13, is Spellbound MUSH 1.0 -- New functions * CAPSTR() -- returns a string with the first character capitalized * FLIP() -- reverses a string * HASFLAG() -- checks if an object has a certain flag * LCSTR() -- returns a string all in lowercase * LNUM() -- creates a number list (i.e. LNUM(4) outputs 0 1 2 3) * NEARBY() -- checks to see if two objects are "nearby" each other * UCSTR() -- returns a string all in uppercase * From the 2.0 code: DIST2D() and DIST3D() -- returns the distance between points WORDPOS() -- returns the word number a character position occurs * LWHO() -- returns a list of connected players' dbrefs. This function courtesy of Tim Poe (raven@ccwf.cc.utexas.edu) -- New flags * IMMORTAL -- wiz-settable flag which prevents objects from being killed * NO_TEL -- prevents teleports from a room. Useful for puzzles. * SAFE -- prevents destruction of an object. * SUSPECT -- wiz-settable flag which reports the connects, disconnects, name changes, kills, and attempted kills from a suspect player. * TERSE -- suppresses room descriptions and succ/fail messages for objects with this flag. Useful for moving through areas quickly. -- New commands * @nuke -- overrides the SAFE flag. * @lemit -- "location emit" which sends a message to the outermost container (always a room) of an object. * @wallpose and @wallemit -- allow poses and emits in walls. The format of @walls has been changed to prepend "Announcement:" to the message. @wallpose may be abbreviated to "@wall :<pose>" * @decompile -- dumps the sequence of commands needed to create an object. * @dolist -- courtesy of Tim Poe (raven@ccwf.cc.utexas.edu - thanks!) Repeats commands for a list (see the help for details). -- New features * @move/@omove/@amove -- attributes executed whenever an object moves. * Enter locks -- objects now have a separate lock which governs whether or not the object maybe entered. The ENTER_OK flag overrides the lock. The @efail/@oefail/@aefail attributes are executed if the lock is not passed. These locks are controlled by @elock/@eunlock. * Page locks -- players have a page lock. If a target player is pagelocked against his pager, he is treated as if he were HAVEN to that player. * Page return -- an @idle message is automatically page-returned to a successful page. If a player is HAVEN or his pagelock failed, his @haven message is sent. If a player is not connected, his @away message is sent. * Enter/leave aliases -- objects now have @ealias and @lalias attributes which do the obvious. So you can have "sit down" instead of "enter chair" and "stand up" instead of "leave", etc. * Global commands -- objects and exits in a Master Room are treated as global. This is compile-time configurable. * Lastsite attribute -- keeps track of site player last connected from. -- Fixes and changes to old commands * Whisper-pose -- "whisper <person>=:<pose>" now works. * @ps -- the number of items in the queue is now counted. @ps count" displays just the totals. * @halt -- fixed to allow wizards to do "@halt <player>", and to allow "@halt <object>" to be used as an alias for "@set <object>=HALT". * A bunch of fixes to quota Fixed @quota so it no longer crashes the MUSH. (Bleah!) Fixed @clone so it now checks quotas. Rewrote the help (it was inaccurate) * Fixed some minor screwups in ROYALTY, and changed it to allow wizards to set players royal, and royal players to set their objects royal. Did some cleanup work on "do_examine" and related functions so examine for ROYALTY actually works. (Grrrr.) * Did some cleanup on "kill", fixing some bugs. @death/@odeath/@adeath now works properly. * Added a "nearby" function to predicates.c which checks if two objects are near each other. Fixed LOC() so it works the way the help says. * Added a "find_flag" function to predicates.c which compares player input to the flag list and comes up with a match. Rewrote "do_set" to use this (the new HASFLAG() function also uses it). * can't @destroy master room, need to use @nuke to destroy players * NO_TEL now checks "absolute" location for NO_TEL flag * %p, %s, and %o now return "its/it/it" for no-gender objects * @boot now shows that someone kicked you off * @shutdown notifies all players that a wizard did a @shutdown * @toad command must be typed in full * @emit and @oemit no longer show "You emit/You oemit" to the player giving the command, but just echo the message * Bug fix to do_set so flags which are different for different types don't clobber each other * Various minor bugfixes * "help @-commands" split into several sections. Some cleanup of help. -- See "help" for details. If you have problems, contact me (Amberyl) or T'nor (raven@ccwf.cc.utexas.edu) on the MUDs or via email. ---------------------------------------------------------------------------- January 31, 1992 -- Lydia Leong (lwl@eniac.seas.upenn.edu) Release level 1.17 -- New functions * ART() -- returns the appropriate article "a" or "an" * MAIL() -- function to return a mail message * MAX() -- returns largest number in list of up to 10 arguments * MIN() -- returns smallest number in list of up to 10 arguments * OBJ() -- perfoms objective pronoun substitution * POSS() -- performs possessive pronoun substitution * RNUM() -- like NUM(), but on a remote room. Only defined if the master room is configured (for use with globals) * SUBJ() -- performs subjective pronoun substitution * TYPE() -- returns the type of an object * XGET() -- works like get(), but can have nested arguments, and uses a comma instead of a slash to separate its arguments. Basically this is just a nasty hack to overcome a lousy parser -- New flags * INHERIT -- restricts @force/@set/@trigger (read the help) * VERBOSE -- prints an object's command before executing it -- New commands * @config: shows configuration parameters for the MUSH * DOING: for wizards, gives the player WHO list. @doing messages do not show up in wizard WHO, so wizzes don't get spammed by the list. * @mail: hardcoded mail, courtesy of Joarm/Spellbound MUSH * @poll: sets the @doing poll * @rwall/@rwallpose/@rwallemit: allows Royalty to broadcast to wizards and royalty, in a fashion similar to @wizwall -- New features * Uselocks implemented as a superset of pagelocks. The commands have been changed to @ulock/@uunlock. A uselock applies to "use" of the object, as well as triggering $commands on it * @use/@ouse/@ause, triggered by "use", added * Old "@use" command changed to "@use-does", for backward compatibility * Inactivity timeout, compile-time settable * Guest character, who cannot change name or password, or build This is compile-time configurable * Added %b and %t substitutions (blank space and tab) * Attributes may have a ^ pattern similar to $command patterns. These act like multiple @listen patterns and are triggered under the same criteria as an ahear. For example, @va object=^* has arrived.:"Hi. would match "Amberyl has arrived." and the object would say Hi. These are only matched if no @listen exists. * added announce.c to the distribution package -- Changes to existing commands * test_set changed to allow '&' to be used for user-defined attributes, for compatibility wth 2.0 code * @decompile now distinguishes between normal and user-defined attributes, and uses '&' for user-defined * @search now does a count of objects. * changed enterlocks so that to enter an object, you must both pass the lock and the object must be enter_ok * @pemit and whisper now match objects in the player's possession as well as the player's container. * need to use @nuke to destroy a wizard object. * @doing and @poll now tell you how many characters got truncated from your message, if it was too long. * @clone will now do exits * if a @listen is not found, the game will now check for ^ patterns in attributes, which act like an ahear. -- Fixes and other sundries * fixed a bug which caused a coredump if you attempted to look at a TRANSPARENT exit linked to *HOME*. * home(exit) now returns that exit's source room * examine now reports an exit's source * exits linked to home now send an object home * new matching functions for remote rooms * successfully teleporting something to an exit no longer shows that stupid "imposes his will on yours" message * fix to ucstr and lcstr to add terminating '\0' (stupid mistake) * safe_tel fixed to avoid conflict between BUILDER and KEY, and to avoid sending STICKY objects home if their home is the teleporting object * @boot fixed so wizards can't boot themselves. * THING_SAFE, PLAYER_SUSPECT, and ROOM_NO_TEL moved from 1000000 to 4000000, for compatibility with SC-1.0 code. * changed do_examine to match exits first, for 2.0 consistency, changing it back from an earlier fix. Note that 2.0 plans to change the order in the future. This makes examine consistent with the other commands which do name-matching. * changed do_destroy to always notify player when room is destroyed * added a "flag" to unparse_boolexp, so that you can get a "basic" unparse: only dbrefs and tokens (i.e. exactly what you'd need to type to lock that object to that key). Added the ability to decompile locks, and changed LOCK() to use unparse_lock instead of unparse_boolexp * @chown now removes the Royalty flag. * abilities of royalty expanded to be consistent. They have full wizprivs wrt. examining and teleporting but cannot change things - they see the wizard WHO (since they can examine a player for Lastsite and location anyway), use LWHO(), GET(), V(), LCON(), etc. as if they were wizards. New macro added "Hasprivs", which is true for royalty or wizard or God, getting rid of most of the #ifdef ROYALTY_FLAGs in the code. * @newpassword, @boot, @nukes of players, @toad, @pcreate, and all all commands from SUSPECT players are logged * Log highlights wizard forces of objects they don't own * PUPPET is now THING_PUPPET * global exits, ealiases, and laliases can be more than one word long * NO_TEL is now determined by the location of the victim not the location of the player trying to do the teleport ---------------------------------------------------------------------------- February 8, 1992 -- Lydia Leong (lwl@eniac.seas.upenn.edu) -- Update 1.17.01 Code released in update distributions has not been extensively tested. Use at your own risk. -- New functions * ALPHAMIN() and ALPHAMAX() -- return the smallest/biggest word, lexicographically, in a comma-separated list of up to 10 arguments * LSEARCH() -- similar to @search, returns a list of dbrefs * OBJ() -- returns the objective pronoun of an object * POSS() -- returns the possessive pronoun of an object * SORT() -- lexicographically sorts a comma-separated list of up to ten arguments, returning a space-separated list of words * SUBJ() -- returns the subjective pronoun of an object * TYPE() -- returns the type of an object * ZONE() -- returns the zone of an object -- New commands * brief -- like "examine", but does not display attributes * @chzone -- change zone of an object * @chzoneall -- change zone of all objects belonging to a player * use -- use an object, triggering @use/@ouse/@ause * @zemit: emit to all rooms in a zone -- New features * Uselocks on objects allow only those that pass the @ulock to use them. This provides for a secure way to get around the problems with INHERIT, and regular security problems, since @ulocks also block $commands from unauthorized users. * @use/@ouse/@ause attributes added, triggered by "use" command. The old "@use/@does" pair is preserved as "@use-does/@does", for backward compatibility. * Zones implemented. Please see the help for details. Anyone who passes the enter lock of a zone object controls all objects in that zone - i.e. has the equivalent of wizard privs in that zone. In addition to regular command matching, you also match commands in the zone of your current room, and your person zone. These are $commands on the master object for the zone. This matching occurs between regular $command matching and global matching. -- Fixes and other changes * fixed some minor bugs * ELOCK() no longer requires player to control either object being evaluated by the function. * @chown and related commands now remove the INHERIT and ROYALTY flags. * @search (and LSEARCH) now allow class restriction "zone". * fixed bug which allowed wizards to set objects they didn't own WIZARD (this should be a god-only priv) * if an object pages a NOSPOOF player, the object's number appears before the message, in a fashion similar to NOSPOOF-flagged emits.