2.2fb5.21 Fixed bug that prevented debugging of called programs like libraries. Fixed bug with muf debugger's "where" command giving incorrect information. Fixed minor bug that kept FB from compiling on several systems. 2.2fb5.20 Modified MALLOC_PROFILING code to list max bytes used for each line. Fixed a compiler bug on freeing from the middle of a string on escaped words. Added preliminary POSIX and SYSeVil portability mods. 2.2fb5.19 Fixed possible infinite loop with a muf program failing compile when it is a listener program, printing out an error message, and triggering itself to try to recompile again. etc etc. Made bugfix to loading deltas, that would corrupt the garbage chain. Made @set ignore trailing spaces on a propertyname. 2.2fb5.18 Fixed some stuff in fb5.17 that make compiling and running netmuck hard. Fixed a bad crashing bug with deletion of non-existent properties. Fixed compile bug with NO_MEMORY_COMMAND in do_memory(); 2.2fb5.17 Make several various bugfixes for compiling without DISKBASE defined. Fixed a few various bugs with MPI and other stuff. Changed property struct to store the propname in the structure, instead of using a pointer to a seperate propname. Added code to allow profiling of what is using up how much memory. Added DESCR_SETUSER ( i d s -- i ) primitive. Used to reconnect a descriptor to a different dbref. It first disconnects from the old dbref, then connects to the new one as if the connection typed QUIT, then logged into the new character. It takes the descriptor number, the dbref to connect to, and the password string for the new player dbref. If the password given doesn't match the player's password, then it gives a permission denied error. This returns a 1 if successful, or a 0 if the given descriptor was not found. Made bugfix for running of propqueue _depart's before player is disconnected. 2.2fb5.16 Fixed bug with setting properties with names that start with a colon. Added ENVPROP (d s -- ?) primitive. Like ENVPROPSTR, but reads all proptypes. Changed ENVPROPSTR and GETPROPSTR to return string representations of dbref and lock property types. Fixed crasher bug with free()ing of old @tune strings, on changing them. Changed SETOWN prim to check for @chlock Chown_OK locking. @sweep now lists dark players too. All MPI and MUF propqueue stuff (_depart, _arrive, _connect, etc) except for the _listen, ~listen and ~olisten propqueues, will be run immediately, instead of being put on the timequeue in mass when you move about, connect, or other- wise trigger them. 2.2fb5.15 Put code in {muf} to stop {muf}-PARSEPROP loops after 18 levels. Now allow a wizard to list the gripe file via 'gripe' with no args. Made bugfix to parseprop to make it re-entrant. Removed USE_SINGLE_*FILE defines, since they aren't needed anymore. Changed help, mpi, man, and news to show files with the given topic name, in the appropriate subdirectory, if they exist, instead of the given topic in the single helpfiles. ie: 'help foo' will look to see if there is a file named 'foo' in the 'help' directory. If there is, it will display it. If not, it will look in the 'help.txt' file for a topic of 'foo'. 2.2fb5.14 Fixed bug with strings in $define-$endef constructs, AGAIN. Removed extra fclose() from macroload(), that caused LINUX to crash. Removed setvbuf() calls to speed loads and saves back up. @descriptions, @succs, etc will now parse MPI in args to @programs they run. Changed @tune to allow setting a string parm to a null value, using "-". Added @doing command, and a who_doing @tune option, for @doing in WHO. The @doing command sets the _/do property that is displayed in the WHO list. Added @chlock command to let you set a lock as to who can @chown something. This sets the _/chlk lock property. Added @conlock command to let you set who is allowed to use a container. This sets the _/clk lock property that is used by get and put. Changed the examine command to list @conlock, @chlock, and @doing settings. 2.2fb5.12 Fixed a bug with escaped quotes in strings in $define-$endef constructs. Fixed a bug with trying to list partial files via the 'info' command. Fixed a bug with doing an @ps when an MPI event is queued. Fixed bug with MPI parsing of '{{{'. Added the 'mpi_max_commands' @tune parm, to set max# of mpi instrs to run. Updated mpihelp.txt help file. Added an @memory command to list current malloc()ed heap memory usage stats. 2.2fb5.11 Fixed a bug with QUIT that caused an infloop, and unfreed descriptors. The _listen propqueue will only run MUF progs, now, using the same old rules. The _olisten propqueue was removed. It didn't serve a purpose, not doing MPI. The ~listen propqueue was added, which can run either MUF or MPI. The ~olisten propqueue was also added, which can run either MUF or MPI. The _arrive and _oarrive propqueues now run before _listen, ~listen, or ~olisten propqueues that are triggered by the @succ or @osucc message on an action. The _depart and _odepart propqueues now run before _listen, ~listen, or ~olisten propqueues that are triggered by the @drop or @odrop message on an action. Fixed a bug where the muf lock prims were clearing extra stack items. Added a SYSPARM (s -- s) muf prim, to get an @tune system parameter setting. Fixed a bug in PART_PMATCH where it just plain didn't work. 2.2fb5.10 Fixed bug in killing pid 0. (shouldn't ever do that) (Thanks, darkfox!) Fixed bug that allowed lcational paradox with a vehicle. Changed first timeslice of a muf program to 4x regular timeslice. Added @restart command to shut down, then exec the restart script. Changed internals of timequeue. Changed Command @ for _listen queued MUF programs to "(_Listen)" Changed MPI listener code to store the heard string in {&arg} Moved a LOT of compiletime defines and options from config.h and params.h into the new @tune runtime tunable parameters command. The defaults for these parameters are stored in the 'defaults.h' file. Use '@tune' to list all the runtime options, or '@tune ' to list only those options whose name matches the pattern. '@tune =' will set the given parameter to the given value, if legal. '@tune load' will load the parameters from the 'data/parmfile.cfg' file, and '@tune save' will save the current parameters out to that file. Parameters are auto- matically loaded from that file at server startup, and are automatically saved to that file at server shutdown. 2.2fb5.01 Removed floating point math from MPI, for efficiency reasons. Fixed bug with @contents giving a not found error message twice. Fixed crashing bug with @set object=:clear Fixed bug with MPI parsing args in a way that mismatched the function run. Fixed bug with MPI misparsing of macros. Added {select:value,propname,dbref} MPI function. Added {timesub:period,offset,listname,dbref} MPI function. 2.2fb5.0 Fixed: Fixed a crashing bug with removing all properties on an object. Fixed copyobj data loss bug introduces a few beta versions back. Fixed RMATCH to check for valid dbrefs passed to it. Pair of bugs in announce.c that made it work less than optimally. Bug in nextprop where it wasn't clearing the propname returned on a fail. Bug where @succ, @fail, @drop, or @desc program would nuke the command line argument and command @ of a prog run from the link of an exit. SETLINK prim now checks linkability perms by perms of effective UID instead of the player. This means SETUID programs can link exits to things the owner of the program controls. Bug where \ was not escaping primitives from substitutions. Multiple bugs in the restart script. Bug in init_checkflags() that made @contents give incorrect results. Bug in could_doit that allowed players to use personal links to !JUMP_OK players. Bug allowing players to look at registered objects from afar. Bug with invalid _listener warning message going off at wrong times. Crashing bug where strlen(propname) + strlen(propstring) > BUFFER_LEN Bug where you could do @ and ! with variables of negative numbers. Nasty crashing bug with corrupted parent pointers in avl propdir structures. Bug where it tried to compress strings in @desc, @succ, @fail, &c. commands when COMPRESS was not #defined. The db should initially load slightly faster when COMPRESS *is* defined, also. Updated: The help.txt (help command) file has been cleaned up and updated a great deal, though there remains some updating still to do. The man.txt (the MUF manual) file has been updated to correspond with the current state of MUF as of fb5.0beta22. There is now an 'info muf-tutorial' manual, made by Scotfox, in the 'game/data/info' directory. Added: Made puppets announce to the room when their owner connects or disconnects. The default puppet connect message can be overridden with a _/pcon string property, and the disconnect message by a _/pdcon string property, set on the puppet itself. Added the @sweep commamd to list objects in the room that can hear you. Added a new memory manager for systems that have LARGE process sizes. balloc() is tuned to reduce overhead and fragmentation of memory on databases that tend to take up more than 16 megabytes of process size. Added the push, pop, exec, and prim commands to the debugger. A muf Debugger. If you try to run a program that you control, that has its ZOMBIE flag set, it will drop you into the MUF debugger. This lets you step line by line, or instruction by instruction through a muf program, setting breakpoints to stop at, and other nice things. There is help available within the debugger, via the 'help' command. @armageddon lets a wizard shut down the server immediately, without saving the database. This can take an optional argument, explaining the shutdown in the form of '@armageddon message'. @idescribe lets you set what things look like from the inside. This sets the _/ide property on the object. Syntax is "@idesc =" The muf property lists read in by {list} and {concat} in MPI can be any one of nine list formats, including the listname#/1 style and the listname1 style formats. The server automatically determines the list type and reads the list in properly. The MPI parser is now installed. This is too large a subject to cover here, so there will be a new file put in the info directory that explains it. This is a major change. It adds a lot of MUSH-type stuff to MUCK. However, it is *not* MUSH. It's something derived from several of the popular MUF description extention programs. Only much, much more powerful. Example: To list the awake player in the room in the room's @succ, just set the @succ of the room to: Awake players: {filter:{contents:here},1,{awake:{1}},{nl},\, } There is now a #define option for RWHO that lets you connect your fb muck to an RWHO server. Read the RWHO docs in the docs folder for more info. $defines for bg_mode, fg_mode, and pr_mode, for use with the new MODE and SETMODE primitives. fg_mode is defined as an integer denoting foreground mode, bg_mode denotes background mode, and pr_mode denotes preempt mode. The @contents command will list all objects and exits in the given object that match a flags check similar to the ones in @find, @owned, and @entrances. The syntax is '@contents [=[=]]' where is the object to list the items from, is a flag string that everything in the object is checked against, and is the format that the list will be displayed in. See @find, @owned, and @entrances for more details There is a new #define in params.h, PCREATE_FLAGS, where you can specify what flag bits get set as the default when a player is @pcreated. The @dlt command will let a wizard force a delta-dump. There is now a #define option, DELTADUMPS, that will make the database save out in a delta dump format. That is, only the changed objects are written out to the end of a temporary deltas-file, updating it, instead of the entire db being written out in a monolithic dump. When the deltas-file grows to about the same number of objects as the input file, it does the old monolithic dump to resynchronize the db file. @dump and @shutdown also do the monolithic dump to resynch the db. Delta dumps are MUCH faster than old style dumps. To create a loadable db from a deltas-file and the initial input db, simply append the data/deltas-file file to the end of a copy of the input file, and load it up. This is also handled automatically by the restart script. Changed: Omessages (@odrop, @osucc, etc) that start with an apostrophe, a comma, a dash, or a space, will not put in the space between the name and the message when they are displayed. MPI scripts now cannot call MUF programs with less than Mucker Level 3, if the MPI was triggered by a listener. If the MPI was NOT run from a listener, then it can call MUF all it wants. MPI cannot run {delay} commands if the MPI code was run by a lock, or from a _listen propqueue. MPI cannot run {tell} or {otell} commands from a _listen propqueue if the trigger object is not a room. You now use '@set =:clear' to clear all properties from an object. Only players who do not have their Zombie bit set can @force puppets, hear puppet echoes, or set Zombie bits on things. Also, listeners owned by a player who is set Zombie will not work. Only a Wizard may set or clear a Zombie bit on a player. @teleport will let players teleport themselves between rooms they own. Also, Realm wizards will be able to @teleport players in their realm between any two rooms within their realm. When you do a 'look ' it will first check to see if there is an object by that name in the room. If there is, it does a normal look at that object. If there is not, then it looks in the _details/ propdir on the room, for a property that is a prefix of. If it finds more than one such property, it gives the standard ambiguous message. If only one detail was matched, and it is a string property, then it's value is disp- layed. Otherwise, the standard no-match message is given. 'look =' also works, for details set on players, things, and programs. When an object of TYPE_THING is set HAVEN, you don't see it's contents when you look at it. This is to implement open and closed pouches. The debugger can now push local and global variables onto the stack via the 'push' command, and the 'print' command was added to display the value of global and local variables, referenced only by number. An @created thing will now have it's home set to the player, if the room the player is in is not controlled by them. The 'sex' property is now considered to have the same permissions as _props or %props. Puppets will not relay text or be @forcable, if they are set DARK. _arrive, _oarrive, _depart, and _odepart propqueues on the player will now also be triggered as the player moves about. They used to only be triggered on the room, and down the environment. Changed the definition of the Zombie Flag (as talked about further down). Any object can now be @forced by it's owner, so long as it is not in a room set Zombie. Also, things cannot be @forced to use exits set Zombie. The Zombie flag, on objects of TYPE_THING, the zombie flag merely means that any text that thing sees or hears will be relayed to it's owner. A puppet will not relay text from a room set Zombie, though. The restrictions for rooms and exits set Zombie do not apply to puppets owned and controlled by wizards. Renamed 'O' for Old in @find checks to '@', to free up the O flag. Objects of TYPE_THING that have the ZOMBIE bit set on them, will broadcast what they hear to their owner, a la puppets. ML3 programs can now read and write to both .props and _props. @props and ~props are still wizbit only. The MOVETO primitive can now reattach exits to new sources. ML1 programs now can no longer list dark things in a room's inventory, unless the perms the program runs under controls the object. ML0 programs, or programs owned by ML0 players, now cannot be run, and error out with Permission Denied, when an attempt to run them is made. Changed database storage format to store the db size at the beginning of the db, and to save out the contents of objects all together in clumps. This might help improve problems with memory paging on large systems, and speed property fetches in some circumstances. Added 'l' as a possible stack item type, for CHECKARGS. This corresponds to stack items that are lock boolean expressions. Altered the MUF debugger to have it list source code lines. Panic dumps, due to crashes, now also dump out the macrofile, to the muf/macros.PANIC file. Examine now lets you use wildcards to specify which properties to list. As a special case, if you end a wildcard search string with a /**, then it will list all the properties within the matched propdir, and recursively list all the sub-propdir properties, as well. When you try to get something from, or put something into a container, it checks the container object for an _/clk lock property, and eval- uates it. If the player does not pass the _/clk lock check, then they are not allowed to get anything from or put anything into that object. This also has the side effect that a player can set their _/clk property to a lock that specifies who can hand things to them. If the container object does not have a _/clk lock property, then it is assumed that the container is locked, and no-one may use it. Properties can now hold locks and dbrefs in addition to the standard strings and integers. This neccessitated a database format change. Locks have been moved into _/lok properties. 'get container=object' now lets you get things from containers. This checks to make sure that neither the container or the object is locked against you before it fetches the object to you. 'get object' still works fine for picking up objects that are in the room. 'put object=container' lets you put an object in a container. The container must not be locked against you, or else it will refuse to put the object in it. If the container is a player, you can hand the object to that player. ie: 'put camera=mike' hands the camera object to the player named mike. The default container is the room, so 'put camera' is the exact same as 'drop camera'. Every 15 minutes, the db is swept for proloaded objects that are unused, and for programs that are compiled but haven't been used in a while. These properties and programs are cleared out of memory, and will not be reloaded until they are next needed. The length of time that must pass before an object can be considered unused is defined in params.h by the CLEAN_INTERVAL #define. This interval is also how long it is between these periodic cleanings of memory. If a player is @toaded, any programs owned by them are stripped of AUTOSTART bits, and are dequeued from the time queue. This is because when a player is toaded, by default all their objects, including programs, are @chowned to #1. All shutdowns now have short messages explaining why the server shut down. ie: if the server crashed, or if a wizard shut the server down. If an exit is set HAVEN, then it can take a command line argument for its MPI scripts. ie: if an action named 'test' is set haven, then if a player typed 'test this', the argument 'this' would be put in the MPI 'arg' variable for each MPI script triggered by that action. Expanded listeners so that everything that uses notify, or notify_except, will send messages to _listeners. _listener propqueues can now be restricted to listen only for certain messages. To do this, preceed the prog number or MPI script in the _listen propqueue property with an smatch string and an equals sign. Example: @set object=_listen/1:*says*{Hello|Hi|Yo}*=&{lexec:greeting} This would restrict the listener to only lines that match the smatch pattern "*says*{Hello|Hi|Yo}*", and on those lines that did match it, it would run the MPI script {lexec:greetings}. If you need an equals sign in the smatch pattern, you can escape it with a \. "@set object=propname: propval" no longer strips spaces from between the property delimiter (the colon) and the property value. This lets you set properties to string values starting with spaces. "@set object=propname:^intval" lets you set the integer value of a property to the value of the given intval. @force and the FORCE primitive can now be used on objects of TYPE_THING, if they have the ZOMBIE flag set. Objects act as if they have the permissions of their owner. If an object is locked against a player, it will also be locked against any thing that that player owns, that tries to test the lock. Things with the ZOMBIE flag set cannot enter rooms or use exits that have the ZOMBIE flag set. This allows a way to prevent zombies from entering areas where they are not wanted. The PROPDIR? prim can now be used by anyone of Mucker Level 2 or above. Objects of TYPE_THING, that have the VEHICLE flag set, can now contain players. To enter a vehicle, you can either use a MUF program to teleport you to it via MOVETO, you can get a wizard to @teleport you into it, or else you an use an action that is both attached and linked to the vehicle to enter it. This means that you can only enter a vehicle from the same room that it is in, and you cannot use far links to enter it. This prevents the use of vehicles to get around locks. Inside the vehicle, you will see it's @idesc, instead of it's @desc, and you will not be shown it's @succ or @fail. Objects dropped in a vehicle will not go away to the their homes, as a vehicle cannot have a dropto set in it. Things with the VEHICLE flag set cannot enter rooms or use exits that have the VEHICLE flag set. This allows a way to prevent vehicles from entering areas where it would be illogical for them to be. There is now a LISTEN_MLEV #define in config.h that lets you set the minimum mucker level that can be run from a _listen propqueue. _listen propqueues will no longer give a message if the program they point to is not a valid program to run. Timequeue now also has a limit on the number of processes allowed to a single player. This parameter is #definable in params.h with the MAX_PLYR_PROCESSES define. Wizards can have as many processes as they need. The total process limit is still in effect, though it has been raised. The personal process limit for players is normally set around 16. Propqueues can now run MPI scripts, if the value of the property in the propqueue starts with a '&'. If so, then it is evaluated as an MPI script, starting at the next character, and the output is sent to the triggering player. Example: @set here=_connect:&&delay[5,The scavengers scatter as you wake up.] Would tell you that message, five seconds after you connect. This works for _connect, _disconnect, _arrive, and _depart. Locks to properties will now check against smatch patterns, meaning that you can do things like '@lock object=species:{Fox|cat}*' to let anyone through with a species property set to "fox", "foxtaur", "cat", etc. Locks to properties will run the string value of the property it tries to check, through the MPI parser, before it checks the returned value against the expected value. This means that you can make MPI scripts for locks. Example: @lock west=_MyMPIScript:1 @set west=_MyMPIScript:<[&count[&contents[&links[this],Player]],10] This would make it where a player would not be able to go through the 'west' exit unless there were less than 10 players in the room that west is linked to. Locks to properties will now also check the object the lock is on for a property. Meaning that if you '@lock object=foo:bar' and you have a property on the same object named "foo" that is set to a value of "bar", then the lock will evaluate true. Altered matching routines to allow matching from a remote object for MPI. This shouldn't have any visible changes outside of MPI functions. envpropstr(), and all that depends on it, including the ENVPROPSTR prim, and pronoun_substitute(), will now look on the object given first, then on each ROOM object down the environment. The change is that it no longer will look at the player carrying the item, etc. Just ROOMs. notify() will now split a line, if it contains \r's, sending each part seperately, appended with \r\n. The FOREGROUND primitive has been replaced by the in-server $define of "fg_mode setmode". The BACKGROUND primitive has been replaced by the in-server $define of "bg_mode setmode". The PREEMPT primitive has been replaced by the in-server $define of "pr_mode setmode". When a program compiles, it now automatically $includes #0, and the owner of the program, so a player can make a bunch of personal standard $defines. Vastly rewrote the property handling routines to split it into four modules that handled one aspect of the properties, each. propdirs.c handles the propdirs structure, props.c handles the lowest level property structure, property.c handles the high-level interface for the rest of the program, and diskprops.c handles fetching props from disk when needed and purging excess props from memory. Because of this redesign, 4 bytes were shaved off of the original property structure, and an extra information node per propdir was eliminated. This will probably translate into a 100 byte per object memory savings. Added a #define option, REALMS_CONTROL, that changes the way that controls() works, so that if there is a room set wizbit, then the owner of that room controls all items within that room's environment. The object owners, and the wizards still control the objects, as well. When this define is set, a room set Wizbit cannot be @chowned, except by a true wizard. Made database dumps more efficient (hopefully) when DISKBASE is defined. The 'sanity' and 'reconstruct' programs now take the file(s) to operate on as command line arguments, instead of through stdin/stdout. This means that they will work whether or not the DISKBASE #define is set. Their syntaxes are: reconstruct infile outfile sanity infile If a room is set BLOCK (Builder), then only actions on the room, or in the environment may be used to leave the room. Also, actions linked to players in the room will not work. Only a wizard may set a room BLOCK at this point. Added a check for 'O' in the flags fields of @owned, @find, etc. If you specify this flag, it will match for objects that have not been used for longer than 90 days. This figure is alterable with the AGING_TIME #define in params.h Altered the output format of @stats, and gave it more useful info for wizzes. The SETLINK primitive can now link to #-3. (HOME) When a player is not in INTERACTIVE mode, and they do a WHO, if there is an @WHO action with an exit priority of 1 or more in the environment, then it is triggered. This lets special WHO programs be written for things like @doing messages, etc. If SECURE_WHO is defined in config.h, then players will not be able to use the WHO command when they are not connected to a player yet, or when they are in interactive mode. This prevents the possibility of using these modes to bypass a global @who program. %props are now protected like _props to protect %n, %p, %s, etc props from being changed by people who shouldn't be able to. The GRIPE command will now inform all unquelled wizards online when a gripe is made. Also, gripes with no messages are now ignored by the server. The COMMAND variable in MUF will now give values that are specific for when the program is run from an @message. The possible values, in this situation, are (@Desc) (@Succ) (@Fail) and (@Drop) When the server is started up, the _sys/dumpinterval property on #0 is set to the #defined integer value of DUMP_INTERVAL. When the server is started up, the _sys/maxpennies property on #0 is set to the #defined integer value of MAX_PENNIES. When the server is started up, and the database has finished loading, the _sys/startuptime property on #0 is set to the integer SYSTIME value. Just before the server is shut down, except in the case of a PANIC dump, the _sys/shutdowntime property on #0 is set to the integer SYSTIME value. When the database is dumped, except in the case of a PANIC dump, the _sys/lastdumptime property on #0 is set to the integer SYSTIME value. Using ADDPROP to set a property to a null string and a 0 value will clear the values on a propdir, and will REMOVE_PROP non-propdir properties. When using raw telnet, backspace and delete characters will delete the previously typed character. This is a simple mod, and will make many poor backspaceless players happy. Exits can now have priority levels to let you specify that certain exits are not overidable by local actions. When an exit is searched for, in the matching routines, it will match like it used to, except that if it finds an exit, later in the search order, that has a higher priority level, it will choose that exit instead. You can set the priority level of an exit by setting its Mucker Level. (ie: @set exit=2) A level of 0 is the lowest priority, and a level of 3 is the highest priority. When the server looks for the standard "connect", "disconnect", or "look" actions, it will ignore any actions with a priority Level of 0. Only a Wizard can set the Priority Level of an exit or action. When an action is @attached to another object, @named to something else, or @unlinked, its Priority Level is reset to 0. If COMPATIBLE_PRIORITIES is #defined in config.h, then exits that are on room or player objects will never act as if they have an effective priority level of less than 1. Removed the MORTAL_DARKING #define and replaced it with the EXIT_DARKING and THING_DARKING #define options. If both are #defined, they act just like MORTAL_DARKING used to. Individually, you can specify whether non-wizards can @set objects of TYPE_THING, or objects of TYPE_EXIT DARK. Changed all the "look" forces in the server to use a slightly better method of making a player look around. This was done in preparation for the exit priority Level security mods. A nice side effect of this is that commands will no longer occur before the initial room "look" when a player wanders into the room. ISPID? will now return true for 'pid ispid?' KILL will now stop the current process when you do 'pid kill' The interpreter will now allow up to 8 levels of programs that are run as a consequence of MOVETO, LOCKED?, and FORCE. ie: a program can MOVETO a player to a room that has a program in the @desc that checks a lock with LOCKED?, which which runs a program that FORCEs the player to do something. This now works up to eight levels deep. It used to only work to two levels deep. Primitives: CONTROLS (d d -- i) Takes a player dbref and an object dbref, and returns true if the player has control over the given object. GETLOCK (d s -- ?) Gets the value of a given property, and puts it on the stack. This can return a lock, a string, a dbref, or an integer, depending on the type of the property. Permissions are the same as those for GETPROPSTR. This primitive returns 0 if no such property exists, of if it is a valueless propdir. SETLOCK (d s ? -- ) Stores a lock, dbref, integer, or string into the named property on the given object. Perms are the same as for ADDPROP. PARSELOCK (s -- l) Parses a lock string into a lock. UNPARSELOCK (l -- s) Unparses a lock into a string fit for program editing. PRETTYLOCK (l -- s) Unparses a lock into a string fit for players to see. TESTLOCK (l d -- i) Tests the player against the given lock. LOCK? (? -- i) Returns true if the top stack item is a lock. PARSEPROP (d s s i -- s) Returns the string output of the MPI Parser, given an object, a property name to parse, an input string for the {&cmd} variable, and an integer that should either be 1, for when you want {delay} messages to be sent to the player only, and 0, when you want the rest of the players in the room to get the omessages. NOTE: for security reasons, you cannot use PARSEPROP on an object you don't control, if the property is not a _prop or a ~prop. The exception to this is if the muf program is at least Mucker Level 3. Then parsing of normal props is allowed. If the muf program is wizbit, it can also parse @props and .props. NOTE2: this prim is only available in ML3 and wizbit programs. ADDRESS? (? -- i) Returns true if the top stack item is a function address. MODE ( -- i) Returns an integer denoting the current multitasking mode. This ignores BLOCKing bits on programs. The integer this returns will be the same as one of those defined by the standard $defines bg_mode, fg_mode, and pr_mode, being background, foreground, and preempt mode, respectively. SETMODE (i -- ) Sets the current multitasking mode to the given mode. The integer this uses will be the same as one of those defined by the standard $defines bg_mode, fg_mode, and pr_mode, being background, foreground, and preempt mode, respectively. Programs set BLOCK will run PREEMPT, ignoring this mode. MLEVEL (d -- i) Returns the Mucker (or Priority) Level of the given object. DATE ( -- i i i) Returns the monthday, month, and year. ie: if it were February 6, 1992, date would return 6 2 1992 as three integers on the stack. GMTOFFSET ( -- i) Returns the machine's offset from GMT in seconds. STRINGPFX (s s2 -- i) Returns 1 if s2 is a prefix of s. Case insensitive. Returns 0 if s2 is NOT a prefix of s. PART_PMATCH (s -- d) Takes a player name, or the first part of the name, and matches it against the names of the players who are currently online. If the given string is a prefix of the name of a player who is online, then their dbref is returned. If two players could be matched by the given string, it returns a #-2. If None of the players online match, then it returns a #-1. NEXTDESCR (i -- i) Takes a descriptor number, and returns the next connected descriptor number. To get the first descriptor number, use '1 condescr'. Between these, you can step through the descriptors list. If you try to use nextdescr on an invalid descriptor, it will return 0. If you have reached the end of the descriptor list, it returns 0. (requires Mucker Level 3.)