skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
/**
 * This is an inherit for flowers, it has some decay functionality
 * built in, plus adding custom smell messages/functions/effects
 * will be easy.
 * @author Sandoz, 2001.
 */

#include <bit.h>

#define BRAID_EFFECT EFFECTS_DIR "/other/braided_effect"

inherit OBJECT_OBJ;

mixed smell_mess;
mixed smell_func;
string smell_eff;
string withered_long;
int decay;

int do_braid( object *obs );

/** @ignore yes */
void create() {
    decay = 1000;
    ::create();
    add_alias("flower");
    add_plural("flowers");
    add_extra_look(TO);
    BIT_CONTROLLER->add_bit(TO);
} /* create() */

/**
 * This method sets the maximum decay time for the flower.
 * @param i the decay time to set
 */
void set_decay( int i ) { decay = i; }

/** @ignore yes */
int query_flower() { return 1; }

/**
 * This method returns the withered long of the flower.
 * @return the withered long description
 */
string query_withered_long() { return withered_long; }

/**
 * This method will set the long description to use when
 * the flower has withered.
 * @param str the long desc to use for the withered state
 */
void set_withered_long( string str ) { withered_long = str; }

/**
 * This method returns the smell message set for the flower.
 * @return the smell message(s)
 */
mixed query_smell_message() { return smell_mess; }

/**
 * This method sets the smell message(s) for the flower.
 * @param mess the message can be either a string or array, using an
 * add_succeeded_mess pattern.
 */
void set_smell_message( mixed mess ) {
    if( pointerp( mess ) ) {
        if( sizeof( mess ) != 2 )
            write( "Smell message must be either a string or an array of "
                   "two elements.\n" );
        else
            smell_mess = mess;
        return;
    }

    if( stringp( mess ) )
        smell_mess = mess;

} /* set_smell_message() */

/**
 * This method returns the smell effect set for the flower.
 * @return the smell effect
 */
string query_smell_effect() { return smell_eff; }

/**
 * This method sets the smell effect for the flower.
 * @param eff the effect to use when the flower is being smelled.
 */
void set_smell_effect( string eff ) { smell_eff = eff; }

/**
 * This method returns the smell function set for the flower.
 * @return the smell function
 */
mixed query_smell_func() { return smell_func; }

/**
 * This method sets the smell function for the flower.
 * This function will be called with the player doing
 * the smelling as an argument.
 * @param func the function to call when the flower is being
 * smelled - it can be either a string, in which case it will
 * be called on the flower object, or an array where the first
 * member would be the filename of the object to call the
 * function on, while the second member will be the function
 * to call.
 */
void set_smell_function( mixed func ) {
    if( pointerp( func ) ) {
        if( sizeof( func ) != 2 )
            write("Smell function must be either a string or an array of "
                  "two elements.\n");
        else
            smell_func = func;
        return;
    }

    if( stringp( func ) )
        smell_func = func;

} /* set_smell_function() */

/** @ignore yes */
string short( int dark ) {
    return ( !decay && !query_property("just withered") ?
             "withered " : "" ) + ::short( dark );
} /* short() */

/** @ignore yes */
string long( string word, int dark ) {
    if( !decay )
        return ( withered_long ? withered_long :
                 ::long() + "It is completely withered.\n" );
    return ::long( word, dark );
} /* long() */

/** @ignore yes */
void do_decay() {
    int rate;
    object cont, env;

    if( !cont = ENV(TO) ) {
        BIT_CONTROLLER->remove_bit(TO);
        return;
    }

    if( ( rate = 5 + (int)cont->query_property( "decay rate" ) ) > 0 )
        decay -= rate;

    if( decay <= 0 ) {
        decay = 0;
        BIT_CONTROLLER->remove_bit(TO);
        add_adjective("withered");
        add_property("just withered", 1, 2 );

        if( !ENV(cont) ) {
            tell_room( cont, one_short()+" $V$0=withers,wither$V$.\n");
            return;
        }

        if( living(cont) ) {
            tell_room( ENV(cont), poss_short()+" $V$0=withers,wither$V$.\n");
            return;
        }

        if( !cont->query_vase() )
            return;

        if( living( env = ENV(cont) ) )
            env = ENV(env);

        tell_room( env, one_short()+" in "+cont->poss_short()+" "
            "$V$0=withers,wither$V$.\n");

    }
} /* do_decay() */

