#include <lib.h>

inherit LIB_VERB;

mixed can_shoot_obj_with_obj(mixed target,mixed shooter);
mixed can_shoot_obj_at_obj(mixed shooter,mixed target);
varargs mixed do_shoot_obj_at_obj(mixed args...);
varargs mixed do_shoot_obj_with_obj(mixed args...);

static void create() {
    verb::create();
    SetVerb("shoot");
    SetRules("OBJ at LIV", "LIV with OBJ","OBJ at OBJ", "OBJ with OBJ");
    //SetRules("OBJ at LIV", "LIV with OBJ");
    SetSynonyms("fire", "gat", "gank");
    SetErrorMessage("Shoot what?");
    SetHelp("Syntax: <shoot OBJECT>\n\n"
      "Shoots a target.\n\n");
}

varargs mixed eventShoot(mixed device, mixed target, mixed misc...){
    mixed attackable;
    object tmpob;

    if(!device || !objectp(device) || target == device ){
        write("You can't shoot that with that.");
        return 0;
    }
    if(device->MustCarry() && environment(device) != this_player()) {
        write("You are not holding the weapon.");
        return 1;
    }
    if(device->MustWield() && device->GetWorn() == 0 && !creatorp(this_player())) {
        write("You are not wielding the weapon.");
        return 1;
    }
    if(!target || !objectp(target)){
        write("It seems that is not a valid target.");
        return 0;
    }
    if(!present(target,environment(this_player())) && !present(target,environment(device))){
        write("That target is not here.");
        return 1;
    }

    attackable = target->GetAttackable();

    if(!attackable || !intp(attackable) || attackable != 1){
        write("You are unable to shoot "+target->GetShort()+".");
        return 1;
    }

    return device->eventShoot(device, target);
}

mixed can_shoot_liv_with_obj(mixed target,mixed shooter){
    return can_shoot_obj_with_obj(target, shooter);
}

mixed can_shoot_obj_at_liv(mixed shooter,mixed target){
    return can_shoot_obj_at_obj(shooter, target);
}

mixed can_shoot_obj_with_obj(mixed target,mixed shooter) {
    if(intp(check_light())) return this_player()->CanManipulate();
    else return check_light();
}

mixed can_shoot_obj_at_obj(mixed shooter,mixed target) {
    if(intp(check_light())) return this_player()->CanManipulate();
    else return check_light();
}

varargs mixed do_shoot_obj_at_liv(mixed args...) {
    return do_shoot_obj_at_obj(args...);
}

varargs mixed do_shoot_liv_with_obj(mixed args...) {
    return do_shoot_obj_at_obj(args[1], args[0]);
}

varargs mixed do_shoot_obj_at_obj(mixed args...) {
    return eventShoot(args[0],args[1],args[2..]);
}

varargs mixed do_shoot_obj_with_obj(mixed args...) {
    return eventShoot(args[1], args[0], args[2..]);
}
