@function/preserve adds localize restriction; @function/restrict added to help
authorAri Johnson <ari@cobramush.org>
Wed, 21 Feb 2007 14:15:24 +0000 (14:15 +0000)
committerAri Johnson <ari@cobramush.org>
Wed, 21 Feb 2007 14:15:24 +0000 (14:15 +0000)
game/txt/hlp/cobra_cmd.hlp
hdrs/function.h
src/cmds.c
src/command.c
src/function.c

index 5fdd351db7a85c118d4c041a51706966ea573b7b..eef513c9c7ece051027166481d99c15ed2f38980 100644 (file)
@@ -1484,9 +1484,11 @@ See also: PUPPET, DBREF
 
 & @function
   @function [<function name>]
-  @function <name>=<obj>,<attrib>[,<min args>, <max args>[,<restrictions>]]
+  @function[/preserve] <name>=<obj>,<attrib>[,<min args>,
+     <max args>[,<restrictions>]]
     or @function <function name>=<object>/<attribute>
   @function/<switch> <function name>
+  @function/restrict <function name>=<restrictions>
   
   When used without any arguments, this command lists all global
   user-defined functions. For Directors and others with the Functions
@@ -1501,22 +1503,28 @@ See also: PUPPET, DBREF
   /disable, to disable a built in function.
   /enable, to re-enable it.
   /delete, to remove a user-defined function.
+  /restrict, to change the restriction flags on an existing function.
 
   Otherwise, this command defines a global function with the name
   <function name>, which evaluates to <attribute> on <object>.
+(continued in help @function2)
+& @function2
   <object> can be anything that the player using the @function command
   controls. <function name> must be 30 characters or less.
 
-(continued in help @function2)
-& @function2
   A function defined using @function works just like any of the normal
   MUSH functions, from the user's perspective. The functions are
   executed by the object, with its powers. 
  
   Functions defined via @function should follow the format used by
   UFUN() - %0 is the first argument passed, %1 is the second argument
-  passed, and so forth. Option third and fourth arguments to @function
+  passed, and so forth. Optional third and fourth arguments to @function
   can be used to set a parser-enforced number of arguments for the function.
+  An optional fifth argument will set restriction flags.
+
+  The /preserve switch, for MUX compatibility, does the same thing as the
+  'localize' restriction - treats the attribute that's evaluated as if it
+  were called with ulocal() instead of u().
   
   Example:
   
@@ -1552,6 +1560,9 @@ See also: PUPPET, DBREF
  @function/restore will delete the @function and turn the built in
  version back on.
 
+ Using @function on an already-added function will delete the old one and
+ install a new function with none of the settings of the old one kept.
+
  For example:
   @function/delete ansi
   &ansi_fun #1234=%0
index 7dd56d379877cf146d35ffb1afe154c089b6f97f..a16d026c082ea9f859f52c4b1edb481f80c380d7 100644 (file)
@@ -103,7 +103,7 @@ extern void do_function_restrict(dbref player, const char *name,
 extern void do_function_restore(dbref player, const char *name);
 extern void do_list_functions(dbref player, int lc);
 extern char *list_functions(void);
-extern void do_function(dbref player, char *name, char **argv);
+extern void do_function(dbref player, char *name, char **argv, int preserve);
 extern void do_function_toggle(dbref player, char *name, int toggle);
 extern void do_function_report(dbref player, char *name);
 extern void do_function_delete(dbref player, char *name);
index 38024d8b387d2faa556b532d537425f562a8e38b..96ab42c531814d1beb56dbe08ab3de8c87e573aa 100644 (file)
@@ -430,11 +430,11 @@ COMMAND (cmd_function) {
       *args_right[2]++ = '\0';
     }
     if (args_right[1] && *args_right[1])
-      do_function(player, arg_left, args_right);
+      do_function(player, arg_left, args_right, SW_ISSET(sw, SWITCH_PRESERVE));
     else if (arg_left && *arg_left)
       do_function_report(player, arg_left);
     else
-      do_function(player, NULL, NULL);
+      do_function(player, NULL, NULL, 0);
     if (split) {
       if (args_right[2])
        *--args_right[2] = '/';
index 780472a57326a8145017d43a5cac20b89ce65f98..5a572033dbeedf51f5f1187fe974b318e83b48b5 100644 (file)
@@ -152,7 +152,7 @@ COMLIST commands[] = {
 
   {"@FORCE", "NOEVAL", cmd_force, CMD_T_ANY | CMD_T_EQSPLIT | CMD_T_NOGAGGED,
    NULL},
-  {"@FUNCTION", "DELETE ENABLE DISABLE RESTORE RESTRICT", cmd_function,
+  {"@FUNCTION", "DELETE ENABLE DISABLE PRESERVE RESTORE RESTRICT", cmd_function,
    CMD_T_ANY | CMD_T_EQSPLIT | CMD_T_RS_ARGS | CMD_T_NOGAGGED, NULL},
   {"@GREP", "LIST PRINT ILIST IPRINT", cmd_grep,
    CMD_T_ANY | CMD_T_EQSPLIT | CMD_T_RS_NOPARSE | CMD_T_NOGAGGED, NULL},
index 5814f28f5f485d171590c7728a0bcdb215477fe3..e85bc47d4ccc91a75155b601aea0b10ff2a54d21 100644 (file)
@@ -1086,9 +1086,11 @@ do_function_restrict(dbref player, const char *name, const char *restriction)
  * \param player the enactor.
  * \param name name of function to add.
  * \param argv array of arguments.
+ * \param preserve Treat the function like it was called with ulocal() instead
+ *  of u().
  */
 void
-do_function(dbref player, char *name, char *argv[])
+do_function(dbref player, char *name, char *argv[], int preserve)
 {
   char tbuf1[BUFFER_LEN];
   char *bp = tbuf1;
@@ -1202,6 +1204,8 @@ do_function(dbref player, char *name, char *argv[])
       fp->flags = apply_restrictions(0, argv[5]);
     else
       fp->flags = 0;
+    if (preserve)
+      fp->flags |= FN_LOCALIZE;
     hashadd(name, fp, &htab_user_function);
 
     /* now add it to the user function table */
@@ -1256,10 +1260,13 @@ do_function(dbref player, char *name, char *argv[])
     } else
       fp->maxargs = 10;
 
+    /* Set new flags */
     if (argv[5] && *argv[5])
       fp->flags = apply_restrictions(0, argv[5]);
     else
       fp->flags = 0;
+    if (preserve)
+      fp->flags |= FN_LOCALIZE;
 
     notify(player, T("Function updated."));
   }