This is patch08 to PennMUSH 1.8.1. After applying this patch, you will have version 1.8.1p8 To apply this patch, save it to a file in your top-level MUSH directory, and do the following: patch -p1 < 1.8.1-patch08 make clean make install If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1', not just 'patch -p1'. Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c, hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically rebuilt on compile. On the off chance they appear not to be, simply rm them and re-run make. Then @shutdown and restart your MUSH. - Alan/Javelin In this patch: Attributes: * New 'AAHEAR' and 'AMHEAR' attribute flags, when set on an ^listen attribute, cause it to behave like @aahear or @amhear respectively, instead of like @ahear. Suggested by Jules@M*U*S*H. Patch by Talvo@M*U*S*H. * New UNIMPLEMENTED_COMMAND command handles commands that are known but not implemented (currently just @SQL). By default, produces a standard message, but can now be @hooked, etc. Suggested by Talvo@M*U*S*H. [TAP]. * @conformat and @invformat are now passed a |-delimited list of object names, unparsed in the default fashion, as %1. Patch by Talvo@M*U*S*H. Functions: * default() can now take any number of obj/attr cases. Suggested by Nathan Baum, patch by Talvo@M*U*S*H. * lwhoid(), mwhoid(), xwhoid(), xmwhoid() work like lwho(), etc. but return objids instead of dbrefs. Patch by Talvo@M*U*S*H. * stringsecs() converts timestrings to seconds. Patch by Talvo@M*U*S*H. Minor changes: * %u is now set to the evaluated typed $command (when a $command is matched) and is available to locks. Suggested by Jules@M*U*S*H, patch by Talvo@M*U*S*H. * Rooms reachable from FLOATING rooms are now considered topologically connected, just like rooms reachable from the base room. Patch by Nathan Baum. * %i0-%i9 evaluates to itext(0)-itext(9) for convenience in iter(). Suggested by Nathan Baum. Patch by Talvo@M*U*S*H. * When safer_ufun is on, you must control an object to @function an attribute on it. This prevents, e.g., mortals with @function power from making attributes on wizard objects into @functions. Suggested by Talvo@M*U*S*H. * Internal eval_lock_with function added to support passing special %0/%1 values to lock evaluations. Suggested by Malix@8bit. * Improved @uptime display by Ambrosia@M*U*S*H. * Players may @search a ZMP if they pass the zone lock. Patch by Talvo@M*U*S*H. Fixes: * cbuffer() crash fixed. Report by qa'toq@ST:Foundations. [GM] * regex crash bug fixed. [GM] * insert() added an extra delimiter when inserting at end of list. Report by Sangman. [SW] * make distclean is more thorough. Patch by Ranmir@M*U*S*H. * EQSPLIT commands with no equal sign that were hooked were passed to the hook attribute with an equal sign (and nothing to the right). Fixed. Suggested by Talvo@M*U*S*H. * zwho/zmwho can now be used by see_all players on any zone. Suggested by Talvo@M*U*S*H. * crecall() now accepts 1 or 2 arguments, as promised. Report by Sketch@M*U*S*H. * attrib_set(obj/attr,) sets the attribute to a single space when EMPTY_ATTRS is off. Patch by Talvo@M*U*S*H. * Portability fix in fun_speak. [EEH] * Fix to TZ parsing in src/funtime.c by Jules@M*U*S*H. * Fix to speak() for fragments of speech by Talvo@M*U*S*H based on report by Trelane@M*U*S*H. * Typo fixes in game/aliascnf.dst by Talvo@M*U*S*H. * Help fixes by Talvo@M*U*S*H, Sketch@M*U*S*H. Prereq: 1.8.1p7 *** 1_8_1.311/Patchlevel Fri, 31 Mar 2006 19:32:21 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.51 600) --- 1_8_1.336(w)/Patchlevel Sun, 11 Jun 2006 07:27:12 -0500 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.52 600) *************** *** 1,2 **** Do not edit this file. It is maintained by the official PennMUSH patches. ! This is PennMUSH 1.8.1p7 --- 1,2 ---- Do not edit this file. It is maintained by the official PennMUSH patches. ! This is PennMUSH 1.8.1p8 *** 1_8_1.311/game/txt/hlp/penntop.hlp Mon, 10 Apr 2006 12:15:53 -0500 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.12.1.1.1.1.1.8.1.11.1.1.1.3.2.1.1.1.1.1.1.1.1.1.1.1.1.3 600) --- 1_8_1.336(w)/game/txt/hlp/penntop.hlp Sat, 03 Jun 2006 20:44:11 -0500 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.12.1.1.1.1.1.8.1.11.1.1.1.3.2.1.1.1.1.1.1.1.1.1.1.1.1.7 600) *************** *** 225,231 **** The following functions support anonymous attributes: filter() filterbool() fold() foreach() map() ! mix() munge() sortby() step() & ATTRIB-OWNERSHIP ATTRIBUTE OWNERSHIP --- 225,231 ---- The following functions support anonymous attributes: filter() filterbool() fold() foreach() map() ! mix() munge() sortby() sortkey() step() & ATTRIB-OWNERSHIP ATTRIBUTE OWNERSHIP *************** *** 551,559 **** order of possible commands: Special game commands: WHO, QUIT, etc. ! Single-token commands: ", :, ;, + Exits in the room ! @-commands Regular game commands: get, inventory, etc. Enter aliases Leave aliases --- 551,559 ---- order of possible commands: Special game commands: WHO, QUIT, etc. ! Single-token commands: ", :, ;, +, \, # Exits in the room ! @-commands and &attribute setting Regular game commands: get, inventory, etc. Enter aliases Leave aliases *************** *** 804,813 **** (continued in help listening3) & LISTENING3 ! Please note that an object CANNOT trigger its own ^-patterns, so they ! work like @ahear rather than @aahear or @amhear. (Note that the ! triggering object is whatever happens to be %#, so, for example, when ! you @set an object MONITOR, you are %# with regard to the "Object is now listening" message, and this message can be picked up with an ^pattern.) --- 804,814 ---- (continued in help listening3) & LISTENING3 ! By default, ^-patterns work like @ahear. To have them work like ! @amhear, set the AMHEAR attribute flag on the attribute; to have ! them work like @aahear, set the AAHEAR attribute flag on the attribute ! (Note that the triggering object is whatever happens to be %#, so, for ! example, when you @set an object MONITOR, you are %# with regard to the "Object is now listening" message, and this message can be picked up with an ^pattern.) *************** *** 1620,1625 **** --- 1621,1627 ---- %! = the dbref number of the object the command is on. %L = the dbref of the ENACTOR's location. %c = text of the last command, _before_ evaluation. + %u = text of the last $command, after evaluation, available to locks. %? = The current function invocation and depth counts. %+ = The number of arguments passed to the current ufun. %qN = the equivalent of r(N), a register set by a setq() function. *** 1_8_1.311/game/txt/hlp/pennfunc.hlp Mon, 10 Apr 2006 12:15:53 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.26.1.1.1.1.1.1.1.23.1.2.1.10 600) --- 1_8_1.336(w)/game/txt/hlp/pennfunc.hlp Sun, 04 Jun 2006 09:51:16 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.26.1.1.1.1.1.1.1.23.1.2.1.16 600) *************** *** 109,117 **** cmds() conn() doing() height() hostname() hidden() idle() ipaddr() lports() lwho() ! mwho() nmwho() nwho() ports() pueblo() ! recv() sent() ssl() terminfo() width() ! xmwho() xwho() zmwho() zwho() & Dbref functions Dbref functions return a dbref or list of dbrefs related to some value on an object. --- 109,118 ---- cmds() conn() doing() height() hostname() hidden() idle() ipaddr() lports() lwho() ! lwhoid() mwho() mwhoid() nmwho() nwho() ! ports() pueblo() recv() sent() ssl() ! terminfo() width() xmwho() xmwhoid() xwho() ! xwhoid() zmwho() zwho() & Dbref functions Dbref functions return a dbref or list of dbrefs related to some value on an object. *************** *** 214,220 **** convsecs() convutcsecs() convtime() ctime() etimefmt() isdaylight() mtime() restarttime() secs() starttime() ! time() timefmt() timestring() utctime() & Utility functions These functions don't quite fit into any other category. --- 215,221 ---- convsecs() convutcsecs() convtime() ctime() etimefmt() isdaylight() mtime() restarttime() secs() starttime() ! stringsecs() time() timefmt() timestring() utctime() & Utility functions These functions don't quite fit into any other category. *************** *** 887,901 **** the string and the same password. & DEFAULT() ! Function: default([/],) ! ! This function returns the value of /, as if retrieved via ! the get() function, if the attribute exists and is readable by you. ! Otherwise, it evaluates the default case, and returns that. ! Note that the default case is only evaluated if the attribute does ! not exist or cannot be read. Note further than an empty attribute ! counts as an existing attribute. This is useful for code that needs to return the value of an attribute, or an error message or default case, if that attribute does not exist. --- 888,902 ---- the string and the same password. & DEFAULT() ! Function: default([/],[[]/,..]) + This function returns the value of the first possible /, + as if retrieved via the get() function, if the attribute exists and + is readable by you. Otherwise, it evaluates the default case, and + returns that. Note that the default case is only evaluated if the + attribute does not exist or cannot be read. Note further than an empty + attribute counts as an existing attribute. + This is useful for code that needs to return the value of an attribute, or an error message or default case, if that attribute does not exist. *************** *** 1813,1828 **** & ILEV() & ITEXT() & INUM() ilev() itext() inum() These functions, when called within an iter(), return the equivalent of ## (itext) or #@ (inum), with reference to the nth more outermost iter(), where n=0 refers to the current iter(), n=1 to an iter() ! in which the current iter() is nested, etc. ilev() will return the ! current nesting depth, or -1 if it is outside an iter(). Thus, ! itext(ilev()) will return the ## of the outermost iter(). > say [iter(red blue green,iter(fish shoe, #@:##))] You say, "1:red 1:red 2:blue 2:blue 3:green 3:green" --- 1814,1832 ---- & ILEV() & ITEXT() & INUM() + & %i ilev() itext() + %i inum() These functions, when called within an iter(), return the equivalent of ## (itext) or #@ (inum), with reference to the nth more outermost iter(), where n=0 refers to the current iter(), n=1 to an iter() ! in which the current iter() is nested, etc. %iX is shorthand for itext(X) ! (up to itext(9). ilev() returns the current nesting depth, or -1 ! if it is outside an iter(). Thus, itext(ilev()) will return the ## ! of the outermost iter(). > say [iter(red blue green,iter(fish shoe, #@:##))] You say, "1:red 1:red 2:blue 2:blue 3:green 3:green" *************** *** 1833,1839 **** > say [iter(red blue green,iter(fish shoe, [inum(0)]:[itext(0)]))] You say, "1:fish 2:shoe 1:fish 2:shoe 1:fish 2:shoe" ! > say [iter(red blue green,iter(fish shoe, [itext(1)]:[itext(0)]))] You say, "red:fish red:shoe blue:fish blue:shoe green:fish green:shoe" & IPADDR() ipaddr() --- 1837,1843 ---- > say [iter(red blue green,iter(fish shoe, [inum(0)]:[itext(0)]))] You say, "1:fish 2:shoe 1:fish 2:shoe 1:fish 2:shoe" ! > say [iter(red blue green,iter(fish shoe, %i1:%i0))] You say, "red:fish red:shoe blue:fish blue:shoe green:fish green:shoe" & IPADDR() ipaddr() *************** *** 2304,2313 **** This function returns the dbrefs of all non-dark things inside an object. You must be in the object or control it to use this function. & LWHO() lwho() lwho() ! This returns a list of the dbref numbers for all currently-connected players. When mortals use this function, the dbref numbers of DARK wizards or royalty do NOT appear on the dbref list. --- 2308,2319 ---- This function returns the dbrefs of all non-dark things inside an object. You must be in the object or control it to use this function. & LWHO() + & LWHOID() lwho() lwho() + lwhoid() ! lwho() returns a list of the dbref numbers for all currently-connected players. When mortals use this function, the dbref numbers of DARK wizards or royalty do NOT appear on the dbref list. *************** *** 2315,2320 **** --- 2321,2328 ---- DARK and Hidden players, lwho() returns the output of lwho() from 's point of view. + lwohid() returns a list of objid's instead. + See also: mwho(), nwho(), xwho() & MAP() map([/],[,][, ]) *************** *** 2574,2585 **** See also: anonymous attributes & MWHO() mwho() ! This returns a list of the dbref numbers for all current-connected, non-hidden players. It's exactly the same as lwho() used by a mortal, and is suitable for use on privileged global objects who need an unprivileged who-list. & ALIAS() alias([,]) --- 2582,2597 ---- See also: anonymous attributes & MWHO() + & MWHOID() mwho() + mwhoid() ! mwho() returns a list of the dbref numbers for all current-connected, non-hidden players. It's exactly the same as lwho() used by a mortal, and is suitable for use on privileged global objects who need an unprivileged who-list. + + mwhoid() returns a list of objids instead. & ALIAS() alias([,]) *************** *** 3588,3594 **** " says, "" says, "" - The conf parameter say_uses_comma is respected (using "says," or "says"). If is specified, it is used instead of "says," / "says". Continued in 'help Speak2'. --- 3600,3605 ---- *************** *** 4250,4255 **** --- 4261,4278 ---- > say [timestring(301,2)] You say, "00d 00h 05m 01s" + See also: stringsecs() + & STRINGSECS() + stringsecs() + + The stringsecs() function takes a string of the form produced by + timestring() and converts it back into seconds. + + Example: + > say [stringsecs(5m 1s)] + You say, "301" + + See also: timestring(), etimefmt() & TR() tr(,,) *************** *** 4774,4782 **** --- 4797,4809 ---- See also: nthings(), lthings(), lvthings() & XWHO() + & XWHOID() & XMWHO() + & XMWHOID() xwho(start,count) xmwho(start,count) + xwhoid(start,count) + xmwhoid(start,count) xwho() fetches or fewer player dbrefs from the list of connected players. It is useful when the number of players connected causes lwho() *************** *** 4787,4792 **** --- 4814,4821 ---- xmwho() is identical, except it is limited to non-DARK and non-HIDE players. + xwhoid() and xmwhoid() return objids instead of dbrefs. + See also: lwho(), mwho(), nwho() & ZMWHO() *************** *** 4796,4801 **** --- 4825,4832 ---- non-hidden players within a location belonging to the specified zone. It's exactly the same as zwho() used by a mortal, and is suitable for use on privileged global objects who need an unprivileged zwho-list. + The viewer must either have see_alll privileges or pass the zone + lock of the zone to use the function. See also: zwho() *************** *** 4805,4811 **** This returns a list of the dbref numbers for all currently-connected players within a location belonging to the specified zone. When mortals use this function, the dbref numbers of DARK wizards or hidden royalty ! do NOT appear on the dbref list. If is given by a privileged user, zwho() returns a dbref list using 's privileges. --- 4836,4843 ---- This returns a list of the dbref numbers for all currently-connected players within a location belonging to the specified zone. When mortals use this function, the dbref numbers of DARK wizards or hidden royalty ! do NOT appear on the dbref list. The viewer must either have see_all ! privileges or pass the zone lock of the zone to use the function. If is given by a privileged user, zwho() returns a dbref list using 's privileges. *** 1_8_1.311/game/txt/hlp/penncmd.hlp Sat, 25 Mar 2006 14:30:07 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1.1.1.1.1.1.47.1.1.1.1.1.1.1.6 600) --- 1_8_1.336(w)/game/txt/hlp/penncmd.hlp Sat, 03 Jun 2006 17:05:23 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1.1.1.1.1.1.47.1.1.1.1.1.1.1.10 600) *************** *** 397,403 **** @attribute/access adds a new standard attribute into the table, associating it with the given space-separated list of full flag names. ! See 'help @set' for possible flags. A flag list of "none" removes all flag associations. If the /retroactive switch is added, the flags are assigned to every copy of the attribute that already exists in the database. --- 397,403 ---- @attribute/access adds a new standard attribute into the table, associating it with the given space-separated list of full flag names. ! See 'help attribute flags' for possible flags. A flag list of "none" removes all flag associations. If the /retroactive switch is added, the flags are assigned to every copy of the attribute that already exists in the database. *************** *** 611,617 **** with @command/add. These switches are: /noparse : The command does not evaluate arguments passed to it. ! /eqsplit : The parser parses leftside and rightside /lsargs : Comma-separated arguments on the left side are parsed. /rsargs : In conjunction with eqsplit, the right-side arguments, comma-separated, are parsed individually and passed --- 611,617 ---- with @command/add. These switches are: /noparse : The command does not evaluate arguments passed to it. ! /eqsplit : The parser parses leftside and rightside around = /lsargs : Comma-separated arguments on the left side are parsed. /rsargs : In conjunction with eqsplit, the right-side arguments, comma-separated, are parsed individually and passed *************** *** 680,685 **** --- 680,687 ---- as if it were a description or other similar message on the room. The objects that the looker would normally be able to see is passed as a dbref list in %0; all contents can be acquired through 'lcon(me)'. + A |-delimited list of all the unparsed object names is passed + in %1 (so iter(%1,itext(0),|,%r) produces the standard list) One could change the format to 'Contents: Object1 Object2 Object3' through '@conformat here = Contents: [iter(%0,name(##))]', *************** *** 693,698 **** --- 695,702 ---- "inventory" command, by a player-specified format. This is evaluated as if it were a description or other similar message on the object. The objects carried are passed as a dbref list in %0. + A |-delimited list of all the unparsed object names is passed + in %1 (so iter(%1,itext(0),|,%r) produces the standard list) One could change the format to 'You've got: Object1 Object2 Object3' through '@invformat me = You've got: [iter(%0,name(##))]', *************** *** 1152,1181 **** See also @pemit, @remit, @oemit, @lemit, NOSPOOF and SPOOFING. & @enable & @disable ! @enable ! @disable ! ! These are wizard commands that allow certain parameters of the game to ! be changed at runtime. The values of these parameters are listed by the ! "@config" command. Common parameters and their effects are as follows: ! ! logins -- When logins are disabled, only wizards and royalty may ! log into the game. Mortals attempting to log in will be ! given the down text, as well as the @rejectmotd. ! guests -- When guests are disabled, players can not log in as ! guest characters. ! pueblo -- Turns on HTML output for the Pueblo client. ! log_commands -- When this is enabled, all commands are logged. ! log_huhs -- When this is enabled, all commands that produce a "Huh?" ! are logged. ! log_forces -- When this is enabled, @forces done by wizards are logged. ! log_walls -- When this is enabled, @walls are logged. ! Actually, any boolean (Yes/No) runtime option can be enabled or ! disabled with these commands, as a shortcut for @config/set. @enable