SYNOPSIS
        object * clones()
        object * clones(int what)
        object * clones(string|object obj [, int what])

DESCRIPTION
        The efuns returns an array with all clones of a certain blueprint.
        The array is subject to the usual runtime limits.

        If <obj> is given, all clones of the blueprint of <obj> (which
        may be <obj> itself) are returned, otherwise all clones of the
        current object resp. of the current object's blueprint. If <obj>
        is given as string, it must name an existing object.

        <what> selects how to treat clones made from earlier versions
        of the blueprint:
          == 0: (default) return the clones of the current blueprint only.
          == 1: return the clones of the previous blueprints only.
          == 2: return all clones of the blueprint.

        Note: this efun is computationally expensive.

        If the driver is compiled with DYNAMIC_COSTS, the cost of this
        efun is proportional to the number of objects in the game.

EXAMPLES
        object o, p;
        o = clone_object("/std/thing"); /* or "std/thing" in COMPAT mode */
        destruct(find_object("/std/thing"));
        p = clone_object("/std/thing");

        clones("/std/thing")    --> returns ({ p })
        clones("/std/thing", 0) --> returns ({ p })
        clones("/std/thing", 1) --> returns ({ o })
        clones("/std/thing", 2) --> returns ({ o, p })

HISTORY
        Introduced in LDMud 3.2.8.
        LDMud 3.2.9 added the dynamic cost.

SEE ALSO
        blueprint(E), clone_object(E), clonep(E)
