# 1 "bin/root_obj.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/root_obj.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/root_obj.cl" 2

object #1
    list owners;
    num public = 1;
    str name = "Root Object";

    verb "@rename" : "to" = rename_verb;

    method init
        if (this == #1)
            this.add_owner(#11);
        elseif ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            owners = {};
        else
            raise E_PERM;
        endif
    endmethod

    method clone
        var new;

        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) && !public)
            raise(E_PERM);
        else
            new = clone();
            new.init();
            new.add_owner(player);
            if (args)
                new.set_name(args[1]);
            endif
            return new;
        endif
    endmethod

    method destroy
        var owner;

        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            for owner in (owners)
                owner.rm_creation(this);
            endfor
            destroy();
        else
            raise(E_PERM);
        endif
    endmethod

    method name
        return name;
    endmethod

    method id
        return (name + "(" + tostr(this) + ")");
    endmethod

    method sdesc
        return ("You see " + name + " here.");
    endmethod

    method set_name
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            name = args[1];
        else
            raise(E_PERM);
        endif
    endmethod

    method rename_verb
        var r;
        ignore E_RANGE;

        if (!this.match(args[2]))
            return 1;
        elseif (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            player.tell("You can't rename that.");
            return 0;
        endif
        r = this.set_name(args[4]);
        if (r == E_RANGE)
            player.tell("You can't use that new name.");
        else
            player.tell("Name set.");
        endif
    endmethod

    method publish
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            public = 1;
        endif
    endmethod

    method unpublish
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            public = 0;
        endif
    endmethod

    method add_parent
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            chparents(parents + args[1]);
        endif
    endmethod

    method rm_parent
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            chparents(parents - args[1]);
        endif
    endmethod

    method chparents
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            chparents(args[1]);
        endif
    endmethod

    method add_verb
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            return add_verb(args[1], args[2], args[3]);
        endif
    endmethod

    method rm_verb
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            return rm_verb(args[1]);
        endif
    endmethod

    method rm_method
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            return rm_method(args[1]);
        endif
    endmethod

    method rm_var
        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise(E_PERM);
        else
            return rm_var(args[1]);
        endif
    endmethod

    method owners
        return owners;
    endmethod

    method add_owner
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            owners = owners + args[1];
            args[1].add_creation(this);
        else
            raise(E_PERM);
        endif
    endmethod

    method rm_owner
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            owners = owners - args[1];
            args[1].rm_creation(this);
        else
            raise E_PERM;
        endif
    endmethod

    method show
        var vars;
        var item;

        player.tell(this.id + "   Size:  " + tostr(objsize()) + " bytes");
        if (parents)
            player.tell("Parents:  " + tostr(parents));
        else
            player.tell("No parents.");
        endif
        if (!public && !(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            player.tell("The rest of the object is not public.");
            return;
        endif

        vars = vars();
        if (vars)
            for item in (vars)
                player.tell("  " + item + ":  " + tostr(getvar(item)));
            endfor
        else
            player.tell("No vars.");
        endif

    endmethod

    method verbs
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) || public)
            return verbs();
        endif
    endmethod

    method methods
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) || public)
            return methods();
        endif
    endmethod

    method spew_method
        var code;
        ignore E_METHODNF;

        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) && !public)
            raise E_PERM;
        endif
        code = spew_method(args[1]);
        if (code == E_METHODNF);
            return "That object does not define that method.";
        else
            return code;
        endif
    endmethod

    method list_method
        var code, parent;
        ignore E_METHODNF;

        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) && !public)
            raise E_PERM;
        endif
        code = list_method(args[1], 0, 0);
        if (code)
            return code;
        endif

        parent = find_method(args[1]);
        if (parent)
            code = parent.list_method(args[1]);
            if (code)
                return "That object does not define that method, but its ancestor " + parent.id + " does:\n" + code;
            endif
        endif
        return "That object does not define that method.";
    endmethod
endobject
# 1 "bin/sys_obj.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/sys_obj.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/sys_obj.cl" 2

