/*    /lib/events/close.c
 *    from the Dead Souls Object Library
 *    handles closing and opening events
 *    created by Descartes of Borg 960115
 *    Version: @(#) close.c 1.5@(#)
 *    Last modified: 96/12/23
 */
int Closed;
// abstract methods
string GetDefiniteShort();
// end abstract methods
int GetClosed(){
    return Closed;
}
int GetOpen(){
    return !(Closed);
    if(GetClosed()) return 0;
    else return 1;
}
int SetClosed(int x){ 
    Closed = x;
    parse_refresh();
    return Closed;
}
varargs mixed CanClose(object who, string id){
    if(who && environment() && environment() != environment(who) &&
      environment() != who)
        return "#That's not accessible to you.";
    if( Closed ){
        id = capitalize(GetDefiniteShort()) + " is already closed.";
        return id;
    }
    else return 1;
}
varargs mixed CanOpen(object who, object tool){
    if(environment() && environment() != environment(who) &&
      environment() != who)
        return "#That's not accessible to you.";
    if( !Closed ){
        return capitalize(GetDefiniteShort()) + " is already open.";
    }
    else return 1;
}
mixed eventClose(object who){
    if( !SetClosed(1) ){
        return 0;
    }
    send_messages("close", "$agent_name $agent_verb $target_name.",
      who, this_object(), environment(who));
    return 1;
}
varargs mixed eventOpen(object who, object tool){
    if( SetClosed(0) ){
        return 0;
    }
    send_messages("open", "$agent_name $agent_verb $target_name.",
      who, this_object(), environment(who));
    return 1;
}
int inventory_accessible(){
    return !GetClosed();
}
int inventory_visible(){
    return !GetClosed();
}
int SetOpen(int x){
    if(x) Closed = 0;
    else Closed = 1;
    parse_refresh();
    return Closed;
}
mixed direct_close_obj(object target){
    return CanClose(this_player());
}
mixed direct_open_obj(object target){
    return CanOpen(this_player());
}
mixed direct_open_obj_with_obj(object target, object tool){
    return CanOpen(this_player(), tool);
}