/** @ignore yes */
void init() {
    add_command("smell");
    add_command("braid", "<indirect:living> hair with <direct:object:me>",
        (: do_braid( $1 ) :) );
} /* init() */

/** @ignore yes */
int do_braid( object *obs ) {
    object ob;

    if( sizeof(obs) > 1 ) {
        add_failed_mess("You can only $V one person's hair with $D.\n");
        return 0;
    }

    ob = obs[0];

    if( !living(ob) ) {
        add_failed_mess("$I is not living.\n");
        return 0;
    }

    if( ob->query_cannot_braid() ) {
        add_failed_mess("It appears "+ob->poss_short()+" hair is already "
            "braided full of flowers.\n");
        return 0;
    }

    ob->add_effect( BRAID_EFFECT, TO );
    add_succeeded_mess("$N $V $D into "+( ob == TP ? "$p" :
        ob->poss_short() )+" hair.\n");
    return 1;

} /* do_braid() */

/** @ignore yes */
int do_smell() {
    if( !decay ) {
        add_failed_mess("$D $V$0=appears,appear$V$ to be completely withered "
            "and $V$0=doesn't,don't$V$ smell that much anymore.\n");
        return 0;
    }

    if( smell_eff )
        TP->add_effect( smell_eff );

    if( smell_func ) {
        if( pointerp( smell_func ) )
            call_other( smell_func[0], smell_func[1], TP );
        else
            call_other( TO, smell_func, TP );
    }

    add_succeeded_mess( ( !smell_mess ? "$N $V $D.\n" : smell_mess ) );
    return 1;

} /* do_smell() */

/** @ignore yes */
void dest_me() {
    BIT_CONTROLLER->remove_bit(TO);
    ::dest_me();
} /* dest_me() */

/** @ignore yes */
mapping query_dynamic_auto_load() {
    mapping m;

    if( !query_name() || query_name() == "object" )
        return 0;

    m = ([ "::" : ::query_dynamic_auto_load() ]);

    if( decay )
        m["decay"] = decay;

    return m;

} /* query_dynamic_auto_load() */

/** @ignore yes */
void init_dynamic_arg( mapping m ) {
    if( m["::"] )
        ::init_dynamic_arg( m["::"] );
    decay = m["decay"];
    if( !decay ) {
        add_adjective("withered");
        BIT_CONTROLLER->remove_bit(TO);
    }
} /* init_dynamic_arg() */

/** @ignore yes */
mapping int_query_static_auto_load() {
    mapping m;
    m = ([ "::" : ::int_query_static_auto_load() ]);
    if( withered_long )
        m["withered long"] = withered_long;
    if( smell_mess )
        m["smell mess"] = smell_mess;
    if( smell_eff )
        m["smell eff"] = smell_eff;
    if( smell_func )
        m["smell func"] = smell_func;
    return m;
} /* int_query_static_auto_load() */

/** @ignore yes */
void init_static_arg( mapping m ) {
    if( !mappingp( m ) )
        return;
    if( m["::"] )
        ::init_static_arg( m["::"] );
    if( m["withered long"] )
        withered_long = m["withered long"];
    if( m["smell mess"] )
        smell_mess = m["smell mess"];
    if( m["smell eff"] )
        smell_eff = m["smell eff"];
    if( m["smell func"] )
        smell_func = m["smell func"];
} /* init_static_arg() */

/** @ignore yes */
mapping query_static_auto_load() {
    if( !query_name() || query_name() == "object" )
        return 0;
    if( base_name(TO) + ".c" == __FILE__ )
        return int_query_static_auto_load();
    return 0;
} /* query_static_auto_load() */

/** @ignore yes */
string extra_look() {

    if( !decay )
        return "";

    switch( decay / 10 ) {
      case 0..3:
        return "It is completely withered.\n";
      break;
      case 4..20:
        return "It is fairly withered.\n";
      break;
      case 21..50:
        return "It is somewhat withered.\n";
      break;
      case 51..80:
        return "It has started to wither.\n";
      break;
      default:
        return "It looks quite fresh.\n";
    }
} /* extra_look() */

/** @ignore yes */
mixed stats() {
    return ::stats() + ({ ({ "decay", decay }), });
} /* stats() */