object #0
    parents #1;

    name = "The System Object";

    list players = { #11 } , connected_players;
    list connected_servers;
    list wizards = { #11 };
    list visitors;
    obj player_class;
    num dbtop;

    method init
        if (caller != #0)
            raise(E_PERM);
        else
            this.add_owner(#11);
        endif
    endmethod

    method boot_server
        if (caller != #0)
            raise(E_PERM);
        endif
        connected_players = {};
        connected_servers = { #0 };
        player_class = #10;
    endmethod

    method resynch
        var item, dummy;

        if (caller != #0)
            raise(E_PERM);
        endif
        for item in (visitors)

            if (serverof(item[1].location))
                dummy = item[2].remove(item[1]);
                visitors = visitors - item;
            endif
        endfor
    endmethod

    method add_wizard
        if (!(caller in wizards))
            player.tell("Permission denied.");
        else
            wizards = wizards + args[1];
            player.tell("Wizard added.");
        endif
    endmethod

    method rm_wizard
        if (!(caller in wizards))
            player.tell("Permission denied.");
        else
            wizards = wizards - args[1];
            player.tell("Wizard removed.");
        endif
    endmethod

    method wizards
        return wizards;
    endmethod

    method convtime
        var r, time, howmany;

        if (lengthof(args) != 1)
            raise(E_RANGE);
        elseif (typeof(args[1]) != NUM)
            raise(E_TYPE);
        else
            time = args[1];
            if (time > (24 * 60 * 60))
                r = " day";
                howmany = time / (24 * 60 * 60);
            elseif (time > (60 * 60))
                r = " hour";
                howmany = time / (60 * 60);
            elseif (time > 60)
                r = " minute";
                howmany = time / 60;
            else
                r = " second";
                howmany = time;
            endif
            if(howmany != 1)
                r = r + "s";
            endif
            return tostr(howmany) + r;
        endif
    endmethod

    method who
        var dude;



        if (args)
            player.tell(args[1]);
        endif
        player.tell("Player Name       On For      Idle");
        for dude in (connected_players)
            player.tell(pad(dude.name, 17) + " "
                + pad(this.convtime(time() - dude.connected_at), 11) + " "
                + pad(this.convtime(time() - dude.last_cmd_at), 11));
        endfor
    endmethod

    method add_visitor
        visitors = visitors + {args[1], args[2]};
    endmethod

    method rm_visitor
        visitors = visitors + {args[1], args[2]};
    endmethod

    method visitors
        return visitors;
    endmethod

    method connect_player
        if (caller != #0)
            raise E_PERM;
        else
            connected_players = connected_players + args[1];
            args[1].connect();
        endif
    endmethod

    method create_player
        ignore E_METHODNF;

        if (caller != #0)
            raise E_PERM;
        else
            connected_players = connected_players + args[1];
            players = players + args[1];
            args[1].connect();
        endif
    endmethod

    method disconnect_player
        if (caller != #0)
            raise E_PERM;
        else
            connected_players = connected_players - args[1];
            args[1].disconnect();
        endif
    endmethod

    method rm_player
        if ((caller in wizards) || caller == args[1])
            players = players - args[1];
        else
            raise E_PERM;
        endif
    endmethod

    method players
        return players;
    endmethod

    method connected_players
        return connected_players;
    endmethod

    method find_player
        var dude;

        for dude in (players)
            if (dude.name == args[1])
                return dude;
            endif
        endfor
        return #-1;
    endmethod

    method find_connected_player
        var dude;

        for dude in (connected_players)
            if (dude.name == args[1])
                return dude;
            endif
        endfor
        return #-1;
    endmethod

    method connect_server
        connected_servers = connected_servers + args[1];
        #0 .resynch();
    endmethod

    method disconnect_server
        connected_servers = connected_servers - args[1];
    endmethod

endobject
# 1 "bin/located_obj.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/located_obj.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/located_obj.cl" 2

object #2
    parents #1;

    name = "Generic Located Object";

    obj location;
    list contents;

    method init
        if (this == #2)
            this.add_owner(#11);
        else
            location = #-1;
            contents = {};
            pass();
        endif
    endmethod

    method destroy
        var thing, thome;
        ignore E_SERVERDN, E_OBJNF, E_METHODNF;

        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            if (location)
                location.remove(this);
            endif
            for thing in (contents)
                thome = thing.home;
                if (thome)
                    thing.moveto(thome);
                else
                    thing.moveto(#-1);
                endif
            endfor
            pass();
        else
            raise(E_PERM);
        endif
    endmethod

    blocked method location
        return location;
    endmethod

    method contained_by
        if (location == args[1])
            return 1;
        elseif (!location)
            return 0;
        else
            return location.contained_by(args[1]);
        endif
    endmethod

    method contents
        return contents;
    endmethod

    method match_contents
        var thing;

        for thing in (contents)
            if (thing.match(args[1]))
                return thing;
            endif
        endfor
        return #-1;
    endmethod

    method moveto
        var dest;
        ignore E_SERVERDN, E_OBJNF, E_METHODNF;


        dest = args[1];
        if (dest == location)
            return 1;
        elseif (dest == this)
            return 0;
        elseif (dest.contained_by(this))
            return 0;
        endif
        lock ("moveto");




        if (dest && !dest.accept(this))
            return 0;
        endif





        if (location)
            location.remove(this);
        endif



        location = dest;

        return 1;
    endmethod




    method accept
        var what;

        what = args[1];
        contents = contents + what;
        if (serverof(what))
            #0 .add_visitor(what, this);
        endif
        return 1;
    endmethod




    method remove
        var what;

        what = args[1];
        contents = contents - what;
        if (serverof(what))
            #0 .rm_visitor(what, this);
        endif
    endmethod

endobject
# 1 "bin/described_obj.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/described_obj.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/described_obj.cl" 2

object #3
    parents #1;

    str name = "Generic Described Object";
    str desc = "";

    verb "l*ook ex*amine" = look_verb;
    verb "@desc*ribe" : "as" = desc_verb;

    method init
        if (this == #3)
            this.add_owner(#11);
        else
            pass();
        endif
    endmethod

    method match
        var word;

        if (!args[1])
            return 0;
        elseif (args[1][1] == "#" && toobj(args[1]) == this)
            return 1;
        endif
        for word in (explode(args[1]))
            if (!match(name, word))
                return 0;
            endif
        endfor
        return 1;
    endmethod

    method desc
        return desc;
    endmethod

    method sdesc
        return ("You see " + name + " here.");
    endmethod

    method desc_verb
        if (!this.match(args[2]))
            return 1;
        elseif (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            player.tell("Permission denied.");
        else
            desc = args[4];
            player.tell("Description set.");
        endif
    endmethod

    method look_verb
        if (!this.match(args[2]))
            return 1;
        endif
        this.look();
    endmethod

    method look
        if (desc)
            player.tell(desc);
        else
            player.tell("You see nothing special.");
        endif
    endmethod
endobject
# 1 "bin/thing.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/thing.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/thing.cl" 2

object #4
    parents #2, #3;

    name = "Generic Thing";

    obj home;

    verb "get take" = get;
    verb "drop throw" = drop;

    method location
        return #-1;
    endmethod

    method init
        ignore E_METHODNF;

        if (this == #4)
            this.add_owner(#11);
        else
            if (player.home)
                home = player.home;
            else
                home = player;
            endif
            pass();
            this.moveto(player);
        endif
    endmethod

    method id
        return pass() to #3;
    endmethod

    method accept
        return 0;
    endmethod

    method get
        var result;

        if (args[1] != "all" && !this.match(args[2]))
            return 1;
        elseif (location == player)
            result = "You already have that!";
        elseif (location != player.location)
            result = "I don't see that here.";
        elseif (this.moveto(player))
            result = "Taken.";
            player.location.announce(player.name + " takes " + this.name + ".",
                                     {player});
        else
            result = "You can't get that.";
        endif
        if (args[1] == "all")
            player.tell(name + ":  " + result);
        else
            player.tell(result);
        endif
    endmethod

    method drop
        var result;

        if (args[1] != "all" && !this.match(args[2]))
            return 1;
        elseif (location != player)
            result = "You don't have that!";
        elseif (this.moveto(player.location))
            result = "Dropped.";
            player.location.announce(player.name + " drops " + this.name + ".",
                                     {player});
        else
            result = "You can't drop that.";
        endif
        if (args[1] == "all")
            player.tell(name + ":  " + result);
        else
            player.tell(result);
        endif
    endmethod
endobject
# 1 "bin/container.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/container.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/container.cl" 2

object #5
    parents #4;

    name = "Generic Container";

    verb "put place insert" : "in into" = put_in;
    verb "get remove take" : "from in" = remove_from;
    verb "l*ook" : "in into inside" = look_in;

    method init
        if (this == #5)
            this.add_owner(#11);
        endif
        pass();
    endmethod

    method accept
        return pass(args[1]) to #2;
    endmethod

    method put_in
        var what;

        if (!this.match(args[4]))
            return 1;
        endif
        what = player.match_contents(args[2]);
        if (!what)
            player.tell("You don't have that.");
        elseif (what.moveto(this))
            player.tell("You put " + what.name + " into " + this.name + ".");
        else
            player.tell("You can't put " + what.name + " into " + this.name
                        + ".");
        endif
    endmethod

    method remove_from
        var what;

        if (!this.match(args[4]))
            return 1;
        endif
        what = this.match_contents(args[2]);
        if (!what)
            player.tell("That object is not inside " + this.name + ".");
        elseif (what.moveto(player))
            player.tell("You remove " + what.name + " from " + this.name + ".");
        else
            player.tell("You can't remove that.");
        endif
    endmethod

    method look
        var thing;

        pass() to #3;
        if (this.contents)
            player.tell("Containing:");
            for thing in (this.contents)
                player.tell("  " + thing.name);
            endfor
        endif
    endmethod

    method look_in
        var thing;

        if (!this.match(args[4]))
            return 1;
        endif
        if (contents)
            player.tell("Inside " + name + " you see:");
            for thing in (contents)
                player.tell("  " + thing.name);
            endfor
        else
            player.tell("You see nothing inside " + name + ".");
        endif
    endmethod

endobject
# 1 "bin/room.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/room.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/room.cl" 2

object #6
    parents #2, #3;

    list exits;

    name = "Generic Room";

    verb "go move" = go_verb;

    method init
        if (this == #6)
            this.add_owner(#11);
        elseif ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            exits = {};
            pass();
        else
            raise E_PERM;
        endif
    endmethod

    method destroy
        var exit, thing;
        ignore E_SERVERDN, E_OBJNF;

        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            raise E_PERM;
        else
            for exit in (exits)
                exit.destroy();
            endfor
            pass() to #2;
        endif
    endmethod

    method id
        return pass() to #3;
    endmethod

    method exits
        return exits;
    endmethod

    method announce



        var dude;
        ignore E_METHODNF, E_SERVERDN;

        for dude in (contents)
            if (lengthof(args) == 1 || !(dude in args[2]))
                dude.tell(args[1]);
            endif
        endfor
    endmethod

    method go_verb
        if (!args[2])
            player.tell("Go where?");
        elseif(this.go(args[2]))
            player.tell("There is no passage in that direction.");
        endif
    endmethod

    method go
        var exit;

        for exit in (exits)
            if (exit.match(args[1]) && exit.dest)
                exit.activate();
                return 0;
            endif
        endfor
        return -1;
    endmethod

    method look
        var thing;
        var nm;
        ignore E_SERVERDN, E_OBJNF;

        player.tell(name);
        if (desc)
            player.tell(desc);
        endif
        if (contents)
            for thing in (contents)
                if (thing != player)
                    nm = thing.sdesc;
                    if (nm == E_SERVERDN || nm == E_OBJNF)
                        player.tell("(Ghost of " + tostr(thing) + " is here.)");
                    else
                        player.tell(nm);
                    endif
                endif
            endfor
        endif
    endmethod

    method match
        return (args[1] == "here" && player.location == this);
    endmethod

    method match_exit
        var exit;

        for exit in (exits)
            if (exit.match(args[1]))
                return exit;
            endif
        endfor
        return #-1;
    endmethod

    method link_ok
        return ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners));
    endmethod

    method open_ok
        return ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners));
    endmethod

    method add_exit
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            exits = exits + args[1];
        else
            raise (E_PERM);
        endif
    endmethod

    method rm_exit
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) || caller in exits)
            exits = exits - args[1];
        else
            raise(E_PERM);
        endif
    endmethod

endobject
# 1 "bin/exit.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/exit.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/exit.cl" 2

object #7
    parents #3;

    name = "Generic Exit";

    obj source;
    obj dest;
    str leave;
    str oleave;
    str arrive;
    str oarrive;

    method init
        if (this == #7)
            this.add_owner(#11);
        elseif ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            source = #-1;
            dest = #-1;
            pass();
        else
            raise E_PERM;
        endif
    endmethod

    method destroy
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners) || caller == source)
            source.rm_exit(this);
            pass();
        else
            raise E_PERM;
        endif
    endmethod

    method match
        return match_full(name, args[1], ";");
    endmethod

    method dest
        return dest;
    endmethod

    method set_dest
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            dest = args[1];
        else
            raise(E_PERM);
        endif
    endmethod

    method set_source
        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            source = args[1];
        else
            raise(E_PERM);
        endif
    endmethod

    method activate



        var pname;
        ignore E_SERVERDN;

        pname = player.name;




        if (dest.name == E_SERVERDN)
            player.tell("You can't go that way right now.");
            return;
        elseif (!player.moveto(dest, leave, oleave, arrive, oarrive))
            player.tell("You can't go that way.");
            return;
        endif
    endmethod

endobject
# 1 "bin/player.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/player.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/player.cl" 2

object #8
    parents #2, #3;

    name = "Generic Player";

    str password;
    str gender;
    num connected_at, last_cmd_at;
    obj home;
    list creations;
    num reading;
    str read_input;
    str done_reading;


    obj nick_root = #1;
    obj nick_desc = #3;
    obj nick_loc = #2;
    obj nick_thing = #4;
    obj nick_cont = #5;
    obj nick_room = #6;
    obj nick_exit = #7;
    obj nick_player = #8;
    obj nick_builder = #9;
    obj nick_prog = #10;
    obj nick_wizard = #11;


    verb "dr*op th*row" = drop_cmd;
    verb "get ta*ke" = get_cmd;
    verb "help" = help_cmd;
    verb "home" = gohome_cmd;
    verb "i inv*entory" = inventory_cmd;
    verb "l*ook" = look_cmd;
    verb "news" = news_cmd;
    verb "pa*ge" = page_cmd;
    verb "pa*ge" : "with" = page_cmd;
    verb "@password password" : "to" = password_cmd;
    verb "@password password" = password_cmd;
    verb "po*se" = pose_cmd;
    verb "quit" = quit_cmd;
    verb "rwho" = rwho_cmd;
    verb "sa*y" = say_cmd;
    verb "who" = who_cmd;
    verb "wh*isper" : "to" = whisper_cmd;
    verb "wiz*ards" = wizards_cmd;

    method init
        if (this == #8)
            this.add_owner(#11);
        elseif ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            pass();
            this.add_owner(this);
            home = #12;
            this.moveto(home);
            last_cmd_at = time();
        else
            raise E_PERM;
        endif
    endmethod

    method destroy
        var thing, tid;
        ignore E_SERVERDN, E_OBJNF, E_METHODNF;

        if ((caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            for thing in (creations)
                tid = thing.id;
                if (tid == E_OBJNF || tid == E_SERVERDN)
                    continue;
                endif
                if (thing != this)
                    thing.rm_owner(this);
                    if (!thing.owners)
                        thing.destroy();
                    endif
                endif
            endfor
            #0 .rm_player(this);
            pass() to #2;
        else
            raise E_PERM;
        endif
    endmethod

    method id
        return pass() to #3;
    endmethod

    method psub
        var n, s, o, p, q, r;

        n = name;
        if (gender && gender[1] == "m")
            s = "he"; o = "him"; p = "his"; q = "his"; r = "himself";
        elseif (gender && gender[1] == "f")
            s = "she"; o = "her"; p = "her"; q = "hers"; r = "herself";
        else
            s = "it"; o = "it"; p = "its"; q = "its"; r = "itself";
        endif
        return psub(args[1]);
    endmethod

    method moveto
        var oldloc;
        ignore E_METHODNF;

        oldloc = location;
        if (pass(args[1]))
            if (lengthof(args) > 1 && args[2])
                echo(args[2]);
            endif
            if (lengthof(args) > 2 && args[3])
                oldloc.announce(this.psub(args[3]), {this, location});
            endif
            oldloc.announce(name + " has left.", {this, location});
            this.look_around();
            if (lengthof(args) > 3 && args[4])
                echo(args[4]);
            endif
            if (lengthof(args) > 4 && args[5])
                location.announce(this.psub(args[5]), {this, oldloc});
            endif
            location.announce(name + " has arrived.", {this, oldloc});
            return 1;
        else
            return 0;
        endif
    endmethod

    method drop_cmd
        var thing;
        ignore E_SERVERDN, E_METHODNF, E_OBJNF;

        if (caller != this)
            return 1;
        elseif (args[2] == "all" || args[2] == "everything")
            if (!contents)
                echo("You are empty-handed.");
            else
                for thing in (contents)
                    if (thing.drop("all") == E_METHODNF)
                        echo(thing.name + ":  You can't drop that.");
                    endif
                endfor
            endif
        else
            return 1;
        endif
    endmethod

    method get_cmd
        var cont, thing;
        ignore E_SERVERDN, E_METHODNF, E_OBJNF;

        if (caller != this)
            return 1;
        elseif (args[2] == "all" || args[2] == "everything")
            cont = location.contents - this;
            if (!cont)
                echo("There's nothing here to get!");
            else
                for thing in (cont)
                    if (thing.get("all", "") == E_METHODNF)
                        echo(thing.name + ":  You can't get that.");
                    endif
                endfor
            endif
        else
            return 1;
        endif
    endmethod

    method input_to
        if (caller != this && !(caller in #0 .wizards))
            raise(E_PERM);
        endif
        reading = 1;
        read_input = "";
        done_reading = args[1];
    endmethod

    method parse
        var thing, cmd, r;
        ignore E_SERVERDN;

        if (caller != this && !(caller in #0 .wizards))
            raise(E_PERM);
        endif
        lock("parse");
        last_cmd_at = time();
        cmd = args[1];
        if (reading)
            if (cmd == ".")
                reading = 0;
                this.(done_reading)(read_input);
                read_input = "";
            else
                read_input = read_input + cmd + "\n";
            endif
            return;
        endif
        if (!cmd)
            return;
        elseif (cmd[1] == "\"")
            if (lengthof(cmd) > 1)
                cmd = "say " + cmd[2..];
            else
                cmd = "say ";
            endif
        elseif (cmd[1] == ":")
            if (lengthof(cmd) > 1)
                cmd = "pose " + cmd[2..];
            else
                cmd = "pose ";
            endif
        elseif (cmd[1] == ";")
            if (lengthof(cmd) > 1)
                cmd = "eval " + cmd[2..];
            else
                cmd = "eval ";
            endif
        endif

        if (!this.call_verb(cmd))
            return;
        endif
        for thing in (contents)
            if (thing.call_verb(cmd) == 0) return; endif
        endfor
        if (location)
            if (location.call_verb(cmd) == 0)
                return;
            endif
            for thing in (location.contents)
                if (thing != this)
                    if (thing.call_verb(cmd) == 0) return; endif
                endif
            endfor
            if (location.go(cmd) == 0) return; endif
            for thing in (location.exits)
                if (thing.call_verb(cmd) == 0)
                    return;
                endif
            endfor
        endif
        echo("I don't understand that.");
    endmethod

    method home
        return home;
    endmethod

    method match
        if (args[1] == "me" && player == this)
            return 1;
        else
            return (pass(args[1]) to #3);
        endif
    endmethod

    method match_env
        var s, what, loc;
        ignore E_SERVERDN, E_VARNF;

        s = args[1];
        if (!s)
            return #-1;
        elseif (s[1] == "#")
            return toobj(s);
        elseif (s == "me")
            return player;
        elseif (s == "here" && location)
            return location;
        elseif (s == "nowhere")
            return #-1;
        elseif (s[1] == "$" && lengthof(s) > 1)
            what = getvar("nick_" + s[2..]);
            if (what == E_VARNF || typeof(what) != OBJ)
                return #-1;
            else
                return what;
            endif
        endif
        what = this.match_contents(s);
        if (what)
            return what;
        endif
        if (location)
            what = location.match_contents(s);
            if (what)
                return what;
            endif
        endif
        return #-1;
    endmethod

    method disconnect
        location.announce(name + " has disconnected.", {player});
    endmethod

    method connect
        connected_at = time();
        this.look_around();
        if (location)
            location.announce(name + " has connected.", {player});
        endif
    endmethod

    method connected_at
        return connected_at;
    endmethod

    method last_cmd_at
        return last_cmd_at;
    endmethod

    method tell
        echo(args[1]);
    endmethod

    method add_creation
        creations = creations + args[1];
    endmethod

    method rm_creation
        creations = creations - args[1];
    endmethod

    method sdesc
        return (name + " is here.");
    endmethod

    method set_name
        var existing;


        existing = #0 .find_player(args[1]);
        if (existing && existing != this)
            raise(E_RANGE);
        elseif (" " in args[1])
            raise(E_RANGE);
        else
            pass(args[1]) to #3;
        endif
    endmethod

    method look
        pass() to #3;
        if (contents)
            player.tell("Carrying:");
            this.inv();
        endif
    endmethod

    method help_cmd
        var filename, what;
        ignore E_FILE, E_METHODNF;

        if (caller != this)
            return 1;
        endif
        if(args[2])
            filename = "help/" + args[2] + ".txt";
        else
            filename = "help/intro.txt";
        endif
        if (echo_file(filename) == 0)
            return;
        endif
        what = this.match_env(args[2]);
        if (what)
            if (!what.help())
                echo("There is no help on that object.");
            endif
        else
            echo("There is no help on that topic.");
        endif
    endmethod

    method inv
        var thing, nm;
        ignore E_SERVERDN;

        for thing in (contents)
            nm = thing.name;
            if (nm == E_SERVERDN)
                player.tell("  (Ghost of " + tostr(thing) + ")");
            else
                player.tell("  " + nm);
            endif
        endfor
    endmethod

    method gohome_cmd
        ignore E_SERVERDN;

        if (caller != this)
            return 1;
        endif
        this.moveto(home, "Click click click...", name + " goes home.",
                          "", name + " comes home.");
    endmethod

    method inventory_cmd
        var item;

        if (contents)
            echo("You are carrying:");
            this.inv();
        else
            echo("You are empty-handed.");
        endif
    endmethod

    method look_around
        ignore E_SERVERDN, E_OBJNF;
        var r;

        player = this;
        r = location.look();
        if (r == E_SERVERDN)
            echo("The outlines of the room you are in have suddenly become hazy and indistinct.  Going \"home\" might be useful about now.");
        elseif (r == E_OBJNF)
            echo("You're absolutely nowhere.  Go home.");
        endif
    endmethod

    method look_cmd
        if (!args[2])
            this.look_around();
        elseif (this.match(args[2]))
            this.look();
        else
            return 1;
        endif
    endmethod

    method news_cmd
        var what;
        ignore E_FILE;

        if (caller != this)
            return 1;
        elseif (!args[2])
            what = "news/intro.txt";
        else
            what = "news/" + args[2] + ".txt";
        endif
        if (echo_file(what) == E_FILE)
            echo("There is no news on that topic.");
        endif
    endmethod

    method page_cmd
        var who, locname;
        ignore E_SERVERDN, E_METHODNF, E_OBJNF;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  page <player>");
            echo("        page <player> with <message>");
        endif
        locname = location.name;
        who = #0 .find_connected_player(args[2]);
        if (!who)
            echo("That player is not connected.");
        elseif (args[4])
            who.tell(name + " pages, \"" + args[4] + "\"");
            echo("Your message has been sent.");
        elseif (typeof(locname) == STR)
            who.tell("You sense that " + name + " is looking for you in "
                        + locname + ".");
            echo("Your message has been sent.");
        else
            who.tell("You sense that " + name + " is looking for you.");
            echo("Your message has been sent.");
        endif
    endmethod

    method password_cmd
        if (caller != this)
            return 1;
        elseif (!args[2] || !args[4])
            echo("Usage:  @password <oldpasswd> to <newpasswd>");
        elseif (crypt(args[2], password[1..2]) != password)
            echo("Incorrect old password.");
        else
            password = crypt(args[4]);
            echo("Password changed.");
        endif
    endmethod

    method pose_cmd
        if (caller != this)
            return 1;
        endif
        location.announce(name + " " + args[2]);
    endmethod

    method rwho_cmd
        var sysobj, header;
        ignore E_SERVERDN;

        for sysobj in (servers())
            header = "Server \"" + servername(sysobj) + "\":  ";
            if (sysobj.who(header) == E_SERVERDN)
                echo(header + "Server down.");
            else
                echo("---");
            endif
        endfor
    endmethod

    method say_cmd
        if (caller != this)
            return 1;
        endif
        echo("You say, \"" + args[2] + "\"");
        location.announce(name + " says, \"" + args[2] + "\"", {player});
    endmethod

    method teleport_cmd
        var what, dest;

        what = this.match_env(args[2]);
        dest = this.match_env(args[4]);
        if (!what)
            echo("Teleport what?");
        elseif (!dest && args[4] != "nowhere")
            echo("Teleport it where?");
        elseif(!what.moveto(dest, "You feel a wrenching sensation.."))
            echo("You can't teleport that.");
        else
            echo("Teleported.");
        endif
    endmethod

    method quit_cmd
        if (caller != this && !(caller in #0 .wizards))
            return 1;
        endif
        quit();
    endmethod

    method wizards_cmd
        var wiz;

        echo("Your wizards are:");
        for wiz in (#0 .wizards)
            echo("  " + wiz.name);
        endfor
    endmethod

    method who_cmd
        if (caller != this)
            return 1;
        endif
        #0 .who;
    endmethod

    method whisper_cmd
        var who;
        ignore E_METHODNF;

        if (caller != this)
            return 1;
        endif
        who = this.match_env(args[4]);
        if (!who)
            echo("I don't see that here.");
        elseif (who.tell(name + " whispers, \"" + args[2] + "\"") == 0)
            echo("You whisper, \"" + args[2] + "\" to " + who.name);
        else
            echo("You can't whisper to that!");
        endif
    endmethod

endobject
# 1 "bin/builder.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/builder.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/builder.cl" 2

object #9
    parents #8;

    verb "@addo*wner" : "on to onto" = addowner_cmd;
    verb "@addo*wner" = addowner_cmd;
    verb "@addp*arent" : "on to onto" = addparent_cmd;
    verb "@addp*arent" = addparent_cmd;
    verb "@clone" = clone_cmd;
    verb "@clone" : "named" = clone_cmd;
    verb "@create" = create_cmd;
    verb "@destroy" = destroy_cmd;
    verb "@dig" = dig_cmd;
    verb "@find" = find_cmd;
    verb "@link" = link_cmd;
    verb "@link" : "to" = link_cmd;
    verb "@list" : "on" = list_cmd;
    verb "@list" = list_cmd;
    verb "@open" = open_cmd;
    verb "@open" : "to" = open_cmd;
    verb "@methods" = methods_cmd;
    verb "@mutate" : "to into" = mutate_cmd;
    verb "@mutate" = mutate_cmd;
    verb "@nick*name" : "is as to" = nickname_cmd;
    verb "@nick*name" = nickname_cmd;
    verb "@pub*lish" = publish_cmd;
    verb "@unpub*lish" = unpublish_cmd;
    verb "@rmp*arent" : "from on to onto" = rmparent_cmd;
    verb "@rmp*arent" = rmparent_cmd;
    verb "@rmo*wner" : "from on to onto" = rmowner_cmd;
    verb "@rmo*wner" = rmowner_cmd;
    verb "@show" = show_cmd;
    verb "@spew" : "on" = spew_cmd;
    verb "@spew" = spew_cmd;
    verb "@tel*eport" : "to" = teleport_cmd;
    verb "@ve*rbs" = verbs_cmd;

    name = "Generic Builder";

    method init
        if (this == #9)
            this.add_owner(#11);
        else
            pass();
        endif
    endmethod

    method clone_cmd
        var parent, new;

        if (caller != this)
            return 1;
        elseif (!args[2] || (args[3] && !args[4]))
            echo("Usage:  @clone <thing>");
            echo("        @clone <thing> named <name>");
            return 0;
        endif
        parent = this.match_env(args[2]);
        if (!parent)
            echo("I don't see that here.");
        else
            new = parent.clone(args[4]);
            if (!new)
                echo("You can't clone that.");
            else
                echo("New \"" + parent.name + "\" cloned:  " + new.id);
            endif
        endif
    endmethod

    method mutate_cmd
        var r, what, newparent;
        ignore E_MAXREC, E_RANGE, E_INVIND, E_OBJNF, E_PERM;

        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @mutate <thing> into <what>");
            return 0;
        endif
        what = this.match_env(args[2]);
        newparent = this.match_env(args[4]);
        if (!what || !newparent)
            echo("I don't see that here.");
        else
            r = what.chparents({newparent});
            if (typeof(r) == ERR && r != E_NONE)
                this.parent_result(r);
            else
                echo("Mutated.");
            endif
        endif
    endmethod

    method nickname_cmd
        var what;
        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @nickname <thing> is <nickname>");
            return 0;
        endif
        what = this.match_env(args[2]);
        if (!what)
            echo("I don't see that here.");
        else
            setvar("nick_" + args[4], what);
            echo("Nickname set.");
        endif
    endmethod

    method publish_cmd
        var what;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  @publish <thing>");
            return 0;
        endif
        what = this.match_env(args[2]);
        if (!what)
            echo("I don't see that here.");
        elseif (what.publish())
            echo("You can't publish that.");
        else
            echo(what.id + " published.");
        endif
    endmethod

    method unpublish_cmd
        var what;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  @unpublish <thing>");
            return 0;
        endif
        what = this.match_env(args[2]);
        if (!what)
            echo("I don't see that here.");
        elseif (what.unpublish())
            echo("You can't publish that.");
        else
            echo(what.id + " unpublished.");
        endif
    endmethod

    method addowner_cmd
        var what, owner;
        ignore E_PERM;

        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @addowner <what> to <thing>");
            return 0;
        endif
        owner = #0 .find_player(args[2]);
        what = this.match_env(args[4]);
        if (!owner)
            echo("\"" + args[2] + "\" is not the name of any player.");
        elseif (!what)
            echo("I don't see that here.");
        elseif (what.add_owner(owner) == E_PERM)
            echo("Permission denied.");
        else
            echo("Owner added.");
        endif
    endmethod

    method rmowner_cmd
        var what, owner;
        ignore E_PERM;

        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @rmowner <what> from <thing>");
            return 0;
        endif
        owner = #0 .find_player(args[2]);
        what = this.match_env(args[4]);
        if (!owner)
            echo("\"" + args[2] + "\" is not the name of any player.");
        elseif (!what)
            echo("I don't see that here.");
        elseif (what.rm_owner(owner) == E_PERM)
            echo("Permission denied");
        else
            echo("Owner removed.");
        endif
    endmethod

    method addparent_cmd
        var r, what, parent;
        ignore E_MAXREC, E_RANGE, E_INVIND, E_OBJNF, E_PERM;
        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @addparent <what> to <thing>");
            return 0;
        endif
        what = this.match_env(args[4]);
        parent = this.match_env(args[2]);
        if (!what || !parent)
            echo("I don't see that here.");
        else
            r = what.add_parent(parent);
            if (typeof(r) == ERR && r != E_NONE)
                this.parent_result(r);
            else
                echo("Parent added.");
            endif
        endif
    endmethod

    method rmparent_cmd
        var r, what, parent;
        ignore E_MAXREC, E_RANGE, E_INVIND, E_OBJNF, E_PERM;
        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @rmparent <what> from <thing>");
            return 0;
        endif
        what = this.match_env(args[4]);
        parent = this.match_env(args[2]);
        if (!what || !parent)
            echo("I don't see that here.");
        else
            r = what.rm_parent(parent);
            if (typeof(r) == ERR && r != E_NONE)
                this.parent_result(r);
            else
                echo("Parent removed.");
            endif
        endif
    endmethod

    method parent_result
        if (args[1] == E_OBJNF)
            echo("Parent does not exist.");
        elseif (args[1] == E_INVIND)
            echo("Parent must be local.");
        elseif (args[1] == E_PERM)
            echo("Parent permission denied.");
        elseif (args[1] == E_RANGE)
            echo("Object must have at least one parent.");
        elseif (args[1] == E_MAXREC)
            echo("New parent would cause a loop.");
        else
            echo("Parent invalid.");
        endif
    endmethod

    method create_cmd
        var new;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  @create <name>");
        else
            new = #4 .clone(args[2]);
            echo("Thing created:  " + new.id);
        endif
    endmethod

    method destroy_cmd
        var what;

        if (caller != this)
            return 1;
        endif
        what = this.match_env(args[2]);
        if (!what)
            echo("What's a " + args[2] + "?");
        else
            what.destroy();
            echo("Destroyed.");
        endif
    endmethod

    method dig_cmd
        var new;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Dig what?");
            return 0;
        endif
        new = #6 .clone(args[2]);
        echo("Room dug:  " + new.id);
    endmethod

    method spew_cmd
        var what;

        if (caller != this)
            return 1;
        elseif (!args[2] || !args[4])
            echo("Usage:  @spew <method> on <object>");
        else
            what = this.match_env(args[4]);
            if (!what)
                echo("I don't see that here.");
            else
                echo(what.spew_method(args[2]));
            endif
        endif
    endmethod

    method link_cmd
        var exit;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Link what?");
        elseif (!args[3])
            echo("Usage:  @link <exit name> to <room #>");
        else
            exit = location.match_exit(args[2]);
            if (!exit)
                echo("I don't know what you want to link!");
            else
                this.link(exit, args[4]);
            endif
        endif
    endmethod

    method link
        var new_dest;
        ignore E_METHODNF;

        if (!(caller == this || caller in owners || caller in parents || caller == #0 || caller in #0 .wizards || !owners))
            echo("Permission denied.");
        else
            new_dest = this.match_env(args[2]);
            if (!new_dest)
                echo("Link to where?");
            elseif (!new_dest.link_ok)
                echo("You can't link to that!");
            else
                args[1].set_dest(new_dest);
                echo("Linked.");
            endif
        endif
    endmethod

    method find_cmd
        var nm, thing;
        ignore E_METHODNF;

        if (caller != this)
            return 1;
        endif
        for thing in (creations)
            if (args[2])
                nm = thing.name;
                if (lengthof(args[2]) > lengthof(nm))
                    if (args[2][1..lengthof(nm)] == nm)
                        echo(thing.id);
                    endif
                elseif (nm[1..lengthof(args[2])] == args[2])
                    echo(thing.id);
                endif
            else
                echo(thing.id);
            endif
        endfor
        echo("---");
    endmethod

    method list_cmd
        var what;

        if (caller != this)
            return 1;
        elseif (!args[2] || !args[4])
            echo("Usage:  @list <method> on <object>");
        else
            what = this.match_env(args[4]);
            if (!what)
                echo("I don't see that here.");
            else
                echo(what.list_method(args[2]));
            endif
        endif
    endmethod

    method open_cmd
        var exit;

        if (caller != this)
            return 1;
        elseif (!args[2])
            player.tell("Open an exit in what direction?");
        else
            if (!location.open_ok)
                echo("You can't open an exit here!");
            else
                exit = #7 .clone(args[2]);
                location.add_exit(exit);
                exit.set_source(location);
                echo("Exit " + exit.id + " opened.");
                if (args[3])
                    this.link(exit, args[4]);
                endif
            endif
        endif
    endmethod

    method methods_cmd
        var what, m;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  @methods <object>");
            return 0;
        endif
        what = this.match_env(args[2]);
        if (!what)
            echo("I don't see that here.");
        else
            for m in (what.methods)
                echo("  " + m);
            endfor
            echo("---");
        endif
    endmethod

    method show_cmd
        var r, what;
        ignore E_SERVERDN, E_METHODNF, E_OBJNF;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  @show <object>");
            return 0;
        endif
        what = this.match_env(args[2]);
        if (!what || what.name == E_OBJNF)
            echo("I don't see that here.");
        else
            r = what.show(args[1], args[2]);
            if (r == E_SERVERDN || r == E_METHODNF)
                echo("You can't show that.");
            endif
        endif
    endmethod

    method verbs_cmd
        var what, v;

        if (caller != this)
            return 1;
        elseif(!args[2])
            echo("Usage:  @verbs <object>");
            return 0;
        endif
        what = this.match_env(args[2]);
        if (!what)
            echo("I don't see that here.");
        else
            for v in (what.verbs)
                if (v[2])
                    echo("  " + v[1] + " : " + v[2] + " = " + v[3]);
                else
                    echo("  " + v[1] + " = " + v[3]);
                endif
            endfor
            echo("---");
        endif
    endmethod

endobject
# 1 "bin/programmer.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/programmer.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/programmer.cl" 2

object #10
    parents #9;

    name = "Generic Programmer";

    obj prog_obj;
    str prog_method;

    verb "eval" = eval_cmd;
    verb "@prog*ram" = program_cmd;
    verb "@prog*ram" : "on" = program_cmd;
    verb "@ps" = ps_cmd;
    verb "@kill" = kill_cmd;
    verb "@verb" = verb_cmd;
    verb "@verb" : "on" = verb_cmd;
    verb "@rmv*erb" = rmverb_cmd;
    verb "@rmv*erb" : "on" = rmverb_cmd;
    verb "@rmm*ethod" = rmmethod_cmd;
    verb "@rmm*ethod" : "on" = rmmethod_cmd;
    verb "@rmva*r" = rmvar_cmd;
    verb "@rmva*r" : "on" = rmvar_cmd;

    method init
        if (this == #10)
            this.add_owner(#11);
        else
            pass();
        endif
    endmethod

    method eval_cmd
        if (caller != this)
            return 1;
        endif
        if (!compile(this, "eval_tmp", args[2]))
            echo("--> " + tostr(this.eval_tmp()));
            rm_method("eval_tmp");
        endif
    endmethod

    method program_cmd
        var what;
        ignore E_METHODNF;

        if (caller != this)
            return 1;
        elseif (!args[2] && !args[3])
            echo("Entering programming mode.  Use \".\" to end");
            prog_obj = #-1;
            this.input_to("done_programming");
        elseif (!args[2] || !args[3])
            echo("Usage:  @program <method> on <object>");
            echo("        @program");
        else
            what = this.match_env(args[4]);
            if (!what)
                echo("I don't see that here.");
            else
                prog_obj = what; prog_method = args[2];
                echo("Programming " + args[2] + " on " + what.id);
                echo("Entering programming mode.  Use \".\" to end");
                this.input_to("done_programming");
            endif
        endif
    endmethod

    method done_programming
        if (prog_obj == #-1)
            compile(args[1]);
        else
            if (!compile(prog_obj, prog_method, args[1]))
                echo("Method programmed.");
            endif
        endif
    endmethod

    method verb_cmd
        var r, newargs, what, prep;

        if (caller != this)
            return 1;
        endif
        newargs = explode(args[2]);
        if (!args[2] || !args[3] || !args[4]
        || (lengthof(newargs)) < 2 || (lengthof(newargs) > 3))
            echo("Usage:  @verb <verb> <method-to-call> on <obj>");
            echo("        @verb <verb> <preposition> <method-to-call> on <obj>");
            return 0;
        endif
        what = this.match_env(args[4]);
        if (!what)
            echo("I don't see that here.");
            return 0;
        elseif (lengthof(newargs) == 2)
            r = what.add_verb(newargs[1], "", newargs[2]);
        else
            r = what.add_verb(newargs[1], newargs[2], newargs[3]);
        endif
        if (r == E_PERM)
            echo("Permission denied.");
        else
            echo("Verb added.");
        endif
        return 0;
    endmethod

    method rmverb_cmd
        var what;

        if (caller != this)
            return 1;
        endif
        if (!args[2] || !args[3] || !args[4])
            echo("Usage:  @rmverb <verb> on <obj>");
            return 0;
        endif
        what = this.match_env(args[4]);
        if (!what)
            echo("I don't see that here.");
        elseif (what.rm_verb(args[2]) == E_PERM)
            echo("Permission denied.");
        else
            echo("Verb removed.");
        endif
        return 0;
    endmethod

    method rmmethod_cmd
        var r, what;
        ignore E_PERM, E_METHODNF;

        if (caller != this)
            return 1;
        endif
        if (!args[2] || !args[3] || !args[4])
            echo("Usage:  @rmmethod <method> on <obj>");
            return;
        endif
        what = this.match_env(args[4]);
        if (!what)
            echo("I don't see that here.");
        else
            r = what.rm_method(args[2]);
            if (typeof(r) == ERR)
                echo(tostr(r));
            else
                echo("Method removed.");
            endif
        endif
        return 0;
    endmethod

    method rmvar_cmd
        var r, what;
        ignore E_PERM, E_VARNF;

        if (caller != this)
            return 1;
        endif
        if (!args[2] || !args[3] || !args[4])
            echo("Usage:  @rmvar <var> on <obj>");
            return;
        endif
        what = this.match_env(args[4]);
        if (!what)
            echo("I don't see that here.");
        else
            r = what.rm_var(args[2]);
            if (typeof(r) == ERR)
                echo(tostr(r));
            else
                echo("Variable removed.");
            endif
        endif
        return 0;
    endmethod

    method ps_cmd
        var i, line, task;

        echo("PID     PLAYER          METHOD          STATUS");
        for task in (ps())
            if (task[4] != this && !("a" in args[2]))
                continue;
            endif
            line = pad(tostr(task[1]),7) + " " + pad(task[4].id, 15) + " "
                        + pad(tostr(task[6]) + "." + task[9], 15) + " ";
            if (task[10] == 0)
                line = line + "MSG    ";
            elseif (task[10] == 1)
                line = line + "LOCK   ";
            elseif (task[10] == 2)
                line = line + "TIMER  ";
            elseif (task[10] == 3)
                line = line + "SYS_MSG";
            endif
            echo(line);
        endfor
    endmethod

    method kill_cmd
        var r, pid;
        ignore E_PERM;

        pid = tonum(args[2]);
        r = kill(pid);
        if (r == E_PERM);
            echo("Permission denied.");
        elseif (r != 0)
            echo("No such process.");
        else
            echo("Killed.");
        endif
    endmethod

endobject
# 1 "bin/wizard.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/wizard.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/wizard.cl" 2

object #11
    parents #10;

    verb "@wiz*ard" = wiz_cmd;
    verb "@dewiz*ard" = dewiz_cmd;
    verb "@force" : "to" = force_cmd;
    verb "@force" = force_cmd;
    verb "@mem" = mem_cmd;
    verb "@cachestats @cache_stats @cs" = cachestats_cmd;
    verb "@vis*itors" = visitors_cmd;
    verb "@boot" = boot_cmd;
    verb "@shout" = shout_cmd;
    verb "@shutdown" = shutdown_cmd;

    method init
        if (this == #11)
            name = "Wizard";
            password = "83pil1MP02An.";
            desc = "A short, aged guy with a pointy hat.";
            this.add_owner(#11);
        endif
        pass() to #8;
    endmethod

    method cachestats_cmd
        echo(cache_stats());
    endmethod

    method wiz_cmd
        var who;

        if (caller != this)
            return 1;
        elseif(!args[2])
            echo("Usage:  @wizard <player>");
            return 0;
        endif
        who = #0 .find_player(args[2]);
        if (!who)
            echo("I couldn't find that player.");
        elseif (who in #0 .wizards)
            echo(who.name + " is already a wizard.");
        elseif (!(who in #0 .players))
            echo("That's not a player.");
        else
            #0 .add_wizard(who);
        endif
    endmethod

    method dewiz_cmd
        var who;

        if (caller != this)
            return 1;
        elseif(!args[2])
            echo("Usage:  @dewizard <player>");
            return 0;
        endif
        who = #0 .find_player(args[2]);
        if (!who)
            echo("I couldn't find that player.");
        elseif (!(who in #0 .wizards))
            echo("That's not a wizard.");
        elseif (who == player)
            echo("You can't dewiz yourself; ask another wizard.");
        else
            #0 .rm_wizard(who);
        endif
    endmethod

    method force_cmd
        var who;

        if (caller != this)
            return 1;
        elseif (!args[2] || !args[3] || !args[4])
            echo("Usage:  @force <player> to <cmd>");
            return 0;
        endif
        who = this.match_env(args[2]);
        if (!who)
            echo("Force whom?");
        else
            player = who;
            player.parse(args[4]);
        endif
    endmethod

    method mem_cmd
        if (caller != this)
            return 1;
        endif
        echo(checkmem());
    endmethod

    method visitors_cmd
        var item, id;
        ignore E_SERVERDN;

        if (caller != this)
            return 1;
        endif
        echo("Remote objects:");
        for item in (#0 .visitors())
            id = item[1].id;
            if (id == E_SERVERDN)
                echo("(Ghost of " + tostr(item[1]) + ") is in "
                        + item[2].id);
            else
                echo(item[1].id + " is in " + item[2].id);
            endif
        endfor
        echo("---");
    endmethod

    method boot_cmd
        var who;

        if (caller != this)
            return 1;
        elseif (!args[2])
            echo("Usage:  @boot <player>");
            return 0;
        endif
        who = #0 .find_connected_player(args[2]);
        if (!who)
            echo("That player is not connected.");
        else
            if (who.quit_cmd())
                echo("You can't boot that player.");
            else
                echo("Player booted.");
            endif
        endif
    endmethod

    method shout_cmd
        var dude, msg;

        if (caller != this)
            return 1;
        endif
        msg = name + " shouts, \"" + args[2] + "\"";
        for dude in (#0 .connected_players)
            dude.tell(msg);
        endfor
    endmethod

    method shutdown_cmd
        if (caller != this)
            return 1;
        endif
        writelog("SHUTDOWN by " + this.id);
        shutdown();
    endmethod

endobject
# 1 "bin/west.cl"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "bin/west.cl"
# 1 "bin/boot.clh" 1
# 2 "bin/west.cl" 2
# 1 "bin/common.clh" 1
# 3 "bin/west.cl" 2

object #12@west
    parents #6;

    name = "Western Room";
    desc = "Y'all are in the western room, cowboy.";
    exits = { #13@west };

    method init
        this.add_owner(#11);
    endmethod
endobject

object #13@west
    parents #7;

    name = "e;east";
    leave = "You go east.";
    oleave = "%n goes east.";
    oarrive = "%n comes in from the west.";
    source = #12@west;
    dest = #12@east;

    method init
        this.add_owner(#11);
    endmethod

endobject

object #14@west
    parents #4;

    home = #12@west;
    name = "a punching bag";
    desc = "A punching bag with a picture of Brian Mulroney taped to it.";

    verb "hit punch smack whomp sock" = hit;

    method init
        this.moveto(home);
        this.add_owner(#11);
    endmethod

    method sdesc
        return ("There is " + name + " here, just waiting to be hit.");
    endmethod

    method hit
        if (!this.match(args[2]))
            return 1;
        endif
        player.tell("You sock the punching bag on da nose!  How satisfying.");
        location.announce(player.name +
                             " socks the punching bag on da nose!", {player});
        at (time() + 5)
            location.announce("The punching bag winds up..", {});
        endat
        at (time() + 10)
            if (player.location == location)
                player.tell("The punching bag whomps you on da shnozz!");
                location.announce("The punching bag whomps "
                            + player.name + " on da shnozz!", {player});
            else
                location.announce("The punching bag appears confused, as "
                                + player.name + " has left the room.", {});
            endif
        endat
    endmethod

endobject

object #15@west
    parents #5;

    name = "a brown paper bag";
    desc = "A very ordinary-looking brown paper bag.";
    home = #12@west;

    method init
        this.add_owner(#11);
        this.moveto(home);
    endmethod
endobject