attrib_set()
authorAri Johnson <ari@cobramush.org>
Tue, 20 Feb 2007 22:05:44 +0000 (22:05 +0000)
committerAri Johnson <ari@cobramush.org>
Tue, 20 Feb 2007 22:05:44 +0000 (22:05 +0000)
game/txt/hlp/cobra_func.hlp
src/function.c
src/fundb.c
win32/funs.h

index 68ca47bc89fa644d82570f0ee26be04f1fa82b5a..4cea9434b9079a0a2d9b9b398fa72bfce10bd852 100644 (file)
 
   When given a second argument of "on" (or "off"), attempts to lock
   (unlock) the specified attribute, as per @atrlock.
+& ATTRIB_SET()
+  attrib_set(<object>/<attrib>[, <value>])
+
+  Sets or clears an attribute. With a value, it sets the attribute,
+  without one, it clears the attribute. This is an easier-to-read
+  replacement for the old set(<object>, <attrib>:<value>) notation,
+  and a less destructive replacement for wipe() that won't destroy
+  entire attribute trees in one shot.
+
+  If there is a second argument, then attrib_set() will create an
+  attribute, even if the second argument is empty (in which case
+  attrib_set() will create an empty attribute).  This means that
+  attrib_set(me/foo,%0) will _always_ create an attribute.
+
+  Of course, if the empty_attrs configuration option is turned off,
+  then the above paragraph doesn't apply.  See @config attribs.
+
 & BAND()
   band(<integer>,<integers>,...)
 
@@ -3038,9 +3055,10 @@ for an object named "Test", preferring a thing over other types.
   flags, set attributes, and many other things.  The two arguments
   to the function are the same as the arguments that would appear
   on either side of the '=' in @set. This function returns nothing.
-  Note that you can't clear an attribute with set(), though
-  you can make it an empty attribute. Use wipe() to clear attributes.
+
+  The attribute setting ability of set() is deprecated.  You should
+  use attrib_set() instead; it's easier to read, and allows you to
+  clear attributes, too.
 
 & SETDIFF()
   setdiff(<list1>, <list2>[, <delimiter>][, <sort type>][, <osep>])
@@ -4121,7 +4139,9 @@ for an object named "Test", preferring a thing over other types.
 & WIPE() 
   wipe(<obj>/<attribute-pattern>)
 
-  This function is equivalent to @wipe. It returns nothing. 
+  This function is equivalent to @wipe. It returns nothing. Like
+  @wipe, this function will destroy entire attribute trees; for
+  more judicious deletion, use attrib_set().
   
 & WORDPOS()
   wordpos(<list>, <number>[, <delimiter>])
index a8fde26c0efd7a20f993eb4ec4362f1e165fd3cb..c725706e62b8ade67e08f1c914782332514d86a3 100644 (file)
@@ -287,6 +287,7 @@ FUNTAB flist[] = {
   {"ARABIC2ROMAN", fun_arabictoroman, 1, 1, FN_REG},
   {"ART", fun_art, 1, 1, FN_REG},
   {"ATRLOCK", fun_atrlock, 1, 2, FN_REG},
+  {"ATTRIB_SET", fun_attrib_set, 1, -2, FN_REG},
   {"BAND", fun_band, 1, INT_MAX, FN_REG},
   {"BASECONV", fun_baseconv, 3, 3, FN_REG},
   {"BEEP", fun_beep, 0, 1, FN_REG},
index 8b9ef7da9c827fdfa9b65ecbecb262224c98c544..5cc8e046c75f52c33590392480821002c65e66ab 100644 (file)
@@ -1816,6 +1816,39 @@ FUNCTION(fun_wipe)
   do_wipe(executor, args[0]);
 }
 
+/* ARGSUSED */
+FUNCTION(fun_attrib_set)
+{
+  dbref thing;
+  char *s;
+
+  if (!FUNCTION_SIDE_EFFECTS) {
+    safe_str(T(e_disabled), buff, bp);
+    return;
+  }
+  if (!command_check_byname(executor, "ATTRIB_SET") || fun->flags & FN_NOSIDEFX) {
+    safe_str(T(e_perm), buff, bp);
+    safe_str(T(e_perm), buff, bp);
+    return;
+  }
+  s = strchr(args[0], '/');
+  if (!s) {
+    safe_str(T("#-1 BAD ARGUMENT FORMAT TO ATTRIB_SET"), buff, bp);
+    return;
+  }
+  *s++ = '\0';
+  thing = match_thing(executor, args[0]);
+  if (!GoodObject(thing)) {
+    safe_str(T(e_notvis), buff, bp);
+    return;
+  }
+  if (nargs == 1) {
+    do_set_atr(thing, s, NULL, executor, 1);
+  } else {
+    do_set_atr(thing, s, args[1], executor, 1);
+  }
+}
+
 
 /* --------------------------------------------------------------------------
  * Misc functions: TEL
index 1caf416c84b3b407d5e98005b4a39458f712bf16..0210388c7b7cc4b1e0dd74057c5830e94eab66d3 100644 (file)
@@ -21,6 +21,7 @@ FUNCTION_PROTO(fun_atan);
 FUNCTION_PROTO(fun_atan2);
 FUNCTION_PROTO(fun_atat);
 FUNCTION_PROTO(fun_atrlock);
+FUNCTION_PROTO(fun_attrib_set);
 FUNCTION_PROTO(fun_band);
 FUNCTION_PROTO(fun_baseconv);
 FUNCTION_PROTO(fun_beep);