@q
@program tinysay.muf
1 99999 d
i 
 
( tinysay.muf v1.4   Jessy @ FurryMUCK    10/96
  
  This is a small, easy-to-set up 'say' program. Rather than building
  elaborate functionality into the program itself, the _say/def/say
  and _say/def/osay props are parsed for MPI: players can set up their
  own filters, random says, etc., by including appropriate MPI in their
  say-verb settings. This version is compatible with most vehicle 
	systems.
  
  Installation:
  
  Create a global action named say;" and link it to this program. TinySay 
  requires Mucker level 3, for the PARSEPROP primitive.
  
  Use:
  
  "<message>             Say something.
  say <message>          Say something.
  say #def = <string>    Set your 1st-person say verb.
  say #odef = <string>   Set your 3rd-person say verb.
  say #filter = <string> Set your MPI say filter.
  
  Filter Examples:
  
  In the filter, the text of your comment is stored in the {&how} 
  variable. To replace all occurances of 'l' with 'r', one would do
  the following:
    
    > say #filter {subst:{&how},l,r}
      Set.
    > "Hello, world!
      You say, "Herro, worrd!"
  
  Following standard MPI syntax, setting multiple filters would require
  that the filtering functions, such as {subst} above, be nested. For
  example, to replace all occurances of 'l' with 'r', and to replace all
  occurances of 'w' with 'mw', one would do the following:
    
    > say #filter {subst:{subst:{&how},l,r},w,mw}
      Set.
    > "Hello, world!
      You way, "Herro, mworrd!"
  
  TinySay.muf may be freely ported. Please comment any changes.
)
  
$define Tell me @ swap notify $enddef
  
: DoHelp  (  --  )                                    (* show help screen *)
    
    " " Tell
    "TinySay.muf  (#" prog intostr strcat ")" strcat Tell
    " " Tell
    "  \"<message> .................. Say something" Tell
    "  say <message> ............... Say something" Tell
    "  say #def = <string> ......... Set your 1st-person say verb" Tell
    "  say #odef = <string> ........ Set your 3rd-person say verb" Tell
    "  say #filter = <string> ...... Set your MPI filter to <string>" Tell
    " " Tell
  
    "Your verb and filter definintions are stored in your _say/def/ "
    "directory. They definitions may include MPI. The 'say' runs before "
    "the 'osay'. Filter example: {subst:{&how},l,r} would cause you to "
    "say \"Herro, worrd!\" when you type \"say Hello, world!\"."
    strcat strcat strcat Tell
    " " Tell
;
  
: DoDef ( s --  )             (* set the user's 1st-person say verb string *)
    
    dup "=" instr dup not if                               (* check syntax *)
        pop pop
        "Syntax: say #def = <string>  (You forgot the '=')" Tell exit
    then
    strcut swap pop
    me @ "_say/def/say" rot strip setprop                        (* set it *)
    "Set." Tell
;
  
: DoODef ( s --  )            (* set the user's 3rd-person say verb string *)
    
    dup "=" instr dup not if                               (* check syntax *) 
        pop pop
        "Syntax: say #odef = <string>  (You forgot the '=')" Tell exit
    then
    strcut swap pop
    me @ "_say/def/osay" rot strip setprop                       (* set it *)
    "Set." Tell
;
 
: DoSetFilter  (  --  )                                  (* set say filter *)
  
  dup " " instr if
    dup " " instr strcut swap pop strip
    me @ "_say/def/filter" rot setprop
    "Set." Tell
  else
    me @ "_say/def/filter" remove_prop
    "Filter removed." Tell
  then
;
  
: main
  
    "me" match me !
    dup not if                                             (* check syntax *)
        DoHelp exit
    then
    
    dup "#*" smatch if                         (* route to other function? *)
        strip
        dup "#help"  swap stringpfx if DoHelp      exit else
        dup "#def*"  smatch         if DoDef       exit else
        dup "#odef*" smatch         if DoODef      exit else
        dup "#filt*" smatch         if DoSetFilter exit
        then then then then
    then
                                                 (* parse and emit the say *)
    me @ "_say/def/filter" getpropstr if
        me @ "_say/def/filter" rot 0 parseprop 
    then
     
    "You "
    me @ "_say/def/say" getpropstr if
        me @ "_say/def/say" over over getpropstr 0 parseprop
        strcat ", \""
    else
        "say, \""
    then
    strcat over strcat "\"" strcat Tell
    
    loc @ me @
    dup name " " strcat
    over "_say/def/osay" getpropstr if
        over "_say/def/osay" over over getpropstr 0 parseprop
        strcat ", \""
    else
        "says, \""
    then
    strcat 4 rotate strcat "\"" strcat dup
    me @ location swap notify
    me @ location contents
    begin
      dup while
      dup me @ dbcmp not if
        dup 3 pick notify
      then
      next
    repeat
    begin depth while pop repeat
;
.
c
q