@action mpi=#0=tmp/exit1 @link $tmp/exit1=$doctools @propset $tmp/exit1=str:/_/fl:This command is currently down for maintenance. @propset $tmp/exit1=lock:/_/lok:$dlock @propset $tmp/exit1=str:/_default#:18 @propset $tmp/exit1=str:/_default#/1:MPI is an interpreted language with a LISP-like syntax available to all @propset $tmp/exit1=str:/_default#/10:operations are needed, nor is a separate program object for holding the code. @propset $tmp/exit1=str:/_default#/11: @propset $tmp/exit1=str:/_default#/12:See 'mpi syntax' for an overview. @propset $tmp/exit1=str:/_default#/13:See 'mpi categories' for a listing of topics by category @propset $tmp/exit1=str:/_default#/14:See 'mpi topics' or a listing of all categories @propset $tmp/exit1=str:/_default#/15:See 'mpi #contents' for a list of all documents @propset $tmp/exit1=str:/_default#/16:Enter 'mpi' to view a specific topic @propset $tmp/exit1=str:/_default#/17:Enter 'mpi #search ' to search for documents relating to @propset $tmp/exit1=str:/_default#/18:Enter 'mpi #help' for help using this manual. @propset $tmp/exit1=str:/_default#/2:players. Because it is universally available, MPI includes security features @propset $tmp/exit1=str:/_default#/3:that restrict its power. In general, MPI can only read props on the triggering @propset $tmp/exit1=str:/_default#/4:object and on objects controlled by the controller of the object on which the @propset $tmp/exit1=str:/_default#/5:MPI string is stored, and can only set props on the latter... on objects @propset $tmp/exit1=str:/_default#/6:controlled by the owner of the MPI object. Other than setting props as @propset $tmp/exit1=str:/_default#/7:mentioned, the extent to which MPI can modify the database is limited, but is @propset $tmp/exit1=str:/_default#/8:ideally suited for message-handling. And because it is interpreted, it is @propset $tmp/exit1=str:/_default#/9:well-suited for one-off programming tasks: no separate compiling and linking @propset $tmp/exit1=str:/_docs/!=#:5 @propset $tmp/exit1=str:/_docs/!=#/1: @propset $tmp/exit1=str:/_docs/!=#/2:NE|NOTEQUALS|!=|<> @propset $tmp/exit1=str:/_docs/!=#/3:{ne:expr1,expr2} @propset $tmp/exit1=str:/_docs/!=#/4: @propset $tmp/exit1=str:/_docs/!=#/5:If expr1 and expr2 evaluate out to the same value, then this returns false. Otherwise, this returns true. If both expressions evaluate out to numbers, then this compares them numerically. @propset $tmp/exit1=str:/_docs/<#:4 @propset $tmp/exit1=str:/_docs/<#/1: @propset $tmp/exit1=str:/_docs/<#/2:LT|LESSTHAN|< @propset $tmp/exit1=str:/_docs/<#/3:{lt:expr1,expr2} @propset $tmp/exit1=str:/_docs/<#/4:Evaluates expr1 and expr2, then returns true if expr1 was smaller. @propset $tmp/exit1=str:/_docs/<=#:5 @propset $tmp/exit1=str:/_docs/<=#/1: @propset $tmp/exit1=str:/_docs/<=#/2:LE|<= @propset $tmp/exit1=str:/_docs/<=#/3:{le:expr1,expr2} @propset $tmp/exit1=str:/_docs/<=#/4: @propset $tmp/exit1=str:/_docs/<=#/5:Evals expr1 and expr2, then returns true if expr1 was smaller or equal. @propset $tmp/exit1=str:/_docs/==#:5 @propset $tmp/exit1=str:/_docs/==#/1: @propset $tmp/exit1=str:/_docs/==#/2:EQ|EQUALS|== @propset $tmp/exit1=str:/_docs/==#/3:{eq:expr1,expr2} @propset $tmp/exit1=str:/_docs/==#/4: @propset $tmp/exit1=str:/_docs/==#/5:If expr1 and expr2 evaluate out to the same value, then this returns true. Otherwise, this returns false. If both expressions evaluate out to numbers, then this compares them numerically. @propset $tmp/exit1=str:/_docs/>#:5 @propset $tmp/exit1=str:/_docs/>#/1: @propset $tmp/exit1=str:/_docs/>#/2:GT|GREATERTHAN|> @propset $tmp/exit1=str:/_docs/>#/3:{gt:expr1,expr2} @propset $tmp/exit1=str:/_docs/>#/4: @propset $tmp/exit1=str:/_docs/>#/5:Evaluates expr1 and expr2, then returns true if expr1 was larger. @propset $tmp/exit1=str:/_docs/>=#:5 @propset $tmp/exit1=str:/_docs/>=#/1: @propset $tmp/exit1=str:/_docs/>=#/2:GE|>= @propset $tmp/exit1=str:/_docs/>=#/3:{ge:expr1,expr2} @propset $tmp/exit1=str:/_docs/>=#/4: @propset $tmp/exit1=str:/_docs/>=#/5:Evals expr1 and expr2, then returns true if expr1 was larger or equal. @propset $tmp/exit1=str:/_docs/absolute#:5 @propset $tmp/exit1=str:/_docs/absolute#/1: @propset $tmp/exit1=str:/_docs/absolute#/2:ABS|ABSOLUTE @propset $tmp/exit1=str:/_docs/absolute#/3:{abs:expr} @propset $tmp/exit1=str:/_docs/absolute#/4: @propset $tmp/exit1=str:/_docs/absolute#/5:Returns the absolute value of expr. @propset $tmp/exit1=str:/_docs/addition#:4 @propset $tmp/exit1=str:/_docs/addition#/1:ADD|ADDITION @propset $tmp/exit1=str:/_docs/addition#/2:{add:expr1,expr2} @propset $tmp/exit1=str:/_docs/addition#/3:{add:expr1,expr2,expr3...} @propset $tmp/exit1=str:/_docs/addition#/4:Returns the sum of the values of expr1 and expr2. If more than two args are given, then this will add all the args together and return the result. @propset $tmp/exit1=str:/_docs/and#:5 @propset $tmp/exit1=str:/_docs/and#/1: @propset $tmp/exit1=str:/_docs/and#/2:AND|&& @propset $tmp/exit1=str:/_docs/and#/3:{and:expr1,expr2...} @propset $tmp/exit1=str:/_docs/and#/4: @propset $tmp/exit1=str:/_docs/and#/5:Returns true if expr1 and expr2 evaluate as true. Otherwise, this returns false. If expr1 was false, this doesn't bother to evaluate expr2, as it does C-style shortcutting. If there are more than two arguments, then this will evaluate all of them until either one returns false, in which case this function returns false, or until it has evaluated all of the arguments. This function returns true only if all the arguments evaluate as true. @propset $tmp/exit1=str:/_docs/arg#:5 @propset $tmp/exit1=str:/_docs/arg#/1: @propset $tmp/exit1=str:/_docs/arg#/2:ARG|&ARG @propset $tmp/exit1=str:/_docs/arg#/3:{&arg} @propset $tmp/exit1=str:/_docs/arg#/4: @propset $tmp/exit1=str:/_docs/arg#/5:The {&arg} variable contains a string with the value of the command line arguments the user entered. This is so that you can have stuff like MPI in the fail of an exit, and when the user triggers the exit, and has some extra text on the line they entered, other than the exitname, the MPI can take that extra stuff as arguments for use. Note that you need to set an action HAVEN to get it to accept command line arguments. @propset $tmp/exit1=str:/_docs/awake#:5 @propset $tmp/exit1=str:/_docs/awake#/1: @propset $tmp/exit1=str:/_docs/awake#/2:AWAKE @propset $tmp/exit1=str:/_docs/awake#/3:{awake:player} @propset $tmp/exit1=str:/_docs/awake#/4: @propset $tmp/exit1=str:/_docs/awake#/5:Returns how many times player is connected. This means that it will returns 0 if the player is not connected. If the given object is NOT a player, it will return 0. In all other cases, it will return a positive number, being how many times the given player is connected to the server. @propset $tmp/exit1=str:/_docs/category#:19 @propset $tmp/exit1=str:/_docs/category#/1: Index of Topics by Section: @propset $tmp/exit1=str:/_docs/category#/10: Math Functions (MathFuncs) @propset $tmp/exit1=str:/_docs/category#/11: Looping Functions (Looping) @propset $tmp/exit1=str:/_docs/category#/12: Database Related Functions (DBFuncs) @propset $tmp/exit1=str:/_docs/category#/13: Connection Related Functions (ConnFuncs) @propset $tmp/exit1=str:/_docs/category#/14: Variable Handling Functions (VarFuncs) @propset $tmp/exit1=str:/_docs/category#/15: List Handling Functions (ListFuncs) @propset $tmp/exit1=str:/_docs/category#/16: Miscellaneous Functions (MiscFuncs) @propset $tmp/exit1=str:/_docs/category#/17: Macros and Functions (Functions) @propset $tmp/exit1=str:/_docs/category#/18: @propset $tmp/exit1=str:/_docs/category#/19:Use 'mpi ' to get more information on a topic. @propset $tmp/exit1=str:/_docs/category#/2: @propset $tmp/exit1=str:/_docs/category#/3:You can get more help on the following topics: @propset $tmp/exit1=str:/_docs/category#/4: @propset $tmp/exit1=str:/_docs/category#/5: Definitions and Details (Definitions) @propset $tmp/exit1=str:/_docs/category#/6: Time Functions (TimeFuncs) @propset $tmp/exit1=str:/_docs/category#/7: Logical Functions (LogicFuncs) @propset $tmp/exit1=str:/_docs/category#/8: Property Handling (PropFuncs) @propset $tmp/exit1=str:/_docs/category#/9: String Functions (StringFuncs) @propset $tmp/exit1=str:/_docs/center#:7 @propset $tmp/exit1=str:/_docs/center#/1: @propset $tmp/exit1=str:/_docs/center#/2:CENTER @propset $tmp/exit1=str:/_docs/center#/3:{center:string} @propset $tmp/exit1=str:/_docs/center#/4:{center:string,fieldwidth} @propset $tmp/exit1=str:/_docs/center#/5:{center:string,fieldwidth,padstring} @propset $tmp/exit1=str:/_docs/center#/6: @propset $tmp/exit1=str:/_docs/center#/7:Takes a string and pads it to fit the given fieldwidth, with the string center justified. If no padstring is given, it assumes that it will pad the string with spaces. If no fieldwidth is given, it assumes that the field width is 78 characters. Example: {center:Hello,10,1234567890} would return the string "123Hello12" @propset $tmp/exit1=str:/_docs/cmd#:6 @propset $tmp/exit1=str:/_docs/cmd#/1: @propset $tmp/exit1=str:/_docs/cmd#/2:CMD|&CMD @propset $tmp/exit1=str:/_docs/cmd#/3:{&cmd} @propset $tmp/exit1=str:/_docs/cmd#/4: @propset $tmp/exit1=str:/_docs/cmd#/5:The {&cmd} variable contains the command name the user used, that caused the MPI to run. This is generally the exit name that the player triggered. For example, if the player typed 'east', and triggered the exit named 'east;e;out', which ran some MPI commands, the {&cmd} variable would @propset $tmp/exit1=str:/_docs/cmd#/6:have a value of "east". @propset $tmp/exit1=str:/_docs/commas#:7 @propset $tmp/exit1=str:/_docs/commas#/1: @propset $tmp/exit1=str:/_docs/commas#/2:COMMAS @propset $tmp/exit1=str:/_docs/commas#/3:{commas:list} @propset $tmp/exit1=str:/_docs/commas#/4:{commas:list,lastsep} @propset $tmp/exit1=str:/_docs/commas#/5:{commas:list,lastsep,var,expr} @propset $tmp/exit1=str:/_docs/commas#/6: @propset $tmp/exit1=str:/_docs/commas#/7:Takes a list and returns a plain english comma delimited string with the items in it. For example, {commas:{mklist:Tom,Dick,Harry}} will return "Tom, Dick and Harry". If you specify the lastsep argument, you can replace the "and" with something else, such as "or" to get a result like "a, b or c". Note: You need to be careful to include spaces around the "or" or else you might get a result like "a, borc". Example: {commas:{mklist:a,b,c}, or } If the var and expr arguments are passed, then for every item in the list, it will set the value of the given variable name (which it will declare) to the item, then evaluate expr, and use the result in the string it outputs. Example: {commas:{contents:here},\, or ,v,{name:{&v}}} will return the name of every object in the room in a comma separated list, using ", or " as the final conjunction. ie: "Tom, Can of SPAM, Dick, or Harry." @propset $tmp/exit1=str:/_docs/concat#:6 @propset $tmp/exit1=str:/_docs/concat#/1: @propset $tmp/exit1=str:/_docs/concat#/2:CONCAT @propset $tmp/exit1=str:/_docs/concat#/3:{concat:listname} @propset $tmp/exit1=str:/_docs/concat#/4:{concat:listname,obj} @propset $tmp/exit1=str:/_docs/concat#/5: @propset $tmp/exit1=str:/_docs/concat#/6:Returns a string, containing the concatenated lines of a property based list. It concatenates the list semi-intelligently, putting a single space between lines normally, and two spaces between lines when the previous one ended with a period, exclamation mark, or question mark. A property based list is a series of properties that are consecutively numbered. The server understands several different formats, and can also read in property lists in either the propnameX format, or the propname#/X format. It does NOT evaluate the contents of the list for embedded MPI commands. If no obj argument is supplied, then it looks for the list somewhere down the environment from the trigger object. Otherwise, it looks for the list down the environment from the given object. @propset $tmp/exit1=str:/_docs/Connections#:5 @propset $tmp/exit1=str:/_docs/Connections#/1: @propset $tmp/exit1=str:/_docs/Connections#/2:MPI Connection-related functions include: @propset $tmp/exit1=str:/_docs/Connections#/3: @propset $tmp/exit1=str:/_docs/Connections#/4:awake idle online ontime @propset $tmp/exit1=str:/_docs/Connections#/5: @propset $tmp/exit1=str:/_docs/contains#:6 @propset $tmp/exit1=str:/_docs/contains#/1: @propset $tmp/exit1=str:/_docs/contains#/2:CONTAINS @propset $tmp/exit1=str:/_docs/contains#/3:{contains:obj1} @propset $tmp/exit1=str:/_docs/contains#/4:{contains:obj1,obj2} @propset $tmp/exit1=str:/_docs/contains#/5: @propset $tmp/exit1=str:/_docs/contains#/6:Returns true if obj1 is within obj2, or within anything it contains, or within anything they contain. If obj2 is not given, then it checks to see is obj1 is held by the player, or by anything they hold, etc. Basically, this just sees if obj1 is within the locational environment of obj2. @propset $tmp/exit1=str:/_docs/contents#:10 @propset $tmp/exit1=str:/_docs/contents#/1: @propset $tmp/exit1=str:/_docs/contents#/10: @propset $tmp/exit1=str:/_docs/contents#/2:CONTENTS @propset $tmp/exit1=str:/_docs/contents#/3:{contents:obj} @propset $tmp/exit1=str:/_docs/contents#/4:{contents:obj,type} @propset $tmp/exit1=str:/_docs/contents#/5: @propset $tmp/exit1=str:/_docs/contents#/6:Returns a list of the contents of the given object. If a second argument is passed to it, it restricts the listing to only those objects that are of the given type. Either the object must be nearby the trigger object, or else the owner of the trigger object must control the object. Otherwise this will error out with a Permission Denied error. The valid object type values are Room, Thing, Exit, Player, Program, and Bad. HINT: If you need to get a list of two types of objects from the room, just concatenate the lists from two calls to this function, with each object type you want. ie: @propset $tmp/exit1=str:/_docs/contents#/7: @propset $tmp/exit1=str:/_docs/contents#/8: {mklist:{contents:here,player},{contents:here,thing}} or @propset $tmp/exit1=str:/_docs/contents#/9: {contents:here,player}{nl}{contents:here,thing} @propset $tmp/exit1=str:/_docs/controls#:6 @propset $tmp/exit1=str:/_docs/controls#/1: @propset $tmp/exit1=str:/_docs/controls#/2:CONTROLS @propset $tmp/exit1=str:/_docs/controls#/3:{controls:obj} @propset $tmp/exit1=str:/_docs/controls#/4:{controls:obj,player} @propset $tmp/exit1=str:/_docs/controls#/5: @propset $tmp/exit1=str:/_docs/controls#/6:If one argument is given, then this returns true ("1") if the trigger object's owner controls the given object. If two arguments are given, then it returns true if the given player controls the given object. Otherwise, this returns false. ("0") Wizards control everything. @propset $tmp/exit1=str:/_docs/convecs#:5 @propset $tmp/exit1=str:/_docs/convecs#/1: @propset $tmp/exit1=str:/_docs/convecs#/2:CONVSECS @propset $tmp/exit1=str:/_docs/convecs#/3:{convsecs} @propset $tmp/exit1=str:/_docs/convecs#/4: @propset $tmp/exit1=str:/_docs/convecs#/5:Converts systime seconds into a readable time string. @propset $tmp/exit1=str:/_docs/convtime#:5 @propset $tmp/exit1=str:/_docs/convtime#/1: @propset $tmp/exit1=str:/_docs/convtime#/2:CONVTIME @propset $tmp/exit1=str:/_docs/convtime#/3:{convtime:string} @propset $tmp/exit1=str:/_docs/convtime#/4: @propset $tmp/exit1=str:/_docs/convtime#/5:Converts "HH:MM:SS Mo/Dy/Yr" format time string to systime seconds. @propset $tmp/exit1=str:/_docs/count#:6 @propset $tmp/exit1=str:/_docs/count#/1: @propset $tmp/exit1=str:/_docs/count#/2:COUNT @propset $tmp/exit1=str:/_docs/count#/3:{count:list} @propset $tmp/exit1=str:/_docs/count#/4:{count:list,sep} @propset $tmp/exit1=str:/_docs/count#/5: @propset $tmp/exit1=str:/_docs/count#/6:This counts the number of \r delimited items that are in the given list. This is effectively a list item count. If the sep argument if given, then it counts the number of sep delimited substrings in list. ie: The default sep is \r. (A carriage return.) @propset $tmp/exit1=str:/_docs/Database Functions#:8 @propset $tmp/exit1=str:/_docs/Database Functions#/1: @propset $tmp/exit1=str:/_docs/Database Functions#/2:MPI Database-related functions include: @propset $tmp/exit1=str:/_docs/Database Functions#/3: @propset $tmp/exit1=str:/_docs/Database Functions#/4:contains contents controls created dbeq exits @propset $tmp/exit1=str:/_docs/Database Functions#/5:flags force fullname holds istype lastused @propset $tmp/exit1=str:/_docs/Database Functions#/6:links loc locked modified money name @propset $tmp/exit1=str:/_docs/Database Functions#/7:nearby owner ref testlock type usecount @propset $tmp/exit1=str:/_docs/Database Functions#/8: @propset $tmp/exit1=str:/_docs/date#:6 @propset $tmp/exit1=str:/_docs/date#/1: @propset $tmp/exit1=str:/_docs/date#/2:DATE @propset $tmp/exit1=str:/_docs/date#/3:{date} @propset $tmp/exit1=str:/_docs/date#/4:{date:timezone} @propset $tmp/exit1=str:/_docs/date#/5: @propset $tmp/exit1=str:/_docs/date#/6:Returns a date string in the form mm/dd/yy. If the timezone argument is given, then it offsets the date returned by that number of hours. @propset $tmp/exit1=str:/_docs/dbequals#:5 @propset $tmp/exit1=str:/_docs/dbequals#/1: @propset $tmp/exit1=str:/_docs/dbequals#/2:DBEQ|DBEQUALS @propset $tmp/exit1=str:/_docs/dbequals#/3:{dbeq:obj1,obj2} @propset $tmp/exit1=str:/_docs/dbequals#/4: @propset $tmp/exit1=str:/_docs/dbequals#/5:Returns true if obj1 and obj2 refer to the same object. This does name matching, so {dbeq:*Wizard,#1} will return true if #1 is named Wizard. @propset $tmp/exit1=str:/_docs/debug#:5 @propset $tmp/exit1=str:/_docs/debug#/1: @propset $tmp/exit1=str:/_docs/debug#/2:DEBUG @propset $tmp/exit1=str:/_docs/debug#/3:{debug:expr} @propset $tmp/exit1=str:/_docs/debug#/4: @propset $tmp/exit1=str:/_docs/debug#/5:This will show MPI debugging information for all the commands within the given expression. This is useful for seeing why something isn't working. This returns the result of the evaluation of expr. @propset $tmp/exit1=str:/_docs/debug2#:~s~ @propset $tmp/exit1=str:/_docs/debug2#/1:In the lines from the first half of the debugging output -- where indentation is moving to the right -- the parser is essentially finding the innermost, left-most function to be evaluated. The remaining portion, with lines ending in '= ' and indentation moving back to the left, depicts the series of returned expressions described above. @propset $tmp/exit1=str:/_docs/debugging#:17 @propset $tmp/exit1=str:/_docs/debugging#/1:The {debug} function displays the progress of the parser. Enclosing the whole of our example in a {debug} function will show the process described above. @propset $tmp/exit1=str:/_docs/debugging#/10: (@Succ) {REF:"me"} = "#123" @propset $tmp/exit1=str:/_docs/debugging#/11: (@Succ) "#1" @propset $tmp/exit1=str:/_docs/debugging#/12: (@Succ) {EQ:"#123", "#1"} = "0" @propset $tmp/exit1=str:/_docs/debugging#/13: (@Succ) "Hello world!" @propset $tmp/exit1=str:/_docs/debugging#/14: (@Succ) {IF:"{eq:{ref:me},#1}", "Hey it's God!", "Hello world!"} = "Hello world!" @propset $tmp/exit1=str:/_docs/debugging#/15: Hello world! @propset $tmp/exit1=str:/_docs/debugging#/16: @propset $tmp/exit1=str:/_docs/debugging#/17:See 'debug2' @propset $tmp/exit1=str:/_docs/debugging#/2: @propset $tmp/exit1=str:/_docs/debugging#/3:> @succ testmpi = {debug:{if:{eq:{ref:me},#1},Hey it's God!,Hello world!}} @propset $tmp/exit1=str:/_docs/debugging#/4: Message set. @propset $tmp/exit1=str:/_docs/debugging#/5:> testmpi @propset $tmp/exit1=str:/_docs/debugging#/6: (@Succ) {IF:"{eq:{ref:me},#1}", "Hey it's God!", "Hello world!"} @propset $tmp/exit1=str:/_docs/debugging#/7: (@Succ) {EQ:"{ref:me}", "#1"} @propset $tmp/exit1=str:/_docs/debugging#/8: (@Succ) {REF:"me"} @propset $tmp/exit1=str:/_docs/debugging#/9: (@Succ) "me" @propset $tmp/exit1=str:/_docs/decrement#:6 @propset $tmp/exit1=str:/_docs/decrement#/1: @propset $tmp/exit1=str:/_docs/decrement#/2:DEC|DECREMENT @propset $tmp/exit1=str:/_docs/decrement#/3:{dec:var} @propset $tmp/exit1=str:/_docs/decrement#/4:{dec:var,val} @propset $tmp/exit1=str:/_docs/decrement#/5: @propset $tmp/exit1=str:/_docs/decrement#/6:Decrements the value of the given variable by one, returning the result. If a value argument is given, then it will subtract that from the variable, instead of the value 1. @propset $tmp/exit1=str:/_docs/Definitions#:11 @propset $tmp/exit1=str:/_docs/Definitions#/1: @propset $tmp/exit1=str:/_docs/Definitions#/10:For logical constructs, a string value of "0", or a null string ("") are both considered false. Any other value is considered true. @propset $tmp/exit1=str:/_docs/Definitions#/11: @propset $tmp/exit1=str:/_docs/Definitions#/2:Definitions: @propset $tmp/exit1=str:/_docs/Definitions#/3: @propset $tmp/exit1=str:/_docs/Definitions#/4:A trigger object is the object that the MPI script is evaluated from. @propset $tmp/exit1=str:/_docs/Definitions#/5: @propset $tmp/exit1=str:/_docs/Definitions#/6:A list is a string containing several individual substring items, seperated by carriage return characters. @propset $tmp/exit1=str:/_docs/Definitions#/7: @propset $tmp/exit1=str:/_docs/Definitions#/8:A property based list is a set of consecutively numbered properties that each contain one string in a list of strings. Property based lists are often numbered like: listname1, listname2, listname3, listname4, etc. Another popular format is listname#/1, listname#/2, listname#/3, etc. MPI can read in either of those formats, and several more, for that matter. @propset $tmp/exit1=str:/_docs/Definitions#/9: @propset $tmp/exit1=str:/_docs/delay#:5 @propset $tmp/exit1=str:/_docs/delay#/1: @propset $tmp/exit1=str:/_docs/delay#/2:DELAY @propset $tmp/exit1=str:/_docs/delay#/3:{delay:secs,expr} @propset $tmp/exit1=str:/_docs/delay#/4: @propset $tmp/exit1=str:/_docs/delay#/5:Evaluates the given expression, then puts the result of that on the timequeue, to execute after the given number of seconds. At that time, the string is evaluated again, and displayed to the user, or to the room, depending on whether it was run from a regular message such as @succ, or from an omessage such as @osucc. Since the expression is evaluated both before and after being delayed, you need to put MPI code that is to run after the delay within a {lit:expr} command. If a {delay} evaluation is a null string, then the notify or notify_except will not be done. {Delay} will return the process ID of the event it puts on the timequeue. @propset $tmp/exit1=str:/_docs/delprop#:6 @propset $tmp/exit1=str:/_docs/delprop#/1: @propset $tmp/exit1=str:/_docs/delprop#/2:DELPROP @propset $tmp/exit1=str:/_docs/delprop#/3:{delprop:propname} @propset $tmp/exit1=str:/_docs/delprop#/4:{delprop:propname,object} @propset $tmp/exit1=str:/_docs/delprop#/5: @propset $tmp/exit1=str:/_docs/delprop#/6:This function will remove a property and all of its subsidiary properties in the case that it is a propdir. This will delete the property on the trigger object, unless an object argument is specified. If one is, then it will delete the property on that given object. This function returns a null string. If you specify a propname that is protected, you will get an error of Permission Denied. You are only allowed to delete properties from objects that are owned by the owner of the trigger object. @propset $tmp/exit1=str:/_docs/dice#:7 @propset $tmp/exit1=str:/_docs/dice#/1: @propset $tmp/exit1=str:/_docs/dice#/2:DICE @propset $tmp/exit1=str:/_docs/dice#/3:{dice:X} @propset $tmp/exit1=str:/_docs/dice#/4:{dice:X,Y} @propset $tmp/exit1=str:/_docs/dice#/5:{dice:X,Y,Z} @propset $tmp/exit1=str:/_docs/dice#/6: @propset $tmp/exit1=str:/_docs/dice#/7:Given one parameter, picks a random number between 1 and X. (1dX) Given two parameters, it randomly generates Y numbers between 1 and X, and adds them together. (YdX) A third parameter, if given, is just added to this sum as a modifier. (YdX+Z) @propset $tmp/exit1=str:/_docs/distance#:8 @propset $tmp/exit1=str:/_docs/distance#/1: @propset $tmp/exit1=str:/_docs/distance#/2:DIST|DISTANCE @propset $tmp/exit1=str:/_docs/distance#/3:{dist:x,y} Returns distance from 0,0 that x,y is. @propset $tmp/exit1=str:/_docs/distance#/4:{dist:x,y,z} Returns distance from 0,0,0 that x,y,z is. @propset $tmp/exit1=str:/_docs/distance#/5:{dist:x,y,x2,y2} Returns distance between x,y and x2,y2. @propset $tmp/exit1=str:/_docs/distance#/6:{dist:x,y,z,x2,y2,z2} Returns distance between x,y,z and x2,y2,z2. @propset $tmp/exit1=str:/_docs/distance#/7: @propset $tmp/exit1=str:/_docs/distance#/8:Given two arguments, this calculates the distance of a 2D point from the origin. Given three arguments, this calculates the distance of a 3D point from the origin. Given four arguments, this calculates the distance between a pair of 2D points. Given six arguments, this calculates the distance between a pair of 3D points. @propset $tmp/exit1=str:/_docs/divide#:6 @propset $tmp/exit1=str:/_docs/divide#/1: @propset $tmp/exit1=str:/_docs/divide#/2:DIV|DIVIDE @propset $tmp/exit1=str:/_docs/divide#/3:{div:expr1,expr2} @propset $tmp/exit1=str:/_docs/divide#/4:{div:expr1,expr2,expr3...} @propset $tmp/exit1=str:/_docs/divide#/5: @propset $tmp/exit1=str:/_docs/divide#/6:Returns the value of expr1 divided by expr2. Division by zero will return zero. If more than two arguments are given, then the first argument is divided by the second, and the result is divided by the third, etc, for all of the arguments. For example: {div:180,6,3,5} would be read like 180 / 6 / 3 / 5, and a result of 2 would be returned. @propset $tmp/exit1=str:/_docs/eval#:5 @propset $tmp/exit1=str:/_docs/eval#/1: @propset $tmp/exit1=str:/_docs/eval#/2:EVAL @propset $tmp/exit1=str:/_docs/eval#/3:{eval:string} @propset $tmp/exit1=str:/_docs/eval#/4: @propset $tmp/exit1=str:/_docs/eval#/5:Sort of the exact opposite of {lit:}. This takes a string, and evaluates it for MPI commands embedded within it. This can be used on the output of {list:}, for example. @propset $tmp/exit1=str:/_docs/example#:~s~ @propset $tmp/exit1=str:/_docs/example#/1:> lsedit harley = bikecode @propset $tmp/exit1=str:/_docs/example#/10: motorcycle code goes here) @propset $tmp/exit1=str:/_docs/example#/11: } @propset $tmp/exit1=str:/_docs/example#/12:> } @propset $tmp/exit1=str:/_docs/example#/13:> } @propset $tmp/exit1=str:/_docs/example#/14:> .end @propset $tmp/exit1=str:/_docs/example#/15: < Editor exited. > @propset $tmp/exit1=str:/_docs/example#/16: < list saved. > @propset $tmp/exit1=str:/_docs/example#/17:> @succ ride harley;ride motorcycle;ride cycle = {lexec:bikecode} @propset $tmp/exit1=str:/_docs/example#/18: Message set. @propset $tmp/exit1=str:/_docs/example#/19:> ride harley @propset $tmp/exit1=str:/_docs/example#/2: < Welcome to the list editor. You can get help by entering '.h' > @propset $tmp/exit1=str:/_docs/example#/20: (The Harley does something amazing.) @propset $tmp/exit1=str:/_docs/example#/21: @propset $tmp/exit1=str:/_docs/example#/22:The {lexec} function executes MPI in a list. The {exec} function executes MPI in a property, and thus provides another way to break code up into managable pieces. MUSH coders especially might find this method more intuitive. @propset $tmp/exit1=str:/_docs/example#/3: < '.end' will exit and save the list. '.abort' will abort any changes. > @propset $tmp/exit1=str:/_docs/example#/4: < To save changes to the list, and continue editing, use '.save' > @propset $tmp/exit1=str:/_docs/example#/5: @propset $tmp/exit1=str:/_docs/example#/6:> {null: @propset $tmp/exit1=str:/_docs/example#/7:> {if: @propset $tmp/exit1=str:/_docs/example#/8:> { @propset $tmp/exit1=str:/_docs/example#/9:> (lots of complicated really cool @propset $tmp/exit1=str:/_docs/exec!#:7 @propset $tmp/exit1=str:/_docs/exec!#/1: @propset $tmp/exit1=str:/_docs/exec!#/2:EXEC! @propset $tmp/exit1=str:/_docs/exec!#/3:{exec!:propname} @propset $tmp/exit1=str:/_docs/exec!#/4:{exec!:propname,obj} @propset $tmp/exit1=str:/_docs/exec!#/5: @propset $tmp/exit1=str:/_docs/exec!#/6:Returns the string value of the given property, after having evaluated any embedded MPI commands that it contained. If no object parameter is passed to it, it looks for the property on the trigger. Otherwise, it looks for the @propset $tmp/exit1=str:/_docs/exec!#/7:property on the object specified. If the property is not found, this returns an empty string. If the property that it tries to access is read restricted and the owner of the trigger object does not own the object that the property is found on, then the MPI script stops with a Permission denied error. @propset $tmp/exit1=str:/_docs/exec#:6 @propset $tmp/exit1=str:/_docs/exec#/1: @propset $tmp/exit1=str:/_docs/exec#/2:EXEC @propset $tmp/exit1=str:/_docs/exec#/3:{exec:propname} @propset $tmp/exit1=str:/_docs/exec#/4:{exec:propname,obj} @propset $tmp/exit1=str:/_docs/exec#/5: @propset $tmp/exit1=str:/_docs/exec#/6:Returns the string value of the given property, after having evaluated any embedded MPI commands that it contained. If no object parameter is passed to it, it looks for the property somewhere down the environment from the trigger object. Otherwise, it looks down the environment from the object specified. If the property is not found, this returns an empty string. If the property that it tries to access is read restricted and the owner of the trigger object does not own the object that the property is found on, then the MPI script stops with a Permission denied error. @propset $tmp/exit1=str:/_docs/exits#:5 @propset $tmp/exit1=str:/_docs/exits#/1: @propset $tmp/exit1=str:/_docs/exits#/2:EXITS @propset $tmp/exit1=str:/_docs/exits#/3:{exits:obj} @propset $tmp/exit1=str:/_docs/exits#/4: @propset $tmp/exit1=str:/_docs/exits#/5:Returns a list of all the exits on the given object. The owner of the trigger object has to control obj, or else this errors out with Permission Denied. Programs and exits never have exits attached to them. @propset $tmp/exit1=str:/_docs/filter#:7 @propset $tmp/exit1=str:/_docs/filter#/1: @propset $tmp/exit1=str:/_docs/filter#/2:FILTER @propset $tmp/exit1=str:/_docs/filter#/3:{filter:var,list,expr} @propset $tmp/exit1=str:/_docs/filter#/4:{filter:var,list,exp,sep} @propset $tmp/exit1=str:/_docs/filter#/5:{filter:var,lst,exp,sep,s2} @propset $tmp/exit1=str:/_docs/filter#/6: @propset $tmp/exit1=str:/_docs/filter#/7:This evaluates expr for each and every item in the given list. On each evaluation, the temporary variable var will contain the value of the item under scrutiny. This function returns a list containing all of the items from the input list, for which expr evaluated true. Var will only be defined for the duration of expr, and will be undefined after the {filter} construct finishes. If sep is given, then it uses that string as the item seperator in the input list, instead of the usual carriage return character. If s2 is defined, then it will use that string to seperate the items in the list it returns, instead of the normal carriage return. Sep and s2 can be multiple characters long. @propset $tmp/exit1=str:/_docs/flags#:5 @propset $tmp/exit1=str:/_docs/flags#/1: @propset $tmp/exit1=str:/_docs/flags#/2:FLAGS @propset $tmp/exit1=str:/_docs/flags#/3:{flags:obj} @propset $tmp/exit1=str:/_docs/flags#/4: @propset $tmp/exit1=str:/_docs/flags#/5:Returns a flaglist string from obj. ie: PM2J. The object must either be in the vicinity, or it must be controlled by the owner of the trigger object. @propset $tmp/exit1=str:/_docs/fold#:6 @propset $tmp/exit1=str:/_docs/fold#/1: @propset $tmp/exit1=str:/_docs/fold#/2:FOLD @propset $tmp/exit1=str:/_docs/fold#/3:{fold:var1,var2,list,expr} @propset $tmp/exit1=str:/_docs/fold#/4:{fold:var1,var2,lst,expr,sep} @propset $tmp/exit1=str:/_docs/fold#/5: @propset $tmp/exit1=str:/_docs/fold#/6:This takes a list and stores the first two items in var1 and var2, then evaluates expr. The value returned by expr is then put in var1, and the next list item is put in var2. Expr keeps being evaluated in this way until there are no more list items left. This returns the last value returned by expr. If a sep argument is given, the input list is assumed to have its individual items delimited by that string, otherwise it assumes a carriage return. @propset $tmp/exit1=str:/_docs/for#:5 @propset $tmp/exit1=str:/_docs/for#/1: @propset $tmp/exit1=str:/_docs/for#/2:FOR @propset $tmp/exit1=str:/_docs/for#/3:{for:varname,start,end,increment,command} @propset $tmp/exit1=str:/_docs/for#/4: @propset $tmp/exit1=str:/_docs/for#/5:Acts as a counting loop, like BASIC's for loops. The varname is the name of the variable that it will create and use to store the count value. The start value will be the initial value of the variable, and the end value will be the value that the variable is working towards. The increment is how much the variable will be incremented by in each loop. The command will be evaluated for each value of the variable between the beginning and ending values. For example: {null:{for:i,10,1,-1,{tell:{&i}}}} will echo a countdown from ten to one, inclusive, to the user. @propset $tmp/exit1=str:/_docs/force#:5 @propset $tmp/exit1=str:/_docs/force#/1: @propset $tmp/exit1=str:/_docs/force#/2:FORCE @propset $tmp/exit1=str:/_docs/force#/3:{force:object,command} @propset $tmp/exit1=str:/_docs/force#/4: @propset $tmp/exit1=str:/_docs/force#/5:Forces the given player or thing to do the given command. The thing forced must be @flock'ed to the trigger object, or the trigger object's owner, and it must be set XFORCIBLE, or else this function will get a Permission Denied error. This function returns a null string. {Force} cannot force a thing-object to do something, if it is set Dark, is in a room set Zombie, if it has the same name as a player, or is owned by a player set Zombie. @propset $tmp/exit1=str:/_docs/foreach#:8 @propset $tmp/exit1=str:/_docs/foreach#/1: @propset $tmp/exit1=str:/_docs/foreach#/2:FOREACH @propset $tmp/exit1=str:/_docs/foreach#/3:{foreach:var,list,expr} @propset $tmp/exit1=str:/_docs/foreach#/4:{foreach:var,list,expr,sep} @propset $tmp/exit1=str:/_docs/foreach#/5: @propset $tmp/exit1=str:/_docs/foreach#/6:This evaluates expr for each and every item in the given list. On each evaluation, the temporary variable var will contain the value of the item under scrutiny. var will only be defined for the duration of expr, and will be undefined after the {foreach} construct finishes. If sep is given, then it uses that string as the item seperator in list, instead of the usual carriage return character. sep can be multiple characters long. This structure returns the result of the last evaluation of expr. Example: @propset $tmp/exit1=str:/_docs/foreach#/7: @propset $tmp/exit1=str:/_docs/foreach#/8: {foreach:thing,{contents:here},{store:1,_seen}} @propset $tmp/exit1=str:/_docs/ftime#:7 @propset $tmp/exit1=str:/_docs/ftime#/1: @propset $tmp/exit1=str:/_docs/ftime#/2:FTIME @propset $tmp/exit1=str:/_docs/ftime#/3:{ftime:format} @propset $tmp/exit1=str:/_docs/ftime#/4:{ftime:format,tz} @propset $tmp/exit1=str:/_docs/ftime#/5:{ftime:format,tz,secs} @propset $tmp/exit1=str:/_docs/ftime#/6: @propset $tmp/exit1=str:/_docs/ftime#/7:Returns a time string in the format you specify. See 'man timefmt' for the %subs that you can use in the format string. If specified, tz is the number of hours offset from GMT. If specified, secs is the systime to use, instead of the current time. {ftime:%x %X %Y,8,0} will return the date and time for systime 0, for the Pacific time zone. @propset $tmp/exit1=str:/_docs/fullname#:5 @propset $tmp/exit1=str:/_docs/fullname#/1: @propset $tmp/exit1=str:/_docs/fullname#/2:FULLNAME @propset $tmp/exit1=str:/_docs/fullname#/3:{fullname:obj} @propset $tmp/exit1=str:/_docs/fullname#/4: @propset $tmp/exit1=str:/_docs/fullname#/5:Returns the name of the given object. In the case where the object is an exit, then the full name of the exit is given, including all the ; aliases. The object must be in the immediate vicinity, or be controlled by the owner of the trigger object. @propset $tmp/exit1=str:/_docs/func#:29 @propset $tmp/exit1=str:/_docs/func#/1: @propset $tmp/exit1=str:/_docs/func#/10: @propset $tmp/exit1=str:/_docs/func#/11:Effectively, the above {func} declaration is the same as the following macro, and in fact, it's internally handled the same way: @propset $tmp/exit1=str:/_docs/func#/12: @propset $tmp/exit1=str:/_docs/func#/13: _msgmacs/sqr:{with:val,{:1},{mult:{&val},{&val}}} @propset $tmp/exit1=str:/_docs/func#/14: @propset $tmp/exit1=str:/_docs/func#/15:You can define a function that takes more than one argument, but the maximum number of args you can pass to the function is seven. Example of multiple arguments: @propset $tmp/exit1=str:/_docs/func#/16: @propset $tmp/exit1=str:/_docs/func#/17: {func:names,list,numsp,flagsp, @propset $tmp/exit1=str:/_docs/func#/18: {parse:v,{&list}, @propset $tmp/exit1=str:/_docs/func#/19: {name:{&v}} @propset $tmp/exit1=str:/_docs/func#/2:FUNC @propset $tmp/exit1=str:/_docs/func#/20: {if:{or:{&numsp},{&flagsp}}, @propset $tmp/exit1=str:/_docs/func#/21: {lit:(} @propset $tmp/exit1=str:/_docs/func#/22: {if:{&numsp},{ref:{&v}}} @propset $tmp/exit1=str:/_docs/func#/23: {if:{&flagsp},{flags:{&v}}} @propset $tmp/exit1=str:/_docs/func#/24: {lit:)} @propset $tmp/exit1=str:/_docs/func#/25: } @propset $tmp/exit1=str:/_docs/func#/26: } @propset $tmp/exit1=str:/_docs/func#/27:} @propset $tmp/exit1=str:/_docs/func#/28:{names:{contents:here},1,1} @propset $tmp/exit1=str:/_docs/func#/29: @propset $tmp/exit1=str:/_docs/func#/3:{func:name,vars...,def} @propset $tmp/exit1=str:/_docs/func#/4: @propset $tmp/exit1=str:/_docs/func#/5:This effectively defines a function in MPI, with the given name, that takes the given named variables. The function is not immediately evaluated, so it needs to be invoked later, to do anything. Here's an example: @propset $tmp/exit1=str:/_docs/func#/6: @propset $tmp/exit1=str:/_docs/func#/7: {func:sqr,val,{mult:{&val},{&val}}} @propset $tmp/exit1=str:/_docs/func#/8: @propset $tmp/exit1=str:/_docs/func#/9:This defines the function 'sqr', that takes a single argument. That argument is stored in the 'val' variable. The function will multiply the value of the number passed to it, by itself, returning the result. It's invoked like: {sqr:10} @propset $tmp/exit1=str:/_docs/Functions#:3 @propset $tmp/exit1=str:/_docs/Functions#/1:Macros and Functions @propset $tmp/exit1=str:/_docs/Functions#/2: @propset $tmp/exit1=str:/_docs/Functions#/3:func macros @propset $tmp/exit1=str:/_docs/holds#:6 @propset $tmp/exit1=str:/_docs/holds#/1: @propset $tmp/exit1=str:/_docs/holds#/2:HOLDS @propset $tmp/exit1=str:/_docs/holds#/3:{holds:obj1} @propset $tmp/exit1=str:/_docs/holds#/4:{holds:obj1,obj2} @propset $tmp/exit1=str:/_docs/holds#/5: @propset $tmp/exit1=str:/_docs/holds#/6:Returns true if the location of obj1 is obj2. If no obj2 argument is given, then this will return true if the location of obj1 is the player. @propset $tmp/exit1=str:/_docs/how#:5 @propset $tmp/exit1=str:/_docs/how#/1: @propset $tmp/exit1=str:/_docs/how#/2:HOW|&HOW @propset $tmp/exit1=str:/_docs/how#/3:{&how} @propset $tmp/exit1=str:/_docs/how#/4: @propset $tmp/exit1=str:/_docs/how#/5:The {&how} variable is a short string telling what ran the MPI command. It can have the values "(@desc)", "(@succ)", "(@osucc)", etc. for when it is run from an @desc, an @succ, an @osucc, or whatever. It can also have the value "(@lock)" for when it is run from a lock test. @propset $tmp/exit1=str:/_docs/idle#:5 @propset $tmp/exit1=str:/_docs/idle#/1: @propset $tmp/exit1=str:/_docs/idle#/2:IDLE @propset $tmp/exit1=str:/_docs/idle#/3:{idle:player} @propset $tmp/exit1=str:/_docs/idle#/4: @propset $tmp/exit1=str:/_docs/idle#/5:Returns player idle time in seconds. If the given player is not connected, or is not a player object at all, then this will return -1. This returns the idle time for the most recently connected connection, if there are multiple connects. @propset $tmp/exit1=str:/_docs/if#:8 @propset $tmp/exit1=str:/_docs/if#/1: @propset $tmp/exit1=str:/_docs/if#/2:IF @propset $tmp/exit1=str:/_docs/if#/3:{if:check,true} @propset $tmp/exit1=str:/_docs/if#/4:{if:check,true,false} @propset $tmp/exit1=str:/_docs/if#/5: @propset $tmp/exit1=str:/_docs/if#/6:This is a simple conditional command. It evaluates the 'check' argument and if it is true, then it evaluates the 'true' argument and returns its result. If 'check' does not evaluate as true, then it will evaluate the 'false' argument, if there is one, and returns its result. If there is no false argument, and 'check' evaluated false, then it returns a null string. Example: @propset $tmp/exit1=str:/_docs/if#/7: @propset $tmp/exit1=str:/_docs/if#/8:Your computer is {if:{eq:2,3},broken!,All right.} @propset $tmp/exit1=str:/_docs/increment#:6 @propset $tmp/exit1=str:/_docs/increment#/1: @propset $tmp/exit1=str:/_docs/increment#/2:INC|INCREMENT @propset $tmp/exit1=str:/_docs/increment#/3:{inc:var} @propset $tmp/exit1=str:/_docs/increment#/4:{inc:var,val} @propset $tmp/exit1=str:/_docs/increment#/5: @propset $tmp/exit1=str:/_docs/increment#/6:Increments the value of the given variable by one, returning the result. If a value argument is given, then it will add that value to the variable, instead of the value 1. @propset $tmp/exit1=str:/_docs/index!#:6 @propset $tmp/exit1=str:/_docs/index!#/1: @propset $tmp/exit1=str:/_docs/index!#/2:INDEX! @propset $tmp/exit1=str:/_docs/index!#/3:{index!:propname} @propset $tmp/exit1=str:/_docs/index!#/4:{index!:propname,obj} @propset $tmp/exit1=str:/_docs/index!#/5: @propset $tmp/exit1=str:/_docs/index!#/6:Returns the string value of the property whose name is stored in the given property. This sounds confusing, but it's basically just the same as {prop!:{prop!:propname}}. If no object parameter is passed to it, it looks for both the index property and the referenced property on the trigger object. Otherwise, it looks on the specified object for both of them. If either property is not found, this returns an empty string. If the property that it tries to access is read restricted, and the owner of the trigger object does not own the object that the properties are found on, then the MPI script stops with a Permission denied error. @propset $tmp/exit1=str:/_docs/index#:6 @propset $tmp/exit1=str:/_docs/index#/1: @propset $tmp/exit1=str:/_docs/index#/2:INDEX @propset $tmp/exit1=str:/_docs/index#/3:{index:propname} @propset $tmp/exit1=str:/_docs/index#/4:{index:propname,obj} @propset $tmp/exit1=str:/_docs/index#/5: @propset $tmp/exit1=str:/_docs/index#/6:Returns the string value of the property whose name is stored in the given property. This sounds confusing, but it's basically just the same as {prop:{prop:propname}}. If no object parameter is passed to it, it looks for both the index property and the referenced property somewhere down the environment from the trigger object. Otherwise, it looks down the environment from the object specified for both of them. If either property is not found, this returns an empty string. If the property that it tries to access is read restricted, and the owner of the trigger object does not own the object that the properties are found on, then the MPI script stops with a Permission denied error. @propset $tmp/exit1=str:/_docs/instr#:5 @propset $tmp/exit1=str:/_docs/instr#/1: @propset $tmp/exit1=str:/_docs/instr#/2:INSTR @propset $tmp/exit1=str:/_docs/instr#/3:{instr:str1,str2} @propset $tmp/exit1=str:/_docs/instr#/4: @propset $tmp/exit1=str:/_docs/instr#/5:Lists the position of the first substring within str1 that matches str2. If no such substring exists, then this returns a 0. @propset $tmp/exit1=str:/_docs/isdbref#:5 @propset $tmp/exit1=str:/_docs/isdbref#/1: @propset $tmp/exit1=str:/_docs/isdbref#/2:ISDBREF @propset $tmp/exit1=str:/_docs/isdbref#/3:{isdbref:dbref} @propset $tmp/exit1=str:/_docs/isdbref#/4: @propset $tmp/exit1=str:/_docs/isdbref#/5:Returns true if the string passed to it is a valid dbref. @propset $tmp/exit1=str:/_docs/isnum#:5 @propset $tmp/exit1=str:/_docs/isnum#/1: @propset $tmp/exit1=str:/_docs/isnum#/2:ISNUM @propset $tmp/exit1=str:/_docs/isnum#/3:{isnum:number} @propset $tmp/exit1=str:/_docs/isnum#/4: @propset $tmp/exit1=str:/_docs/isnum#/5:Returns true if the string passed to it is a valid number. @propset $tmp/exit1=str:/_docs/istype#:5 @propset $tmp/exit1=str:/_docs/istype#/1: @propset $tmp/exit1=str:/_docs/istype#/2:ISTYPE @propset $tmp/exit1=str:/_docs/istype#/3:{istype:obj,typ} @propset $tmp/exit1=str:/_docs/istype#/4: @propset $tmp/exit1=str:/_docs/istype#/5:Returns true if the given object if of the given type. Valid types are: Bad, Room, Exit, Thing, Player, and Program. @propset $tmp/exit1=str:/_docs/kill#:13 @propset $tmp/exit1=str:/_docs/kill#/1: @propset $tmp/exit1=str:/_docs/kill#/10:owns, then this will error out with Permission denied. If no process is @propset $tmp/exit1=str:/_docs/kill#/11:found, this returns 0. If a process was found, and the permissions were @propset $tmp/exit1=str:/_docs/kill#/12:okay, then the process is killed, and {kill} returns the number of processes @propset $tmp/exit1=str:/_docs/kill#/13:killed. Usually one. @propset $tmp/exit1=str:/_docs/kill#/2:KILL @propset $tmp/exit1=str:/_docs/kill#/3:{kill:0} @propset $tmp/exit1=str:/_docs/kill#/4:{kill:processID} @propset $tmp/exit1=str:/_docs/kill#/5: @propset $tmp/exit1=str:/_docs/kill#/6:Kills a process on the timequeue, that was possibly created by {DELAY}. @propset $tmp/exit1=str:/_docs/kill#/7:If the process ID it is given is 0, then it will kill all processes done by @propset $tmp/exit1=str:/_docs/kill#/8:that trigger object. If the process to be killed was not set off by that @propset $tmp/exit1=str:/_docs/kill#/9:trigger, and was not set off by any object that the owner of the trigger @propset $tmp/exit1=str:/_docs/lcommon#:5 @propset $tmp/exit1=str:/_docs/lcommon#/1: @propset $tmp/exit1=str:/_docs/lcommon#/2:LCOMMON @propset $tmp/exit1=str:/_docs/lcommon#/3:{lcommon:list1,list2} @propset $tmp/exit1=str:/_docs/lcommon#/4: @propset $tmp/exit1=str:/_docs/lcommon#/5:Creates a list containing every item that appears in BOTH list1 and list2. Any duplicate items in the resulting list are removed. @propset $tmp/exit1=str:/_docs/left#:7 @propset $tmp/exit1=str:/_docs/left#/1: @propset $tmp/exit1=str:/_docs/left#/2:LEFT @propset $tmp/exit1=str:/_docs/left#/3:{left:string} @propset $tmp/exit1=str:/_docs/left#/4:{left:string,fieldwidth} @propset $tmp/exit1=str:/_docs/left#/5:{left:string,fieldwidth,padstring} @propset $tmp/exit1=str:/_docs/left#/6: @propset $tmp/exit1=str:/_docs/left#/7:Takes a string and pads it to fit the given fieldwidth, with the string left justified. If no padstring is given, it assumes that it will pad the string with spaces. If no fieldwidth is given, it assumes that the field width is 78 characters. Example: {left:Hello,10,_.} would return the string "Hello_._._" @propset $tmp/exit1=str:/_docs/lexec#:5 @propset $tmp/exit1=str:/_docs/lexec#/1: @propset $tmp/exit1=str:/_docs/lexec#/2:LEXEC @propset $tmp/exit1=str:/_docs/lexec#/3:{lexec:listname} @propset $tmp/exit1=str:/_docs/lexec#/4:{lexec:listname,obj} @propset $tmp/exit1=str:/_docs/lexec#/5:This takes a property based list, and concatenates all its lines together, stripping spaces from the beginning and end of each one. It then evaluates the result for MPI commands, and returns the resulting string. A property based list is a series of properties that are consecutively numbered. The server understands several different formats, and can also read in property lists in either the propnameX format, or the propname#/X format. If no obj argument is supplied, then it looks for the list somewhere down the environment from the trigger object. Otherwise, it looks for the list down the environment from the given object. @propset $tmp/exit1=str:/_docs/links#:5 @propset $tmp/exit1=str:/_docs/links#/1: @propset $tmp/exit1=str:/_docs/links#/2:LINKS @propset $tmp/exit1=str:/_docs/links#/3:{links:obj} @propset $tmp/exit1=str:/_docs/links#/4: @propset $tmp/exit1=str:/_docs/links#/5:Returns the object reference of what the given object if linked to. Since exits can be meta-links, linked to multiple exits, if there is more than one link, then this function returns a list of all the destinations, seperated by carriage return characters. (\r) @propset $tmp/exit1=str:/_docs/List Handling#:6 @propset $tmp/exit1=str:/_docs/List Handling#/1: @propset $tmp/exit1=str:/_docs/List Handling#/2:MPI List-handling functions include: @propset $tmp/exit1=str:/_docs/List Handling#/3: @propset $tmp/exit1=str:/_docs/List Handling#/4:commas count lcommon lmember lrand lremove @propset $tmp/exit1=str:/_docs/List Handling#/5:lsort lunion lunique mklist sublist @propset $tmp/exit1=str:/_docs/List Handling#/6: @propset $tmp/exit1=str:/_docs/list#:~s~ @propset $tmp/exit1=str:/_docs/list#/1: @propset $tmp/exit1=str:/_docs/list#/2:LIST @propset $tmp/exit1=str:/_docs/list#/3:{list:listname} @propset $tmp/exit1=str:/_docs/list#/4:{list:listname,obj} @propset $tmp/exit1=str:/_docs/list#/5: @propset $tmp/exit1=str:/_docs/list#/6:Returns a string, containing a carriage-return delimited list of individual lines from a property based list. A property based list is a series of properties that are consecutively numbered. The server understands several different formats, and can also read in property lists in either the propnameX format, or the propname#/X format. It does NOT evaluate the contents of the list for embedded MPI commands. If no obj argument is supplied, then it looks for the list somewhere down the environment from the trigger object. Otherwise, it looks for the list down the environment from the given object. @propset $tmp/exit1=str:/_docs/literal#:5 @propset $tmp/exit1=str:/_docs/literal#/1: @propset $tmp/exit1=str:/_docs/literal#/2:LIT|LITERAL @propset $tmp/exit1=str:/_docs/literal#/3:{lit:string} @propset $tmp/exit1=str:/_docs/literal#/4: @propset $tmp/exit1=str:/_docs/literal#/5:Returns the literal string given as its parameter. This means you can have things that look like MPI commands within it, and it will not evaluate them, but will rather just treat them as a string. @propset $tmp/exit1=str:/_docs/lmember#:6 @propset $tmp/exit1=str:/_docs/lmember#/1: @propset $tmp/exit1=str:/_docs/lmember#/2:LMEMBER @propset $tmp/exit1=str:/_docs/lmember#/3:{lmember:list,item} @propset $tmp/exit1=str:/_docs/lmember#/4:{lmember:list,item,delimiter} @propset $tmp/exit1=str:/_docs/lmember#/5: @propset $tmp/exit1=str:/_docs/lmember#/6:Returns 0 if the given item is NOT in the given list, otherwise, it returns the item's position in the list. The first list item in the list would return 1, and the third would return 3, for example. If the delimiter argument is given, then it treats the list as if it were delimited by that string, instead of by carriage returns. (\r's) Example: {lmember:{mklist:a,b,c,d,e,f},d} would return 4. @propset $tmp/exit1=str:/_docs/location#:5 @propset $tmp/exit1=str:/_docs/location#/1: @propset $tmp/exit1=str:/_docs/location#/2:LOC|LOCATION @propset $tmp/exit1=str:/_docs/location#/3:{loc:obj} @propset $tmp/exit1=str:/_docs/location#/4: @propset $tmp/exit1=str:/_docs/location#/5:Returns the location of the given object. The object must either be in the vicinity, or it must be controlled by the owner of the trigger object. @propset $tmp/exit1=str:/_docs/locked#:5 @propset $tmp/exit1=str:/_docs/locked#/1: @propset $tmp/exit1=str:/_docs/locked#/2:LOCKED @propset $tmp/exit1=str:/_docs/locked#/3:{locked:player,obj} @propset $tmp/exit1=str:/_docs/locked#/4: @propset $tmp/exit1=str:/_docs/locked#/5:Tests the _/lok (@lock) standard lock property on obj against the given player. Returns true if the lock is locked against the player. @propset $tmp/exit1=str:/_docs/Logical Functions#:6 @propset $tmp/exit1=str:/_docs/Logical Functions#/1: @propset $tmp/exit1=str:/_docs/Logical Functions#/2:MPI Logical functions include: @propset $tmp/exit1=str:/_docs/Logical Functions#/3: @propset $tmp/exit1=str:/_docs/Logical Functions#/4:and eq ge gt if le @propset $tmp/exit1=str:/_docs/Logical Functions#/5:lt ne not or xor @propset $tmp/exit1=str:/_docs/Logical Functions#/6: @propset $tmp/exit1=str:/_docs/Looping Functions#:5 @propset $tmp/exit1=str:/_docs/Looping Functions#/1: @propset $tmp/exit1=str:/_docs/Looping Functions#/2:MPI Looping functions include: @propset $tmp/exit1=str:/_docs/Looping Functions#/3: @propset $tmp/exit1=str:/_docs/Looping Functions#/4:filter fold for foreach parse while @propset $tmp/exit1=str:/_docs/Looping Functions#/5: @propset $tmp/exit1=str:/_docs/lrand#:6 @propset $tmp/exit1=str:/_docs/lrand#/1: @propset $tmp/exit1=str:/_docs/lrand#/2:LRAND @propset $tmp/exit1=str:/_docs/lrand#/3:{lrand:list} @propset $tmp/exit1=str:/_docs/lrand#/4:{lrand:list,seperator} @propset $tmp/exit1=str:/_docs/lrand#/5: @propset $tmp/exit1=str:/_docs/lrand#/6:Returns a randomly picked stringlist item from the given list. If the seperator argument is given, then it will assume that the stringlist has its items delimited by the given seperator string, instead of by carriage returns. @propset $tmp/exit1=str:/_docs/lremove#:5 @propset $tmp/exit1=str:/_docs/lremove#/1: @propset $tmp/exit1=str:/_docs/lremove#/2:LREMOVE @propset $tmp/exit1=str:/_docs/lremove#/3:{lremove:list1,list2} @propset $tmp/exit1=str:/_docs/lremove#/4: @propset $tmp/exit1=str:/_docs/lremove#/5:Returns the contents of list1, with any items that match an item in list2 removed. The resulting list has all duplicate items removed. @propset $tmp/exit1=str:/_docs/lsort#:6 @propset $tmp/exit1=str:/_docs/lsort#/1: @propset $tmp/exit1=str:/_docs/lsort#/2:LSORT @propset $tmp/exit1=str:/_docs/lsort#/3:{lsort:list} @propset $tmp/exit1=str:/_docs/lsort#/4:{lsort:list,var1,var2,expr} @propset $tmp/exit1=str:/_docs/lsort#/5: @propset $tmp/exit1=str:/_docs/lsort#/6:Returns the sorted contents of list. If 4 arguments are given, then it evaluates expr with a pair of values, in var1 and var2. If expr returns true, then it will swap the positions of the two values in the list. It runs this comparison on every pair of items in the list, so it will be evaluated N*N times, where N is the number of items in the list. This method can also be used to randomize a list. Example: {lsort:{&list},v1,v2,{gt:{dice:100},50}} @propset $tmp/exit1=str:/_docs/ltimestr#:5 @propset $tmp/exit1=str:/_docs/ltimestr#/1: @propset $tmp/exit1=str:/_docs/ltimestr#/2:LTIMESTR @propset $tmp/exit1=str:/_docs/ltimestr#/3:{ltimestr:secs} @propset $tmp/exit1=str:/_docs/ltimestr#/4: @propset $tmp/exit1=str:/_docs/ltimestr#/5:Given a time period, in seconds, this will return a string, including a breakdown of all the time units of that period. For example, given a number of seconds, it might return "1 week, 2 days, 10 mins, 52 secs". @propset $tmp/exit1=str:/_docs/lunion#:5 @propset $tmp/exit1=str:/_docs/lunion#/1: @propset $tmp/exit1=str:/_docs/lunion#/2:LUNION @propset $tmp/exit1=str:/_docs/lunion#/3:{lunion:list1,list2} @propset $tmp/exit1=str:/_docs/lunion#/4: @propset $tmp/exit1=str:/_docs/lunion#/5:Combines the contents of list1 and list2, removing any duplicates. @propset $tmp/exit1=str:/_docs/lunique#:5 @propset $tmp/exit1=str:/_docs/lunique#/1: @propset $tmp/exit1=str:/_docs/lunique#/2:LUNIQUE @propset $tmp/exit1=str:/_docs/lunique#/3:{lunique:list} @propset $tmp/exit1=str:/_docs/lunique#/4: @propset $tmp/exit1=str:/_docs/lunique#/5:Returns list with all duplicate items removed. @propset $tmp/exit1=str:/_docs/macros#:16 @propset $tmp/exit1=str:/_docs/macros#/1: @propset $tmp/exit1=str:/_docs/macros#/10: {div_rand:22,160} @propset $tmp/exit1=str:/_docs/macros#/11: @propset $tmp/exit1=str:/_docs/macros#/12:Then the macro would expand out to: @propset $tmp/exit1=str:/_docs/macros#/13: @propset $tmp/exit1=str:/_docs/macros#/14: {add:{div:160,10},{dice:22}} @propset $tmp/exit1=str:/_docs/macros#/15: @propset $tmp/exit1=str:/_docs/macros#/16:After the macro argment substitution is complete, it is then evaluated. @propset $tmp/exit1=str:/_docs/macros#/2:MACROS @propset $tmp/exit1=str:/_docs/macros#/3: @propset $tmp/exit1=str:/_docs/macros#/4:If the MPI interpreter comes across a function name that it does not recognize, it will look in the _msgmacs/ propdirs down the environment from the trigger object, for a property with the name of the function. If it does find it there, then it takes the value of that property, and substitutes it in for the function as a macro. The arguments to the function replace the {:1} through {:9} markers in the macro definition. For example, if there were a property set on #0, defined as: @propset $tmp/exit1=str:/_docs/macros#/5: @propset $tmp/exit1=str:/_docs/macros#/6: _msgmacs/div_rand:{add:{div:{:2},10},{dice:{:1}}} @propset $tmp/exit1=str:/_docs/macros#/7: @propset $tmp/exit1=str:/_docs/macros#/8:And you had some MPI code that looked like: @propset $tmp/exit1=str:/_docs/macros#/9: @propset $tmp/exit1=str:/_docs/Math Functions#:7 @propset $tmp/exit1=str:/_docs/Math Functions#/1: @propset $tmp/exit1=str:/_docs/Math Functions#/2:MPI Math functions include: @propset $tmp/exit1=str:/_docs/Math Functions#/3: @propset $tmp/exit1=str:/_docs/Math Functions#/4:abs add dec dice dist div @propset $tmp/exit1=str:/_docs/Math Functions#/5:inc max min mod mult sign @propset $tmp/exit1=str:/_docs/Math Functions#/6:subt @propset $tmp/exit1=str:/_docs/Math Functions#/7: @propset $tmp/exit1=str:/_docs/maximum#:5 @propset $tmp/exit1=str:/_docs/maximum#/1: @propset $tmp/exit1=str:/_docs/maximum#/2:MAX|MAXIMUM @propset $tmp/exit1=str:/_docs/maximum#/3:{max:expr1,expr2} @propset $tmp/exit1=str:/_docs/maximum#/4: @propset $tmp/exit1=str:/_docs/maximum#/5:Returns the greater of the values of expr1 and expr2. @propset $tmp/exit1=str:/_docs/midstr#:6 @propset $tmp/exit1=str:/_docs/midstr#/1: @propset $tmp/exit1=str:/_docs/midstr#/2:MIDSTR @propset $tmp/exit1=str:/_docs/midstr#/3:{midstr:str,pos} @propset $tmp/exit1=str:/_docs/midstr#/4:{midstr:str,pos1,pos2} @propset $tmp/exit1=str:/_docs/midstr#/5: @propset $tmp/exit1=str:/_docs/midstr#/6:Returns the substring that starts at pos1 within str. If no pos2 is given, then the returned string is only the character at the given pos1 position. if a pos2 position is given, then it returns the substring beginning at pos1 and ending at pos2, inclusive. If pos1 or pos2 are negative, then they represent the position that is that absolute number of characters from the end of the string. The first character in str is 1, and the last one can always be referenced by -1. If a position would be before the beginning of the string, it is assumed to be at the beginning of the string. If it would be beyond the end of the string, it is assumed to be at the last character. If the starting position is later in the string than the ending position, then the returned string has the characters in reverse order. If either pos1 or pos2 are 0, then this returns a null string. ("") @propset $tmp/exit1=str:/_docs/minimum#:5 @propset $tmp/exit1=str:/_docs/minimum#/1: @propset $tmp/exit1=str:/_docs/minimum#/2:MIN|MINIMUM @propset $tmp/exit1=str:/_docs/minimum#/3:{min:expr1,expr2} @propset $tmp/exit1=str:/_docs/minimum#/4: @propset $tmp/exit1=str:/_docs/minimum#/5:Returns the lesser of the values of expr1 and expr2. @propset $tmp/exit1=str:/_docs/Miscellaneous#:6 @propset $tmp/exit1=str:/_docs/Miscellaneous#/1: @propset $tmp/exit1=str:/_docs/Miscellaneous#/2:See the 'mpi' entries for the following miscellaneous functions: @propset $tmp/exit1=str:/_docs/Miscellaneous#/3: @propset $tmp/exit1=str:/_docs/Miscellaneous#/4:debug debugif isdbref isnum muckname muf @propset $tmp/exit1=str:/_docs/Miscellaneous#/5:version func macros @propset $tmp/exit1=str:/_docs/Miscellaneous#/6: @propset $tmp/exit1=str:/_docs/MiscFuncs#:4 @propset $tmp/exit1=str:/_docs/MiscFuncs#/1:Miscellaneous Functions @propset $tmp/exit1=str:/_docs/MiscFuncs#/2: @propset $tmp/exit1=str:/_docs/MiscFuncs#/3:debug debugif isdbref isnum muckname muf @propset $tmp/exit1=str:/_docs/MiscFuncs#/4:version @propset $tmp/exit1=str:/_docs/mklist#:5 @propset $tmp/exit1=str:/_docs/mklist#/1: @propset $tmp/exit1=str:/_docs/mklist#/2:MKLIST @propset $tmp/exit1=str:/_docs/mklist#/3:{mklist:value...} @propset $tmp/exit1=str:/_docs/mklist#/4: @propset $tmp/exit1=str:/_docs/mklist#/5:Returns a list with all the given values as list items, seperated by carriage returns. ('\r's) Example: {mklist:Tom,Dick,Harry} returns "Tom\rDick\rHarry". Note: A maximum of nine items can be passed to the {mklist} function. If you need more, you can chain {mklist}s together. Example: {mklist:{mklist:a,b,c,d,e,f,g,h,i},j,k,l,m,n,o,p} @propset $tmp/exit1=str:/_docs/modulo#:5 @propset $tmp/exit1=str:/_docs/modulo#/1: @propset $tmp/exit1=str:/_docs/modulo#/2:MOD|MODULO @propset $tmp/exit1=str:/_docs/modulo#/3:{mod:expr1,expr2} @propset $tmp/exit1=str:/_docs/modulo#/4: @propset $tmp/exit1=str:/_docs/modulo#/5:Returns the leftover remainder of expr1 divided by expr2. If more than two arguments are given, then the first arguments is modded by the second, then the result of that would be modded by the third, and so on and so forth. For example: {mod:91,20,3} would be read as 91 % 20 % 3, and a result of 2 would be returned. @propset $tmp/exit1=str:/_docs/money#:5 @propset $tmp/exit1=str:/_docs/money#/1: @propset $tmp/exit1=str:/_docs/money#/2:MONEY @propset $tmp/exit1=str:/_docs/money#/3:{money:obj} @propset $tmp/exit1=str:/_docs/money#/4: @propset $tmp/exit1=str:/_docs/money#/5:This returns the value of an object of TYPE_THING, or returns how many pennies a player has. @propset $tmp/exit1=str:/_docs/muckname#:5 @propset $tmp/exit1=str:/_docs/muckname#/1: @propset $tmp/exit1=str:/_docs/muckname#/2:MUCKNAME @propset $tmp/exit1=str:/_docs/muckname#/3:{muckname} @propset $tmp/exit1=str:/_docs/muckname#/4: @propset $tmp/exit1=str:/_docs/muckname#/5:Returns the muck name string. Example: FurryMUCK @propset $tmp/exit1=str:/_docs/muf#:5 @propset $tmp/exit1=str:/_docs/muf#/1: @propset $tmp/exit1=str:/_docs/muf#/2:MUF @propset $tmp/exit1=str:/_docs/muf#/3:{muf:prog,arg} @propset $tmp/exit1=str:/_docs/muf#/4: @propset $tmp/exit1=str:/_docs/muf#/5:Runs the given MUF prog with the string arg on the stack. This returns the top stack value when the prog exits. If the MPI code was run from a propqueue like _listen, or _connect, then {muf} cannot run a MUF program with a Mucker level of less than 3 @propset $tmp/exit1=str:/_docs/multiply#:6 @propset $tmp/exit1=str:/_docs/multiply#/1: @propset $tmp/exit1=str:/_docs/multiply#/2:MULT|MULTIPLY @propset $tmp/exit1=str:/_docs/multiply#/3:{mult:expr1,expr2} @propset $tmp/exit1=str:/_docs/multiply#/4:{mult:expr1,expr2,expr3...} @propset $tmp/exit1=str:/_docs/multiply#/5: @propset $tmp/exit1=str:/_docs/multiply#/6:Returns the product of the values expr1 and expr2. If more than two args are given, then they are all multiplied together to get the result. @propset $tmp/exit1=str:/_docs/name#:5 @propset $tmp/exit1=str:/_docs/name#/1: @propset $tmp/exit1=str:/_docs/name#/2:NAME @propset $tmp/exit1=str:/_docs/name#/3:{name:obj} @propset $tmp/exit1=str:/_docs/name#/4: @propset $tmp/exit1=str:/_docs/name#/5:Returns the name of the given object. If the object is an exit, the name returned is the first exit name it has before the first ';'. The object must be in the vicinity, or controlled by the owner of the trigger object. @propset $tmp/exit1=str:/_docs/nearby#:6 @propset $tmp/exit1=str:/_docs/nearby#/1: @propset $tmp/exit1=str:/_docs/nearby#/2:NEARBY @propset $tmp/exit1=str:/_docs/nearby#/3:{nearby:obj} @propset $tmp/exit1=str:/_docs/nearby#/4:{nearby:obj,obj2} @propset $tmp/exit1=str:/_docs/nearby#/5: @propset $tmp/exit1=str:/_docs/nearby#/6:If one argument is given, then this returns true ("1") if the given object is nearby to the trigger object. If two arguments are given, then it returns true if the two objects are nearby one another. Otherwise, this returns false. ("0") Nearby is defined as: 1) The two objects are in the same location, or 2) One object contains the other, or 3) the two objects are in fact the same object. @propset $tmp/exit1=str:/_docs/nl#:13 @propset $tmp/exit1=str:/_docs/nl#/1: @propset $tmp/exit1=str:/_docs/nl#/10: @propset $tmp/exit1=str:/_docs/nl#/11: This is @propset $tmp/exit1=str:/_docs/nl#/12: an example @propset $tmp/exit1=str:/_docs/nl#/13: of using newlines. @propset $tmp/exit1=str:/_docs/nl#/2:NL|\r @propset $tmp/exit1=str:/_docs/nl#/3:{nl} or \r @propset $tmp/exit1=str:/_docs/nl#/4: @propset $tmp/exit1=str:/_docs/nl#/5:Returns a carriage return character. This can be used to seperate items in a list, or can split the string at that point, starting a new line. Example: the string: @propset $tmp/exit1=str:/_docs/nl#/6: @propset $tmp/exit1=str:/_docs/nl#/7: This is\ran example{nl}of using newlines. @propset $tmp/exit1=str:/_docs/nl#/8: @propset $tmp/exit1=str:/_docs/nl#/9:would print out like: @propset $tmp/exit1=str:/_docs/not#:5 @propset $tmp/exit1=str:/_docs/not#/1: @propset $tmp/exit1=str:/_docs/not#/2:NOT|! @propset $tmp/exit1=str:/_docs/not#/3:{not:expr} @propset $tmp/exit1=str:/_docs/not#/4: @propset $tmp/exit1=str:/_docs/not#/5:Returns the logical NOT of expr. If expr was true, this returns false. If expr was false, this returns true. @propset $tmp/exit1=str:/_docs/null#:5 @propset $tmp/exit1=str:/_docs/null#/1: @propset $tmp/exit1=str:/_docs/null#/2:NULL @propset $tmp/exit1=str:/_docs/null#/3:{null:expr...} @propset $tmp/exit1=str:/_docs/null#/4: @propset $tmp/exit1=str:/_docs/null#/5:Returns a null string, no matter what the expressions within it return. This can take up to nine arguments, though you could pass the output of several commands as one argument. @propset $tmp/exit1=str:/_docs/online#:5 @propset $tmp/exit1=str:/_docs/online#/1: @propset $tmp/exit1=str:/_docs/online#/2:ONLINE @propset $tmp/exit1=str:/_docs/online#/3:{online} @propset $tmp/exit1=str:/_docs/online#/4: @propset $tmp/exit1=str:/_docs/online#/5:Returns a list of players who are online. This function can only be executed by wizbitted objects. @propset $tmp/exit1=str:/_docs/ontime#:5 @propset $tmp/exit1=str:/_docs/ontime#/1: @propset $tmp/exit1=str:/_docs/ontime#/2:ONTIME @propset $tmp/exit1=str:/_docs/ontime#/3:{ontime:player} @propset $tmp/exit1=str:/_docs/ontime#/4: @propset $tmp/exit1=str:/_docs/ontime#/5:Returns player online time in seconds. If the given player is not connected, or is not a player object at all, then this will return -1. This returns the online time for the most recently connected connection, if there are multiple connects. @propset $tmp/exit1=str:/_docs/or#:5 @propset $tmp/exit1=str:/_docs/or#/1: @propset $tmp/exit1=str:/_docs/or#/2:OR @propset $tmp/exit1=str:/_docs/or#/3:{or:expr1,expr2...} @propset $tmp/exit1=str:/_docs/or#/4: @propset $tmp/exit1=str:/_docs/or#/5:Returns true if expr1 or expr2 evaluate as true. Otherwise, this returns false. If expr1 was true, this doesn't bother to exaluate expr2, as it does C-style shortcutting. If there are more than two arguments, then this will evaluate them until either one returns true, or until it has evaluated all the expressions. This returns false only if all of the expressions return false. @propset $tmp/exit1=str:/_docs/otell#:7 @propset $tmp/exit1=str:/_docs/otell#/1: @propset $tmp/exit1=str:/_docs/otell#/2:OTELL @propset $tmp/exit1=str:/_docs/otell#/3:{otell:string} @propset $tmp/exit1=str:/_docs/otell#/4:{otell:string,room} @propset $tmp/exit1=str:/_docs/otell#/5:{otell:string,room,player} @propset $tmp/exit1=str:/_docs/otell#/6: @propset $tmp/exit1=str:/_docs/otell#/7:This will tell the given string to all the players in the room, except for the given player. If no room argument is given, it is assumed to be the room that the triggering player is in. If no player is given, then it assumes that you want to skip sending the message to the triggering player. If you pass it a player of #-1, it will send the message to all the players in the room. This returns the message that was sent. If the trigger isn't a room, or an exit on a room, and if the message doesn't already begin with the user's name, then the user's name will be prepended to the message. @propset $tmp/exit1=str:/_docs/Overview#:4 @propset $tmp/exit1=str:/_docs/Overview#/1:MPI is an interpretted language with a LISP-like syntax available to all players. Because it is universally available, MPI includes security features that restrict its power. In general, MPI can only read props on the triggering object and on objects controlled by the controller of the object on which the MPI string is stored, and can only set props on the latter... on objects controlled by the owner of the MPI object. Other than setting props as mentioned, the extent to which MPI can modify the database is limited, but is ideally suited for message-handling. And because it is interpretted, it is well-suited for one-off programming tasks: no separate compiling and linking operations are needed, nor is a separate program object for holding the code. @propset $tmp/exit1=str:/_docs/Overview#/2: @propset $tmp/exit1=str:/_docs/Overview#/3:See 'mpi syntax' for an overview. @propset $tmp/exit1=str:/_docs/Overview#/4:Try 'mpi #contents', 'mpi #search = , 'mpi , and 'mpi #help'. @propset $tmp/exit1=str:/_docs/owner#:5 @propset $tmp/exit1=str:/_docs/owner#/1: @propset $tmp/exit1=str:/_docs/owner#/2:OWNER @propset $tmp/exit1=str:/_docs/owner#/3:{owner:obj} @propset $tmp/exit1=str:/_docs/owner#/4: @propset $tmp/exit1=str:/_docs/owner#/5:Returns the owner of the given object. The object must be in the vicinity, or be controlled by the trigger object's owner. @propset $tmp/exit1=str:/_docs/parse#:7 @propset $tmp/exit1=str:/_docs/parse#/1: @propset $tmp/exit1=str:/_docs/parse#/2:PARSE @propset $tmp/exit1=str:/_docs/parse#/3:{parse:var,list,expr} @propset $tmp/exit1=str:/_docs/parse#/4:{parse:var,list,expr,sep} @propset $tmp/exit1=str:/_docs/parse#/5:{parse:var,list,expr,sep,s2} @propset $tmp/exit1=str:/_docs/parse#/6: @propset $tmp/exit1=str:/_docs/parse#/7:This evaluates expr for each and every item in the given list. On each evaluation, the temporary variable var will contain the value of the item under scrutiny. This function returns a list containing the output of expr for each item within the list. This lets you do direct translation of a list of dbrefs, for example, into a list of names. var will only be defined for the duration of expr, and will be undefined after the {filter} construct finishes. If sep is given, then it uses that string as the item seperator in the input list, instead of the usual carriage return character. If s2 is defined, then it will use that string to seperate the items in the list it returns, instead of the normal carriage return. sep and s2 can be multiple characters long. @propset $tmp/exit1=str:/_docs/pronouns#:6 @propset $tmp/exit1=str:/_docs/pronouns#/1: @propset $tmp/exit1=str:/_docs/pronouns#/2:PRONOUNS @propset $tmp/exit1=str:/_docs/pronouns#/3:{pronouns:string} @propset $tmp/exit1=str:/_docs/pronouns#/4:{pronouns:string,object} @propset $tmp/exit1=str:/_docs/pronouns#/5: @propset $tmp/exit1=str:/_docs/pronouns#/6:If passed one argument, evaluates the string and does pronoun substitution with regards to the using player. If given two args, it does the pronoun substitution with regards to the given object. @propset $tmp/exit1=str:/_docs/prop!#:6 @propset $tmp/exit1=str:/_docs/prop!#/1: @propset $tmp/exit1=str:/_docs/prop!#/2:PROP! @propset $tmp/exit1=str:/_docs/prop!#/3:{prop!:propname} @propset $tmp/exit1=str:/_docs/prop!#/4:{prop!:propname,obj} @propset $tmp/exit1=str:/_docs/prop!#/5: @propset $tmp/exit1=str:/_docs/prop!#/6:Returns the literal string value of the given property. If no object parameter is passed to it, it looks for the property on the trigger. Otherwise, it looks for the property on the object specified. If the property is not found, this returns an empty string. If the property that it tries to access is read restricted and the owner of the trigger object does not own the object that the property is found on, then the MPI script stops with a Permission denied error. @propset $tmp/exit1=str:/_docs/prop#:6 @propset $tmp/exit1=str:/_docs/prop#/1: @propset $tmp/exit1=str:/_docs/prop#/2:PROP @propset $tmp/exit1=str:/_docs/prop#/3:{prop:propname} @propset $tmp/exit1=str:/_docs/prop#/4:{prop:propname,obj} @propset $tmp/exit1=str:/_docs/prop#/5: @propset $tmp/exit1=str:/_docs/prop#/6:Returns the literal string value of the given property. If no object parameter is passed to it, it looks for the property somewhere down the environment from the trigger object. Otherwise, it looks down the environment from the object specified. If the property is not found, this returns an empty string. If the property that it tries to access is read restricted and the owner of the trigger object does not own the object that the property is found on, then the MPI script stops with a Permission denied error. @propset $tmp/exit1=str:/_docs/Property Handling#:7 @propset $tmp/exit1=str:/_docs/Property Handling#/1: @propset $tmp/exit1=str:/_docs/Property Handling#/2:MPI Proprty-handling functions include: @propset $tmp/exit1=str:/_docs/Property Handling#/3: @propset $tmp/exit1=str:/_docs/Property Handling#/4:concat delprop exec exec! index index! @propset $tmp/exit1=str:/_docs/Property Handling#/5:lexec list listprops prop prop! propdir @propset $tmp/exit1=str:/_docs/Property Handling#/6:rand select store timesub @propset $tmp/exit1=str:/_docs/Property Handling#/7: @propset $tmp/exit1=str:/_docs/rand#:6 @propset $tmp/exit1=str:/_docs/rand#/1: @propset $tmp/exit1=str:/_docs/rand#/2:RAND @propset $tmp/exit1=str:/_docs/rand#/3:{rand:listname} @propset $tmp/exit1=str:/_docs/rand#/4:{rand:listname,obj} @propset $tmp/exit1=str:/_docs/rand#/5: @propset $tmp/exit1=str:/_docs/rand#/6:Returns the value of a randomly picked list item from a property based list. If no obj parameter is given, then it looks down the environment from the trigger object for the list. Otherwise, it looks down the environment from the given object. @propset $tmp/exit1=str:/_docs/ref#:5 @propset $tmp/exit1=str:/_docs/ref#/1: @propset $tmp/exit1=str:/_docs/ref#/2:REF @propset $tmp/exit1=str:/_docs/ref#/3:{ref:obj} @propset $tmp/exit1=str:/_docs/ref#/4: @propset $tmp/exit1=str:/_docs/ref#/5:Returns the dbref of the given object in the form #xxxx. The object must be in the vicinity, or controlled by the owner of the trigger object. @propset $tmp/exit1=str:/_docs/right#:7 @propset $tmp/exit1=str:/_docs/right#/1: @propset $tmp/exit1=str:/_docs/right#/2:RIGHT @propset $tmp/exit1=str:/_docs/right#/3:{right:string} @propset $tmp/exit1=str:/_docs/right#/4:{right:string,fieldwidth} @propset $tmp/exit1=str:/_docs/right#/5:{right:string,fieldwidth,padstring} @propset $tmp/exit1=str:/_docs/right#/6: @propset $tmp/exit1=str:/_docs/right#/7:Takes a string and pads it to fit the given fieldwidth, with the string right justified. If no padstring is given, it assumes that it will pad the string with spaces. If no fieldwidth is given, it assumes that the field width is 78 characters. Example: {right:Hello,10,_.} would return the string "_._._Hello" @propset $tmp/exit1=str:/_docs/secs#:5 @propset $tmp/exit1=str:/_docs/secs#/1: @propset $tmp/exit1=str:/_docs/secs#/2:SECS @propset $tmp/exit1=str:/_docs/secs#/3:{secs} @propset $tmp/exit1=str:/_docs/secs#/4: @propset $tmp/exit1=str:/_docs/secs#/5:Returns system time: the number of seconds since midnight 1/1/70 GMT @propset $tmp/exit1=str:/_docs/select#:11 @propset $tmp/exit1=str:/_docs/select#/1: @propset $tmp/exit1=str:/_docs/select#/10: _junk#/20:four @propset $tmp/exit1=str:/_docs/select#/11:Then {select:9,_junk} will return "two", {select:16,_junk} will return "three", and {select:25,_junk} will return "four". @propset $tmp/exit1=str:/_docs/select#/2:SELECT @propset $tmp/exit1=str:/_docs/select#/3:{select:value,listname} @propset $tmp/exit1=str:/_docs/select#/4:{select:value,listname,object} @propset $tmp/exit1=str:/_docs/select#/5: @propset $tmp/exit1=str:/_docs/select#/6:Returns the value of a single list item from a sparse property list. The item chosen is the one who's line number is the largest one that is less than or equal to the given value. If the list is missing any items, then {select} will return the item in the list with the highest line number that is less than or equal to the given value. ie: If the list has the following entries: @propset $tmp/exit1=str:/_docs/select#/7: _junk#/1:one @propset $tmp/exit1=str:/_docs/select#/8: _junk#/5:two @propset $tmp/exit1=str:/_docs/select#/9: _junk#/16:three @propset $tmp/exit1=str:/_docs/set#:5 @propset $tmp/exit1=str:/_docs/set#/1: @propset $tmp/exit1=str:/_docs/set#/2:SET @propset $tmp/exit1=str:/_docs/set#/3:{set:var,value} @propset $tmp/exit1=str:/_docs/set#/4: @propset $tmp/exit1=str:/_docs/set#/5:This sets the value of the given named variable to the given value. If no variable with that given name is currently defined, then this gives an error message complaining about that. @propset $tmp/exit1=str:/_docs/sign#:5 @propset $tmp/exit1=str:/_docs/sign#/1: @propset $tmp/exit1=str:/_docs/sign#/2:SIGN @propset $tmp/exit1=str:/_docs/sign#/3:{sign:expr} @propset $tmp/exit1=str:/_docs/sign#/4: @propset $tmp/exit1=str:/_docs/sign#/5:Returns -1 if expr is negative. Returns 1 if expr is positive. If expr is 0, then it returns 0. @propset $tmp/exit1=str:/_docs/smatch#:13 @propset $tmp/exit1=str:/_docs/smatch#/1: @propset $tmp/exit1=str:/_docs/smatch#/10: [^abd-z] matches one char is it is NOT a, b, or between d and z. @propset $tmp/exit1=str:/_docs/smatch#/11: {word1|word2} matches one word, if it is word1, or word2. @propset $tmp/exit1=str:/_docs/smatch#/12: {^word1|word2} matches one word, if it is NOT word1 or word2. @propset $tmp/exit1=str:/_docs/smatch#/13: \ escapes any of the prev chars, making it not special. @propset $tmp/exit1=str:/_docs/smatch#/2:SMATCH @propset $tmp/exit1=str:/_docs/smatch#/3:{smatch:str,pattern} @propset $tmp/exit1=str:/_docs/smatch#/4: @propset $tmp/exit1=str:/_docs/smatch#/5:Matches 'str' against the wildcard pattern. If there is a match, this returns true, or "1". If it doesn't match, this returns a value of "0", or false. In wildcard patterns, the following characters have the following meanings: @propset $tmp/exit1=str:/_docs/smatch#/6: * matches any number of any character. @propset $tmp/exit1=str:/_docs/smatch#/7: ? matches one character, of any type. @propset $tmp/exit1=str:/_docs/smatch#/8: [abcde] matches one char, if it is a, b, c, d, or e. @propset $tmp/exit1=str:/_docs/smatch#/9: [a-z] matches one char, if it is between a and z, inclusive. @propset $tmp/exit1=str:/_docs/store#:6 @propset $tmp/exit1=str:/_docs/store#/1: @propset $tmp/exit1=str:/_docs/store#/2:STORE @propset $tmp/exit1=str:/_docs/store#/3:{store:val,prop} @propset $tmp/exit1=str:/_docs/store#/4:{store:val,prop,obj} @propset $tmp/exit1=str:/_docs/store#/5: @propset $tmp/exit1=str:/_docs/store#/6:Stores a string value in a given property. If no obj parameter is given, then it stores the property on the trigger object. Otherwise, it will store it on the given object. If you specify a propname that is protected, you will get a Permission Denied error. You are only allowed to store properties on objects controlled by the owner of the trigger object. The trigger object is the object that triggered the evaluation of the MPI commands. This function returns the string that is stored as the prop value. If you store a null value in the property, then it will remove the property if it is not a propdir. It will clear the value of the prop if it IS a propdir. @propset $tmp/exit1=str:/_docs/strimestr#:5 @propset $tmp/exit1=str:/_docs/strimestr#/1: @propset $tmp/exit1=str:/_docs/strimestr#/2:STIMESTR @propset $tmp/exit1=str:/_docs/strimestr#/3:{stimestr:secs} @propset $tmp/exit1=str:/_docs/strimestr#/4: @propset $tmp/exit1=str:/_docs/strimestr#/5:Given a time period, in seconds, this will return the most significant time unit of that time period. For example, a number of seconds, that is equivalent to 9 days, 23 hours, 10 minutes, and 52 seconds, will be have the value "9d" returned, as the abbreviated most significant time unit. @propset $tmp/exit1=str:/_docs/String Functions#:7 @propset $tmp/exit1=str:/_docs/String Functions#/1: @propset $tmp/exit1=str:/_docs/String Functions#/2:MPI String-handling functions include: @propset $tmp/exit1=str:/_docs/String Functions#/3: @propset $tmp/exit1=str:/_docs/String Functions#/4:center eval instr left lit midstr @propset $tmp/exit1=str:/_docs/String Functions#/5:nl null otell pronouns right smatch @propset $tmp/exit1=str:/_docs/String Functions#/6:strip strlen subst tell tolower toupper @propset $tmp/exit1=str:/_docs/String Functions#/7: @propset $tmp/exit1=str:/_docs/strip#:5 @propset $tmp/exit1=str:/_docs/strip#/1: @propset $tmp/exit1=str:/_docs/strip#/2:STRIP @propset $tmp/exit1=str:/_docs/strip#/3:{strip:string} @propset $tmp/exit1=str:/_docs/strip#/4: @propset $tmp/exit1=str:/_docs/strip#/5:Returns a copy of string with all the spaces stripped from the beginning and the end. @propset $tmp/exit1=str:/_docs/sublist#:7 @propset $tmp/exit1=str:/_docs/sublist#/1: @propset $tmp/exit1=str:/_docs/sublist#/2:SUBLIST @propset $tmp/exit1=str:/_docs/sublist#/3:{sublist:list,pos1} @propset $tmp/exit1=str:/_docs/sublist#/4:{sublist:list,pos1,pos2} @propset $tmp/exit1=str:/_docs/sublist#/5:{sublist:list,pos1,pos2,sep} @propset $tmp/exit1=str:/_docs/sublist#/6: @propset $tmp/exit1=str:/_docs/sublist#/7:Takes a list, and returns a subset of the list items within it. The subset is all the list items between list item pos1, and list item pos2, inclusive. If the pos2 argument is omitted, it assumes that pos2 is the same as pos1. If pos2 is less than pos1, then all the list items between pos2 and pos1 are returned, in reversed order. If pos1 or pos2 are negative, it counts that many list items back from the end of the list, so -1 is the last list item, and -5 would be the fifth from last list item. The input list is assumed to be delimited by carriage returns (\r) unless the sep argument is given. @propset $tmp/exit1=str:/_docs/subst#:5 @propset $tmp/exit1=str:/_docs/subst#/1: @propset $tmp/exit1=str:/_docs/subst#/2:SUBST @propset $tmp/exit1=str:/_docs/subst#/3:{subst:str,old,new} @propset $tmp/exit1=str:/_docs/subst#/4: @propset $tmp/exit1=str:/_docs/subst#/5:Returns a copy of 'str' with all substring instances of 'old' replaced by the text specified by 'new'. Basically just substitutes the new text for the old text in str. example: {subst:Hello World!,l,r} would return "Herro Worrd!" @propset $tmp/exit1=str:/_docs/subtraction#:~s~ @propset $tmp/exit1=str:/_docs/subtraction#/1: @propset $tmp/exit1=str:/_docs/subtraction#/2:SUBT|SUBTRACTION @propset $tmp/exit1=str:/_docs/subtraction#/3:{subt:expr1,expr2} @propset $tmp/exit1=str:/_docs/subtraction#/4:{subt:expr1,expr2,expr3...} @propset $tmp/exit1=str:/_docs/subtraction#/5:Returns the difference of the values expr1 and expr2. If more than two args are given, all values are subtracted from the first value in sequence. For example: {subt:10,3,2,4} would be read as 10 - 3 - 2 - 4, and it would return a result of 1. @propset $tmp/exit1=str:/_docs/syn2#:~s~ @propset $tmp/exit1=str:/_docs/syn2#/1:Then the next-innermost expression, effectively {eq:#123,#1}, would be evaluated. The {equals} function returns true if the two arguments supplied are the same; otherwise it returns false. In this case, the two arguments are not the same, so {equals} will return false. At this point, the MPI value for false -- the string "0" -- will replace the function. (A "" null string is also false in MPI. Any value other than "" or "0" is considered true.) So, at this point the string would in effect be... @propset $tmp/exit1=str:/_docs/syn2#/2: @propset $tmp/exit1=str:/_docs/syn2#/3: {if:"0",Hey it's God!,Hello world!} @propset $tmp/exit1=str:/_docs/syn2#/4: @propset $tmp/exit1=str:/_docs/syn2#/5:See 'syn3' @propset $tmp/exit1=str:/_docs/syn3#:~s~ @propset $tmp/exit1=str:/_docs/syn3#/1:Finally, this, the outermost function will be evaluated. The {if} function takes three arguments. If the first argument is true, it returns the second argument. If the first argument is false, it returns the third argument. In this example, the first argument is false, so the the third argument will be returned: MPI will return the string "Hello world!" to player #123. If God had triggered the string, the {if} test would have been true, and the string "Hey it's God!" would have been returned instead. @propset $tmp/exit1=str:/_docs/syn3#/2: @propset $tmp/exit1=str:/_docs/syn3#/3:See 'syn4' @propset $tmp/exit1=str:/_docs/syn4#:~s~ @propset $tmp/exit1=str:/_docs/syn4#/1:The arguments of functions are separated by commas. Commas appearing in argument strings will confuse the parser: functions will seem -- to it -- to have too many arguments. So, commas in argument strings must be 'escaped'... i.e., preceded with a \ backslash escape character, which tells the parser to treat the next character literally, rather than as an MPI instruction. For example, if we wanted our first example to say "Hey, it's God!" or "Hello, world!", the commas would need to be escaped with a backslash character. @propset $tmp/exit1=str:/_docs/syn4#/2: @propset $tmp/exit1=str:/_docs/syn4#/3: {if:{eq:{ref:me},#1},Hey\, it's God!,Hello\, world!} @propset $tmp/exit1=str:/_docs/syn4#/4: @propset $tmp/exit1=str:/_docs/syn4#/5:See 'syn5' @propset $tmp/exit1=str:/_docs/syn5#:~s~ @propset $tmp/exit1=str:/_docs/syn5#/1: @propset $tmp/exit1=str:/_docs/syn5#/2:The keywords 'me' and 'here' can be used as normal. In addition, MPI supports the keyword 'this', which will be replaced by the dbref of the object on which the MPI is stored. @propset $tmp/exit1=str:/_docs/syn5#/3: @propset $tmp/exit1=str:/_docs/syn5#/4:* @propset $tmp/exit1=str:/_docs/syn5#/5: @propset $tmp/exit1=str:/_docs/syn5#/6:The variable functions {&cmd}, {&arg}, and {&how} may be used to retrive information about how MPI was triggered. {&cmd} stores the command name typed to trigger the MPI. {&arg} stores any arguments typed along with the command. {&how} stores the method by which MPI was triggered, and will have values such as "(@desc)", "(@succ)", "(@osucc)", "(@lock)", etc. @propset $tmp/exit1=str:/_docs/syn5#/7: @propset $tmp/exit1=str:/_docs/syn5#/8:See 'syn6' @propset $tmp/exit1=str:/_docs/syn6#:~s~ @propset $tmp/exit1=str:/_docs/syn6#/1: @propset $tmp/exit1=str:/_docs/syn6#/10: @propset $tmp/exit1=str:/_docs/syn6#/11:See 'syn7' @propset $tmp/exit1=str:/_docs/syn6#/2:Functions can be nested up to 26 levels deep. Loops may iterate a maximum of 256 times, at which point the automatically exit. Lists may have a maximum of 256 lines, or 4096 characters, whichever is less. @propset $tmp/exit1=str:/_docs/syn6#/3: @propset $tmp/exit1=str:/_docs/syn6#/4:* @propset $tmp/exit1=str:/_docs/syn6#/5: @propset $tmp/exit1=str:/_docs/syn6#/6:An MPI string that appears in a _/ prop (a @succ message, a @desc, and so forth) will be parsed automatically. For other triggering props, the parser must be called by an & ambersand at the beginning of the prop string. @propset $tmp/exit1=str:/_docs/syn6#/7: @propset $tmp/exit1=str:/_docs/syn6#/8:> @set me=_oarrive/aaa:&{null:{otell:pads in quietly.}} @propset $tmp/exit1=str:/_docs/syn6#/9: Property set. @propset $tmp/exit1=str:/_docs/syn7#:~s~ @propset $tmp/exit1=str:/_docs/syn7#/1: @propset $tmp/exit1=str:/_docs/syn7#/2:Complex or very long MPI instructions are often better stored in a list, where whitespace can be used to make the code more readable, rather than in a single prop where all will run together in an opaque mass of characters. A simple pointing string using the {lexec} ('execute list') function can then be placed in the triggering prop. @propset $tmp/exit1=str:/_docs/syn7#/3: @propset $tmp/exit1=str:/_docs/syn7#/4:See 'example' for an example, and 'debugging' for information on the debugger. @propset $tmp/exit1=str:/_docs/Syntax#:9 @propset $tmp/exit1=str:/_docs/Syntax#/1:MPI's syntax consists of nested functions enlcosed in curly braces that are evaluated left-to-right and 'from the inside out'. For example... @propset $tmp/exit1=str:/_docs/Syntax#/2: @propset $tmp/exit1=str:/_docs/Syntax#/3: {if:{eq:{ref:me},#1},Hey it's God!,Hello world!} @propset $tmp/exit1=str:/_docs/Syntax#/4: @propset $tmp/exit1=str:/_docs/Syntax#/5:The MPI parser will first evaluate the innermost function, {ref:me}. The {ref} function returns the dbref of its single argument, so {ref:me} returns the user's dbref. The returned expression 'replaces', as it were, the function. So, if the user's dbref were #123, the MPI string would in effect and at this moment be... @propset $tmp/exit1=str:/_docs/Syntax#/6: @propset $tmp/exit1=str:/_docs/Syntax#/7: {if:{eq:#123,#1},Hey it's God!,Hello world!.} @propset $tmp/exit1=str:/_docs/Syntax#/8: @propset $tmp/exit1=str:/_docs/Syntax#/9:See 'syn2' @propset $tmp/exit1=str:/_docs/tell#:6 @propset $tmp/exit1=str:/_docs/tell#/1: @propset $tmp/exit1=str:/_docs/tell#/2:TELL @propset $tmp/exit1=str:/_docs/tell#/3:{tell:string} @propset $tmp/exit1=str:/_docs/tell#/4:{tell:string,player} @propset $tmp/exit1=str:/_docs/tell#/5: @propset $tmp/exit1=str:/_docs/tell#/6:If passed only a string, tells the user that string. If passed both a string, and a player dbref, it will tell the given player the message. This returns the message that was sent. If the trigger isn't a room, or an exit on a room, and if the message doesn't already begin with the user's name, then the user's name will be prepended to the message. The two exceptions to this are that if the messages is being sent to the owner of the trigger, or to the user, then the user's name will not be prepended. @propset $tmp/exit1=str:/_docs/testlock#:7 @propset $tmp/exit1=str:/_docs/testlock#/1: @propset $tmp/exit1=str:/_docs/testlock#/2:TESTLOCK @propset $tmp/exit1=str:/_docs/testlock#/3:{testlock:obj,prop} @propset $tmp/exit1=str:/_docs/testlock#/4:{testlock:obj,prop,who} @propset $tmp/exit1=str:/_docs/testlock#/5:{testlock:obj,prop,who,def} @propset $tmp/exit1=str:/_docs/testlock#/6: @propset $tmp/exit1=str:/_docs/testlock#/7:Tests the lock property 'prop', on 'obj' against the given player 'who'. If no 'who' argument is given, then it checks the lock against the using player. If a def argument is given, then the lock will default to that value, if there is no lock property of the given name on the given object. Returns true if the lock is locked against the player. @propset $tmp/exit1=str:/_docs/Time Functions#:6 @propset $tmp/exit1=str:/_docs/Time Functions#/1: @propset $tmp/exit1=str:/_docs/Time Functions#/2:MPI Time functions include: @propset $tmp/exit1=str:/_docs/Time Functions#/3: @propset $tmp/exit1=str:/_docs/Time Functions#/4:convsecs convtime date delay ftime kill @propset $tmp/exit1=str:/_docs/Time Functions#/5:ltimestr secs stimestr time timestr tzoffset @propset $tmp/exit1=str:/_docs/Time Functions#/6: @propset $tmp/exit1=str:/_docs/time#:6 @propset $tmp/exit1=str:/_docs/time#/1: @propset $tmp/exit1=str:/_docs/time#/2:TIME @propset $tmp/exit1=str:/_docs/time#/3:{time} @propset $tmp/exit1=str:/_docs/time#/4:{time:timezone} @propset $tmp/exit1=str:/_docs/time#/5: @propset $tmp/exit1=str:/_docs/time#/6:Returns a time string in the 24hr form hh:mm:ss. If the timezone argument is given, then it offsets the time returned by that number of hours. @propset $tmp/exit1=str:/_docs/timestr#:5 @propset $tmp/exit1=str:/_docs/timestr#/1: @propset $tmp/exit1=str:/_docs/timestr#/2:TIMESTR @propset $tmp/exit1=str:/_docs/timestr#/3:{timestr:secs} @propset $tmp/exit1=str:/_docs/timestr#/4: @propset $tmp/exit1=str:/_docs/timestr#/5:Given a time period in seconds, this will return a concise abbreviated string representation of how long that time was. This might return a value like "9d 12:56" for 9 days, 12 hours, and 56 minutes. @propset $tmp/exit1=str:/_docs/timesub#:10 @propset $tmp/exit1=str:/_docs/timesub#/1: @propset $tmp/exit1=str:/_docs/timesub#/10:This example will show different property list lines, depending on the time of day. The period is 86400 seconds, which is one day. If the property list has 24 items in it, then a different line will be returned for each hour of the day. @propset $tmp/exit1=str:/_docs/timesub#/2:TIMESUB @propset $tmp/exit1=str:/_docs/timesub#/3:{timesub:period,offset,listname} @propset $tmp/exit1=str:/_docs/timesub#/4:{timesub:period,offset,listname,object} @propset $tmp/exit1=str:/_docs/timesub#/5: @propset $tmp/exit1=str:/_docs/timesub#/6:This is sort of like {list}, except that it will only return one line of the given named property list. The line it chooses depends on the time. The period is the length of time, in seconds, that it takes for {timesub} to cycle through the entire list. The offset is the number of seconds to offset into the time period, if you actually need to synchronize the {timesub} with something. The offset usually is just left at zero. If the object argument is not passed, it looks for the list on the trigger. What this all means, is that if you have, for example, a period of 3600 (one hour), an offset of zero, and a property list that has six items in it, then {timesub} will return the first line of the property list during the first ten minutes of the hour, the second line during the next ten minutes, and so on, until it returns the last line during the last ten minutes of the hour. Then it returns the first line for the beginning of the next hour. Here's an example: @propset $tmp/exit1=str:/_docs/timesub#/7: @propset $tmp/exit1=str:/_docs/timesub#/8: {timesub:86400,0,_sunmoon} @propset $tmp/exit1=str:/_docs/timesub#/9: @propset $tmp/exit1=str:/_docs/tolower#:5 @propset $tmp/exit1=str:/_docs/tolower#/1: @propset $tmp/exit1=str:/_docs/tolower#/2:TOLOWER @propset $tmp/exit1=str:/_docs/tolower#/3:{tolower:string} @propset $tmp/exit1=str:/_docs/tolower#/4: @propset $tmp/exit1=str:/_docs/tolower#/5:Returns a copy of string, with all uppercase chars converted to lowercase. @propset $tmp/exit1=str:/_docs/topics#:~s~ @propset $tmp/exit1=str:/_docs/topics#/1:* Logical Functions * @propset $tmp/exit1=str:/_docs/topics#/10:rand select store timesub @propset $tmp/exit1=str:/_docs/topics#/11: @propset $tmp/exit1=str:/_docs/topics#/12:* String-handling Functions * @propset $tmp/exit1=str:/_docs/topics#/13: @propset $tmp/exit1=str:/_docs/topics#/14:center eval instr left lit midstr @propset $tmp/exit1=str:/_docs/topics#/15:nl null otell pronouns right smatch @propset $tmp/exit1=str:/_docs/topics#/16:strip strlen subst tell tolower toupper @propset $tmp/exit1=str:/_docs/topics#/17: @propset $tmp/exit1=str:/_docs/topics#/18:* Math Functions include* @propset $tmp/exit1=str:/_docs/topics#/19: @propset $tmp/exit1=str:/_docs/topics#/2: @propset $tmp/exit1=str:/_docs/topics#/20:abs add dec dice dist div @propset $tmp/exit1=str:/_docs/topics#/21:inc max min mod mult sign @propset $tmp/exit1=str:/_docs/topics#/22:subt @propset $tmp/exit1=str:/_docs/topics#/23: @propset $tmp/exit1=str:/_docs/topics#/24:* Time Functions * @propset $tmp/exit1=str:/_docs/topics#/25: @propset $tmp/exit1=str:/_docs/topics#/26:convsecs convtime date delay ftime kill @propset $tmp/exit1=str:/_docs/topics#/27:ltimestr secs stimestr time timestr tzoffset @propset $tmp/exit1=str:/_docs/topics#/28: @propset $tmp/exit1=str:/_docs/topics#/29:* Looping Functions * @propset $tmp/exit1=str:/_docs/topics#/3:and eq ge gt if le @propset $tmp/exit1=str:/_docs/topics#/30: @propset $tmp/exit1=str:/_docs/topics#/31:filter fold for foreach parse while @propset $tmp/exit1=str:/_docs/topics#/32: @propset $tmp/exit1=str:/_docs/topics#/33:* Database-related Functions * @propset $tmp/exit1=str:/_docs/topics#/34: @propset $tmp/exit1=str:/_docs/topics#/35:contains contents controls created dbeq exits @propset $tmp/exit1=str:/_docs/topics#/36:flags force fullname holds istype lastused @propset $tmp/exit1=str:/_docs/topics#/37:links loc locked modified money name @propset $tmp/exit1=str:/_docs/topics#/38:nearby owner ref testlock type usecount @propset $tmp/exit1=str:/_docs/topics#/39: @propset $tmp/exit1=str:/_docs/topics#/4:lt ne not or xor @propset $tmp/exit1=str:/_docs/topics#/40:* Connection-related Functions * @propset $tmp/exit1=str:/_docs/topics#/41: @propset $tmp/exit1=str:/_docs/topics#/42:awake idle online ontime @propset $tmp/exit1=str:/_docs/topics#/43: @propset $tmp/exit1=str:/_docs/topics#/44:* Variable-related Functions * @propset $tmp/exit1=str:/_docs/topics#/45: @propset $tmp/exit1=str:/_docs/topics#/46:&arg &cmd &how set v with @propset $tmp/exit1=str:/_docs/topics#/47: @propset $tmp/exit1=str:/_docs/topics#/48:* List-handling Functions * @propset $tmp/exit1=str:/_docs/topics#/49: @propset $tmp/exit1=str:/_docs/topics#/5: @propset $tmp/exit1=str:/_docs/topics#/50:commas count lcommon lmember lrand lremove @propset $tmp/exit1=str:/_docs/topics#/51:lsort lunion lunique mklist sublist @propset $tmp/exit1=str:/_docs/topics#/52: @propset $tmp/exit1=str:/_docs/topics#/53:* Miscellaneous Functions * @propset $tmp/exit1=str:/_docs/topics#/54: @propset $tmp/exit1=str:/_docs/topics#/55:debug debugif isdbref isnum muckname muf @propset $tmp/exit1=str:/_docs/topics#/56:version @propset $tmp/exit1=str:/_docs/topics#/57: @propset $tmp/exit1=str:/_docs/topics#/58:See also: @propset $tmp/exit1=str:/_docs/topics#/59: @propset $tmp/exit1=str:/_docs/topics#/6:* Property-handling Functions * @propset $tmp/exit1=str:/_docs/topics#/60:func macros @propset $tmp/exit1=str:/_docs/topics#/7: @propset $tmp/exit1=str:/_docs/topics#/8:concat delprop exec exec! index index! @propset $tmp/exit1=str:/_docs/topics#/9:lexec list listprops prop prop! propdir @propset $tmp/exit1=str:/_docs/toupper#:5 @propset $tmp/exit1=str:/_docs/toupper#/1: @propset $tmp/exit1=str:/_docs/toupper#/2:TOUPPER @propset $tmp/exit1=str:/_docs/toupper#/3:{toupper:string} @propset $tmp/exit1=str:/_docs/toupper#/4: @propset $tmp/exit1=str:/_docs/toupper#/5:Returns a copy of string, with all lowercase chars converted to uppercase. @propset $tmp/exit1=str:/_docs/type#:5 @propset $tmp/exit1=str:/_docs/type#/1: @propset $tmp/exit1=str:/_docs/type#/2:TYPE @propset $tmp/exit1=str:/_docs/type#/3:{type:obj} @propset $tmp/exit1=str:/_docs/type#/4: @propset $tmp/exit1=str:/_docs/type#/5:Returns the type of an object. The possible values are: Bad, Room, Exit, Thing, Player, and Program. @propset $tmp/exit1=str:/_docs/tzoffset#:5 @propset $tmp/exit1=str:/_docs/tzoffset#/1: @propset $tmp/exit1=str:/_docs/tzoffset#/2:TZOFFSET @propset $tmp/exit1=str:/_docs/tzoffset#/3:{tzoffset} @propset $tmp/exit1=str:/_docs/tzoffset#/4: @propset $tmp/exit1=str:/_docs/tzoffset#/5:Returns local time zone offset from GMT in seconds. @propset $tmp/exit1=str:/_docs/variable#:6 @propset $tmp/exit1=str:/_docs/variable#/1: @propset $tmp/exit1=str:/_docs/variable#/2:V|VARIABLE|& @propset $tmp/exit1=str:/_docs/variable#/3:{v:var} @propset $tmp/exit1=str:/_docs/variable#/4:{&var} @propset $tmp/exit1=str:/_docs/variable#/5: @propset $tmp/exit1=str:/_docs/variable#/6:These are two ways of trying to do the same thing. They return the value of the named variable var. If there is no variable with the given name currently defined, then this gives an error stating as much. Variables can be defined either with the {with:} function or within a looping command. @propset $tmp/exit1=str:/_docs/Variables#:5 @propset $tmp/exit1=str:/_docs/Variables#/1: @propset $tmp/exit1=str:/_docs/Variables#/2:MPI Variable-handling functions and topics include: @propset $tmp/exit1=str:/_docs/Variables#/3: @propset $tmp/exit1=str:/_docs/Variables#/4:&arg &cmd &how set v with @propset $tmp/exit1=str:/_docs/Variables#/5: @propset $tmp/exit1=str:/_docs/version#:5 @propset $tmp/exit1=str:/_docs/version#/1: @propset $tmp/exit1=str:/_docs/version#/2:VERSION @propset $tmp/exit1=str:/_docs/version#/3:{version} @propset $tmp/exit1=str:/_docs/version#/4: @propset $tmp/exit1=str:/_docs/version#/5:Returns the version string for the server. @propset $tmp/exit1=str:/_docs/while#:5 @propset $tmp/exit1=str:/_docs/while#/1: @propset $tmp/exit1=str:/_docs/while#/2:WHILE @propset $tmp/exit1=str:/_docs/while#/3:{while:check,expr} @propset $tmp/exit1=str:/_docs/while#/4: @propset $tmp/exit1=str:/_docs/while#/5:This is a looping structure. It evaluates the 'check' argument, and if it evaluates true, then it evaluates the expr argument, and repeats the process. If 'check' evaluates false, then the loop is exited. This returns the result of the last evaluation of expr. @propset $tmp/exit1=str:/_docs/with#:17 @propset $tmp/exit1=str:/_docs/with#/1: @propset $tmp/exit1=str:/_docs/with#/10: The players awake here are @propset $tmp/exit1=str:/_docs/with#/11: {lit: } <- just puts in a space. @propset $tmp/exit1=str:/_docs/with#/12: {commas:{&people},{lit: and }, @propset $tmp/exit1=str:/_docs/with#/13: who,{name:{&who}} <- uses {&who} as temp var. @propset $tmp/exit1=str:/_docs/with#/14: } <- {&who} no longer defined. @propset $tmp/exit1=str:/_docs/with#/15: } @propset $tmp/exit1=str:/_docs/with#/16: } <- {&people} no longer defined. @propset $tmp/exit1=str:/_docs/with#/17: @propset $tmp/exit1=str:/_docs/with#/2:WITH @propset $tmp/exit1=str:/_docs/with#/3:{with:var,val,expr..} @propset $tmp/exit1=str:/_docs/with#/4: @propset $tmp/exit1=str:/_docs/with#/5:This defines a new variable with the given name, and sets its value to the given val. Up to 7 expr's are allowed, but the only value returned to {with}'s caller, is the value returned by the evaluation of the last expr. If there is already a variable of the same name, then this command will override that variable, for the duration of the {with:} command. The new variable is only valid to use within the confines of the {with:} command, and it will go away after the command completes. This provides scoped variables quite effectively. NOTE: There can be no more than 32 variables defined at any one time, total. This includes variables that are defined within macros, or properties or lists that are executed with {exec:} or {lexec:}. Here's an example to illustrate the scope of variables inside of {with:} commands: @propset $tmp/exit1=str:/_docs/with#/6: @propset $tmp/exit1=str:/_docs/with#/7: {prop:_mydesc} <- {&people} not defined. @propset $tmp/exit1=str:/_docs/with#/8: {with:people,{contents:here,players}, <- Defining. Not available yet. @propset $tmp/exit1=str:/_docs/with#/9: {if:{count:{&people}}, <- It's usable now. @propset $tmp/exit1=str:/_docs/xor#:6 @propset $tmp/exit1=str:/_docs/xor#/1: @propset $tmp/exit1=str:/_docs/xor#/2:XOR|EXCLUSIVEOR @propset $tmp/exit1=str:/_docs/xor#/3:{xor:expr1,expr2} @propset $tmp/exit1=str:/_docs/xor#/4: @propset $tmp/exit1=str:/_docs/xor#/5:Returns true if expr1 or expr2 evaluate as true, but false if both do. @propset $tmp/exit1=str:/_docs/xor#/6:Otherwise, this returns false. @propset $tmp/exit1=str:/_xrefs/!:not @propset $tmp/exit1=str:/_xrefs/&:variable @propset $tmp/exit1=str:/_xrefs/&&:and @propset $tmp/exit1=str:/_xrefs/&arg:arg @propset $tmp/exit1=str:/_xrefs/&cmd:cmd @propset $tmp/exit1=str:/_xrefs/&how:how @propset $tmp/exit1=str:/_xrefs/<>:!= @propset $tmp/exit1=str:/_xrefs/\r:nl @propset $tmp/exit1=str:/_xrefs/abs:absolute @propset $tmp/exit1=str:/_xrefs/add:addition @propset $tmp/exit1=str:/_xrefs/categories:category @propset $tmp/exit1=str:/_xrefs/Connection functions:Connections @propset $tmp/exit1=str:/_xrefs/Connfuncs:Connections @propset $tmp/exit1=str:/_xrefs/dbeq:dbequals @propset $tmp/exit1=str:/_xrefs/DBFuncs:Database Functions @propset $tmp/exit1=str:/_xrefs/dec:decrement @propset $tmp/exit1=str:/_xrefs/dist:distance @propset $tmp/exit1=str:/_xrefs/div:divide @propset $tmp/exit1=str:/_xrefs/eq:== @propset $tmp/exit1=str:/_xrefs/equals:== @propset $tmp/exit1=str:/_xrefs/exclusiveor:xor @propset $tmp/exit1=str:/_xrefs/ge:>= @propset $tmp/exit1=str:/_xrefs/greaterthan:> @propset $tmp/exit1=str:/_xrefs/gt:> @propset $tmp/exit1=str:/_xrefs/inc:increment @propset $tmp/exit1=str:/_xrefs/le:<= @propset $tmp/exit1=str:/_xrefs/lessthan:< @propset $tmp/exit1=str:/_xrefs/ListFuncs:List Handling @propset $tmp/exit1=str:/_xrefs/lit:literal @propset $tmp/exit1=str:/_xrefs/loc:location @propset $tmp/exit1=str:/_xrefs/logicfuncs:logical functions @propset $tmp/exit1=str:/_xrefs/looping:Looping Functions @propset $tmp/exit1=str:/_xrefs/loops:Looping Functions @propset $tmp/exit1=str:/_xrefs/lt:< @propset $tmp/exit1=str:/_xrefs/math:Math Functions @propset $tmp/exit1=str:/_xrefs/mathfuncs:Math Functions @propset $tmp/exit1=str:/_xrefs/max:maximum @propset $tmp/exit1=str:/_xrefs/min:minimum @propset $tmp/exit1=str:/_xrefs/misc:MiscFuncs @propset $tmp/exit1=str:/_xrefs/mod:modulo @propset $tmp/exit1=str:/_xrefs/mult:multiply @propset $tmp/exit1=str:/_xrefs/ne:!= @propset $tmp/exit1=str:/_xrefs/notequals:!= @propset $tmp/exit1=str:/_xrefs/propfuncs:Property Handling @propset $tmp/exit1=str:/_xrefs/stringfuncs:String Functions @propset $tmp/exit1=str:/_xrefs/strings:String Functions @propset $tmp/exit1=str:/_xrefs/subt:subtraction @propset $tmp/exit1=str:/_xrefs/test:while @propset $tmp/exit1=str:/_xrefs/timefuncs:time functions @propset $tmp/exit1=str:/_xrefs/v:variable @propset $tmp/exit1=str:/_xrefs/Var:Variables @propset $tmp/exit1=str:/_xrefs/VarFuncs:Variables @propset $tmp/exit1=str:/_xrefs/Variable:Variables @propset $tmp/exit1=str:/_xrefs/Variable Handling:Variables @propset $tmp/exit1=str:/_xrefs/Vars:Variables