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

inherit VERB_OB;

#define NO_TARGET	0
#define HAS_TARGET	1

#define NO_REAGENT	0
#define HAS_REAGENT	1

mixed can_cast_str(string spell)
{
    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;
    return SPELL_D->check_valid_spell(spell, NO_TARGET, NO_REAGENT);
}

mixed can_cast_str_at_obj(string spell, object target)
{
    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;
    return SPELL_D->check_valid_spell(spell, HAS_TARGET, NO_REAGENT);
}

mixed direct_cast_str_at_obj(string spell, object target)
{
    return SPELL_D->check_valid_target(spell, target, NO_REAGENT);
}

mixed can_cast_str_on_obj(string spell, object target)
{
    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;
    return SPELL_D->check_valid_spell(spell, HAS_TARGET, NO_REAGENT);
}

mixed direct_cast_str_on_obj(string spell, object target)
{
    return SPELL_D->check_valid_target(spell, target, NO_REAGENT);
}

mixed can_cast_str_with_obj(string spell, object reagent)
{

    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;

    return SPELL_D->check_valid_spell(spell, NO_TARGET, HAS_REAGENT);
}

mixed direct_cast_str_with_obj(string spell, object reagent)
{
    return SPELL_D->check_valid_reagent(spell, reagent);
}

mixed can_cast_str_at_obj_with_obj(string spell, object target, object reagent)
{

    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;

    return SPELL_D->check_valid_spell(spell, HAS_TARGET, HAS_REAGENT);
}

mixed direct_cast_str_at_obj_with_obj(string spell, object target, object reagent)
{
    return SPELL_D->check_valid_target(spell, target, HAS_REAGENT);
}

mixed indirect_cast_str_at_obj_with_obj(string spell, object target, object reagent)
{
    return SPELL_D->check_valid_reagent(spell, reagent, target);
}

mixed can_cast_str_on_obj_with_obj(string spell, object target, object reagent)
{

    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;

    return SPELL_D->check_valid_spell(spell, HAS_TARGET, HAS_REAGENT);
}

mixed direct_cast_str_on_obj_with_obj(string spell, object target, object reagent)
{
    return SPELL_D->check_valid_target(spell, target, HAS_REAGENT);
}

mixed indirect_cast_str_on_obj_with_obj(string spell, object target, object reagent)
{
    return SPELL_D->check_valid_reagent(spell, reagent, target);
}

mixed can_cast_str_with_obj_at_obj(string spell, object reagent, object target)
{
    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;

    return SPELL_D->check_valid_spell(spell, HAS_TARGET, HAS_REAGENT);
}

mixed direct_cast_str_with_obj_at_obj(string spell, object reagent, object target)
{
    return SPELL_D->check_valid_reagent(spell, reagent, HAS_TARGET);
}

mixed indirect_cast_str_with_obj_at_obj(string spell, object reagent, object target)
{
    return SPELL_D->check_valid_target(spell, target, reagent);
}

mixed can_cast_str_with_obj_on_obj(string spell, object reagent, object target)
{
    mixed ret = check_ghost();

    if(stringp(ret))
	return ret;
    return SPELL_D->check_valid_spell(spell, HAS_TARGET, HAS_REAGENT);
}

mixed direct_cast_str_with_obj_on_obj(string spell, object reagent, object target)
{
    return SPELL_D->check_valid_reagent(spell, reagent, HAS_TARGET);
}

mixed indirect_cast_str_with_obj_on_obj(string spell, object reagent, object target)
{
    return SPELL_D->check_valid_target(spell, target, reagent);
}


void do_cast_str(string spell)
{
    SPELL_D->cast_spell(spell);
}

void do_cast_str_on_obj(string spell, object target)
{
    SPELL_D->cast_spell(spell, target);
}

void do_cast_str_at_obj(string spell, object target)
{
    SPELL_D->cast_spell(spell, target);
}

void do_cast_str_with_obj(string spell, object tool)
{
    SPELL_D->cast_spell(spell, 0, tool);
}

void do_cast_str_on_obj_with_obj(string spell, object target, object tool)
{
    SPELL_D->cast_spell(spell, target, tool);
}

void do_cast_str_with_obj_on_obj(string spell, object tool, object target)
{
    SPELL_D->cast_spell(spell, target, tool);
}

void do_cast_str_with_obj_at_obj(string spell, object tool, object target)
{
    SPELL_D->cast_spell(spell, target, tool);
}


void create()
{
    add_rules( ({ "STR on OBJ", "STR", "STR at OBJ" }), ({}) );
    add_rules( ({ "STR with OBJ", "STR at OBJ with OBJ" }), ({}) );
    add_rules( ({ "STR on OBJ with OBJ", "STR with OBJ on OBJ" }), ({}) );
    add_rules( ({ "STR with OBJ at OBJ" }), ({}) );
//    return ({ ({ "STR on OBJ", "STR", "STR at OBJ", "STR with OBJ", 
//	"STR at OBJ with OBJ", "STR on OBJ with OBJ", 
//	"STR with OBJ on OBJ", "STR with OBJ at OBJ"}), ({}) });
}
