/* Do not remove the headers from this file! see /USAGE for more info. */

#include <mudlib.h>
#include <hooks.h>

private int 		is_on;
private string		switch_on_msg = "$N $vswitch a $o on.";
private string		switch_off_msg = "$N $vswitch a $o off.";

void hook_state(string, string, int);
void add_hook(string, mixed);
mixed call_hooks(string, int);


int query_is_on() {
    return is_on;
}

mixed set_is_on(int x) {
    string tmp;

    if (x) {
	if (is_on) return 0;
//:HOOK prevent_turn_on
//A yes/no/error hook that can prevent an object from being turned on.
	tmp = call_hooks("prevent_turn_on", HOOK_YES_NO_ERROR);
	if (!tmp || stringp(tmp)) return tmp;
	is_on = 1;
//:HOOK turn_on
//called after an object is turned on.  The return values are ignored.
	call_hooks("turn_on", HOOK_IGNORE);
    } else {
	if (!is_on) return 0;
//:HOOK prevent_turn_off
//A yes/no/error hook that can prevent an object from being turned off.
	tmp = call_hooks("prevent_turn_off", HOOK_YES_NO_ERROR);
	if (!tmp || stringp(tmp)) return tmp;
	is_on = 0;
//:HOOK turn_off
//called after an object is turned off.  The return values are ignored.
	call_hooks("turn_off", HOOK_IGNORE);
    }
    return 1;
}

void set_switch_on_msg(string x) {
    switch_on_msg = x;
}

void set_switch_off_msg(string x) {
    switch_off_msg = x;
}

// Verb callbacks

void turn_on() {
    string tmp = set_is_on(1);
    if (!tmp) tmp = "You can't seem to turn it on.\n";
    if (stringp(tmp)) write(tmp);
    else this_body()->simple_action(switch_on_msg, this_object());
}

void turn_off() {
    string tmp = set_is_on(0);
    if (!tmp) tmp = "You can't seem to turn it off.\n";
    if (stringp(tmp)) write(tmp);
    else this_body()->simple_action(switch_off_msg, this_object());
}

// Verb interaction

mixed direct_flip_obj_off(object ob) {
    if (!is_on) return "It isn't turned on!\n";
    return 1;
}

mixed direct_flip_obj_on(object ob) {
    if (is_on) return "It is already on!\n";
    return 1;
}

mixed direct_flip_on_obj(object ob) {
    return direct_flip_obj_on( ob );
}

mixed direct_flip_off_obj(object ob) {
    return direct_flip_obj_off( ob );
}

mixed direct_flip_obj( object ob )
{
    return "#Flip it on or off?";
}
