// open.c
// Lets players open doors.
// Written by Mobydick@TMI-2, 1-8-93.
// Based on an earlier version by Rusty@TMI-2.
// Opening containers is handled by an add_action in the container, not by
// this command.
// Updated by Watcher@TMI-2 (03/28/93) to handle "open door".
// Watcher@TMI added vision checks (04/13/93).
#include <mudlib.h>
inherit DAEMON ;
int cmd_open (string str) {
	string dir, *tmp;
	object env ;
	mapping doors ;
	if(!str || (sscanf(str,"%s door", dir) != 1 && str != "door")) {
		notify_fail("What did you want to open?\n");
		return 0 ;
	}
	env = environment(this_player()) ;
	if (!env) {
		notify_fail ("The void has no doors.\n") ;
		return 0 ;
	}
	doors = env->query("doors") ;
 
	if (!doors) {
		notify_fail ("There are no doors here.\n") ;
		return 0 ;
	}
 
	tmp = keys( doors );
 
	if(str == "door") {
		if(sizeof(doors) > 1) {
		notify_fail("Which door did you wish to open?\n");
		return 0; }
		dir = tmp[0];
	}
 
	//  If the user can't see ... then pick a random door. <grin>
 
	if(!this_player()->query("vision"))  {
	  write("You feel around in the darkness for a door.\n");
	  dir = tmp[ random(sizeof(tmp)) ];
	}
 
	if (!doors[dir]) {
		notify_fail ("There is no "+dir+" door.\n") ;
		return 0 ;
	}
	if (doors[dir]["status"]=="open") {
		notify_fail ("It is already open.\n") ;
		return 0 ;
	}
	if (doors[dir]["status"]=="locked") {
		notify_fail ("That door is locked.\n");
		return 0 ;
	}
	env->set_status(dir, "open") ;
	env->update_link(dir) ;
	write ("You open the " + dir + " door.\n");
	say (this_player()->query("cap_name")+" opens the "+dir+" door.\n") ;
	return 1 ;
}
string help() {
	return ("Syntax: open <dir> door  -or-  open <container>\n\n"+
"The open command lets you open a door or container if it is not already\n"+
"open and is is not locked.\n\n"+
"See also: get, put, close, lock, unlock\n"
	) ;
}