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

// m_lightable - Handles verb interaction for lightable objects.
// 26 June, 1998: Iizuka seperated into m_lightable and m_light_source.

#include <flags.h>
#include <hooks.h>

string lighting_extra_short();
void set_light(int);
mixed call_hooks(string, int);
void hook_state(string, mixed, int);
string the_short();
int test_flag(int);
void clear_flag(int);
void assign_flag(int, int);

varargs mixed light(object);   // From m_light_source.c
mixed extinguish();

private string		light_msg = "$N $vlight a $o.";
private string		light_with_msg = "$N $vlight a $o with a $o1.";
private string		extinguish_msg = "$N $vextinguish a $o.";
private nosave function light_hook = (: lighting_extra_short :);
private mixed           source_filter;

int query_is_lit()
{
   return test_flag(F_LIGHTED);
}

void set_extinguish_msg(string x)
{
   extinguish_msg = x;
}

void set_light_msgs(string x, string y)
{
   light_msg = x;
   light_with_msg = y;
}

//:FUNCTION set_source
//set_source(function f) makes it so that the object can only be lit by
//objects for which evaluate(f, ob) returns 1.  f may return a string
//error message on failure.  If f is a string, any object with that string
//as an id is a valid source.  set_source(0) makes any object a valid source.
void set_source(mixed f)
{
   source_filter = f;
}

mixed query_source()
{
   return source_filter;
}

string lighted_attributes()
{
   return "(providing adequate light)";
}

protected void set_lit(int x)
{
   assign_flag(F_LIGHTED, x);
   hook_state("extra_short", light_hook, x);
}

void do_extinguish()
{
   mixed tmp = extinguish();
   if(!tmp)
      tmp = "That doesn't seem possible.\n";
   if(stringp(tmp))
   {
      write(tmp);
      return;
   }
   clear_flag(F_LIGHTED);
   this_body()->simple_action(extinguish_msg, this_object());
}

varargs void do_light(object with)
{
   mixed tmp = light(with);
   if(!tmp) tmp = "That doesn't seem possible.\n";
   if(stringp(tmp))
   {
      write(tmp);
      return;
   }
   if(with)
      this_body()->simple_action(light_with_msg, this_object(), with);
   else
      this_body()->simple_action(light_msg, this_object());
}

mixed direct_light_obj()
{
   if(query_is_lit())
      return "It is already lit.\n";
   if(source_filter)
      return "You need to light it with something.\n";
   return 1;
}

mixed direct_extinguish_obj()
{
   if(!query_is_lit())
      return "It isn't lit.\n";
   return 1;
}

mixed direct_light_obj_with_obj(object ob, object with) {
   if(query_is_lit())
      return "It is already lit.\n";
   if(!source_filter)
      return 1;
   if(!with)
      return 1;
   if(stringp(source_filter))
      return with->id(source_filter);
   return evaluate(source_filter, with);
}

mixed indirect_light_obj_with_obj(object ob, object with) {
   mixed sf;
   if(ob)
      sf = ob->query_source();
   if(with->query_is_lit())
   {
      if(!sf)
         return 1;
      if(stringp(sf))
         return with->id(sf);
      return evaluate(sf, with);
   }
   return capitalize(with->the_short()) + " isn't lit.\n";
}

int need_to_see()
{
   return 0;
}

mapping lpscript_attributes()
{
   return ([
      "light_msgs" : ({ LPSCRIPT_SPECIAL, (: ({ "special", "set_light_msgs(\"" + $1[0] + "\", \"" + (sizeof($1) > 1 ? $1[1] : $1[0]) + "\")" }) :) }),
      "fuel" : ({ LPSCRIPT_INT, "setup", "set_fuel" }),
   ]);
}
