Compatibility Matched
Compatibility Matched
Section titled “Compatibility Matched”These once differed and now match PennMUSH; noted here only because earlier SharpMUSH releases behaved differently.
- Imported locks keep PennMUSH’s creator and its protected, inheritable, visual and no_clone flags (#1108).
- Lock operator precedence:
&binds tighter than|, soa & b | cis(a & b) | c. textentries()istextentries(<type>, <pattern>[, <osep>]): the pattern is required and filters the topic names.textentries()andtextfile()also refuse an unknown<type>and gate the administrator-onlyahelpcorpus on wizard or royalty, as PennMUSH’sadminhelp files are.hasattr(),hasattrp(),hasattrval()andhasattrpval()take the whole<object>/<attribute>spec in one argument as well as the two-argument form; one argument carrying no/is#-1 BAD ARGUMENT FORMAT TO <function>.letq()requires an odd number of arguments andsetr()an even number;case()/caseall()have no parity requirement.- An unknown function name outside
[...]is left as literal text (think foo(bar)printsfoo(bar)); inside[...]it is#-1 FUNCTION (FOO) NOT FOUND. - A HALTED object runs none of its softcode:
u()/ufun()return the stored attribute text unevaluated (PennMUSH’sPE_NOTHING:u()of a halted object’s[add(1,2)]yields the literal[add(1,2)]), while its$-commands do not fire.@halt <object>and@chown(which halts to break ownership loops) rely on this. - An uppercase substitution selector capitalizes the first output character:
%Q0,%N,%I0,%Scapitalize;%q0,%n,%i0,%sdo not. %(a percent followed by a space) is emitted literally as%.$-commands are matched against the command line after it is evaluated, so a command whose name or arguments only appear once substitutions and functions run still matches and captures its%0..from the evaluated text.- An unknown function inside
[...]whose name is close to a real one is reported as#-1 FUNCTION (NAME) NOT FOUND DID YOU MEAN 'CLOSEST'. %cis the running command as written, and%uis the last command after its arguments were evaluated, rebuilt asNAME/switches arguments(@PEMIT/silent me=2;ATTRIB_SET/<attribute>,SAY,GOTO <exit>for the token and exit forms; the typed word and evaluated rest for a command nothing matched). A command’s own arguments therefore see the previous command’s%u; its hooks and anything it runs see its own. Each queued entry and each$-command body starts with both empty, while@includeand@ifelseshare them with the list that ran them.- Argument minimums. The boolean and bitwise families (
and() or() xor() cand() cor() nand() ncand() ncor() nor() band() bor() bxor() bnot()),cat(),strcat(),lit(),t(),loc(),locks()andattrib_set()once accepted a call with no arguments at all; they now enforce PennMUSH’s minimum.max()andmin()once demanded two arguments; they now fold over one, as PennMUSH does. - The vector family (
vadd() vsub() vmul() vdot() vmax() vmin()) once answered the empty string for every call. isword()once answered 1 only for a single letter.checkpass()once required a dbref and refused a player name.avg() cname() element() exp() hostname() replace() reverse() speakpenn()each had a help topic calling them another name for an existing function, and each failed when called: the alias table had been copied into three places and none of the three carried them.render()once evaluated its second argument as the object named by its first, which is whatobjeval()does, rather than rendering a string.- A QUIET player, or a player writing to a QUIET object they own, was once still told
<object>/<attr> - Set.by&,@descand the other attribute commands, andParent changed.,Home set.,@edit’s- Set.and@power’sgranted.;@notifyand@drainnow say nothing for a QUIET executor, and@drainsaysDrained.otherwise. Seehelp QUIET. - A queue entry that runs out of
queue_entry_cpu_timeonce sent#-1 EXECUTION TIME LIMIT EXCEEDEDto every connection of its owner; its enactor now hearsCPU usage exceeded., unless QUIET. @chownallonce saidChanged ownership of N object(s) from A to B.; it now saysOwnership changed for N objects.- A new game once started with
function_recursion_limit 100,function_invocation_limit 100000andmax_named_qregs 100; it now starts with PennMUSH’s 50, 25000 and 50.
Known limitations
Section titled “Known limitations”Not yet at parity; may change in a future release.
%cand%uinside@triggerand locks.@triggerruns its list in place, so that list starts from the triggering command’s%c/%uinstead of empty ones. A lock evaluated for a$-command sees neither.%ualso shows the value of&attr obj=valueand@attr obj=valueas written, where PennMUSH shows it evaluated in a queued list, and a computed&attribute name as written (ATTRIB_SET/[CAT(F,OO)]), where PennMUSH shows the name it evaluated to (ATTRIB_SET/FOO).@triggerand@forcecount toward the in-place depth. Both run their list in place rather than queueing it, so it is one more of the 50 in-place levels a queue entry may nest (seehelp @include). An attribute that@triggers itself stops after 50 rounds, where PennMUSH queues each round as a new entry and goes on.- Characters above U+FFFF (emoji and other supplementary-plane characters) are stored as UTF-16 surrogate pairs. This is internally consistent, but a substitution or slice that lands between the two halves of a pair could split it. Rare in practice.
See also
Section titled “See also”help @halthelp iter()help substitutionshelp exception