#include "boot.clh"

object ROOM
    parents LOCATED_OBJ, DESCRIBED_OBJ;

    list	exits;

    name = "Generic Room";

    verb	"go move" = go_verb;

    method init
	if (this == ROOM)
	    this.add_owner(WIZARD);
	elseif (PERMS_OK)
	    exits = {};
	    pass();
	else
	    raise E_PERM;
	endif
    endmethod /* init */

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

	if (!PERMS_OK)
	    raise E_PERM;
	else
	    for exit in (exits)
		exit.destroy();
	    endfor
	    pass() to LOCATED_OBJ;
	endif
    endmethod

    method id
	return pass() to DESCRIBED_OBJ;
    endmethod

    method exits
	return exits;
    endmethod

    method announce
/*
 * announce a message to everyone in room, except if listed in 2nd arg
 */
	var	dude;
	ignore	E_METHODNF, E_SERVERDN;

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

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

    method go
	var	exit;

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

    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 /* look */

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

    method match_exit
	var	exit;

	for exit in (exits)
	    if (exit.match(args[1]))
		return exit;
	    endif
	endfor
	return NOTHING;
    endmethod /* match_exit */

    method link_ok
	return (PERMS_OK);
    endmethod /* link_ok */

    method open_ok
	return (PERMS_OK);
    endmethod /* open_ok */

    method add_exit
	if (PERMS_OK)
	    exits = exits + args[1];
	else
	    raise (E_PERM);
	endif
    endmethod /* add_exit */

    method rm_exit
	if (PERMS_OK || caller in exits)
	    exits = exits - args[1];
	else
	    raise(E_PERM);
	endif
    endmethod /* remove_exit */

endobject	/* ROOM */