#include <lib.h>
#include <boobytraps.h>
inherit LIB_SHADOW;
inherit LIB_CLOSE;
inherit LIB_GET;
inherit LIB_DROP;
inherit LIB_LOCK;
inherit LIB_STEAL;

int traptype = 0;
int traplevel = 0;
int autoresets = 0;
string shadow_object = "";
string trap_description = "";

int SetTrapType(int i){
    traptype = i;
    return traptype;
}

int GetTrapType(){
    return traptype;
}

int SetTrapLevel(int i){
    traplevel = i;
    return traplevel;
}

int GetTrapLevel(){
    return traplevel;
}

string SetTrapDescription(string str){
    trap_description = str;
    return trap_description;
}

string GetTrapDescription(){
    return trap_description;
}

int SetAutoResets(int i){
    autoresets = i;
    return autoresets;
}

int GetAutoResets(){
    return autoresets;
}

void create(){
    parse_init();
}

int eventShadow(object ob){
    return shadow::eventShadow(ob);
}

varargs mixed SpringTrap(mixed arg1, mixed arg2){
    if(!autoresets){
        eventUnshadow();
    }
    else autoresets--;
    return 1;
}

varargs mixed eventDisarm(mixed args...){
    write("You successfully disarm the trap!");
    eventUnshadow();
    return 1;
}

varargs mixed CanOpen(object who, object tool) {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    if(ob->GetDoor()) ob = ob->GetDoor();
    return ob->CanOpen(who, tool);
}

varargs mixed eventOpen(object who, object tool) {
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventOpen(who, tool);
    if(traptype & BOOBYTRAP_OPEN) SpringTrap(who, tool);
    return ret;
}

varargs mixed CanClose(object who, string id){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    if(ob->GetDoor()) ob = ob->GetDoor();
    return ob->CanClose(who, id);
}

mixed eventClose(object who){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventClose(who);
    if(traptype & BOOBYTRAP_CLOSE) SpringTrap(who);
    return ret;
}

mixed direct_get_obj(object target){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->direct_get_obj(target);
}

mixed direct_get_obj_out_of_obj(object target, object src){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->direct_get_obj_out_of_obj(target, src);
}

mixed direct_get_obj_from_obj(object target, object src) {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return  ob->direct_get_obj_out_of_obj(target, src);
}

mixed direct_get_obj_obj(object target, object src) {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return  ob->direct_get_obj_out_of_obj(target, src);
}

mixed GetPreventGet() {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->GetPreventGet();
}

mixed CanGet(object who){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->CanGet(who);
}

mixed eventGet(object who){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventGet(who);
    if(traptype & BOOBYTRAP_GET) SpringTrap(who);
    return ret;
}

mixed direct_drop_obj(object target){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->direct_drop_obj(target);
}

int GetDestructOnDrop() {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->GetDestructOnDrop();
}

mixed GetPreventDrop() {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->GetPreventDrop();
}

mixed CanDrop(object who){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->CanDrop(who);
}

mixed eventDrop(object who){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventDrop(who);
    if(traptype & BOOBYTRAP_DROP) SpringTrap(who);
    return ret;
}

mixed CanLock(object who, string id){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->CanLock(who, id);
}

varargs mixed eventLock(object who, mixed arg1, mixed arg2){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventLock(who,arg1,arg2);
    if(traptype & BOOBYTRAP_LOCK) SpringTrap(who);
    return ret;
}

varargs mixed CanUnlock(object who, string id, object key){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->CanUnlock(who, id, key);
}

varargs mixed eventUnlock(object who, mixed arg1, mixed arg2){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventUnlock(who, arg1, arg2);
    if(traptype & BOOBYTRAP_UNLOCK) SpringTrap(who);
    return ret;
}

mixed CanSteal(object who){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->CanSteal(who);
}

mixed eventSteal(object who){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventSteal(who);
    if(traptype & BOOBYTRAP_STEAL) SpringTrap(who);
    return ret;
}

mixed CanPick(object who, string id){
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->CanPick(who, id);
}

varargs mixed eventPick(object who, string str, object tool){
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventPick(who, str, tool);
    if(traptype & BOOBYTRAP_PICK) SpringTrap(who);
    return ret;
}

mixed direct_pick_str_on_obj(string str, object target, string str2,
  string id) {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->direct_pick_str_on_obj(str,target,str2,id);
}

mixed direct_pick_str_on_obj_with_obj(string str, object target, object tool,
  string str2, string targ_id) {
    object ob = GetShadowedObject();
    if(!ob) return 0;
    return ob->direct_pick_str_on_obj_with_obj(str,target,tool,str2,targ_id);
}

string GetShort(){
    object ob = GetShadowedObject();
    if(!ob) return "";
    return ob->GetShort();
}

string GetKeyName(){
    object ob = GetShadowedObject();
    if(!ob) return "";
    return ob->GetKeyName();
}

mixed eventEquip(object who, string array limbs) {
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventEquip(who, limbs);
    if(function_exists("GetWear",ob)){
        if(traptype & BOOBYTRAP_WEAR) SpringTrap(who);
    }
    else if(traptype & BOOBYTRAP_WIELD) SpringTrap(who);
    return ret;
}

mixed eventUnequip(object who) {
    object ob = GetShadowedObject();
    mixed ret;
    if(!ob) return 0;
    ret = ob->eventUnequip(who);
    if(function_exists("GetWear",ob)){
        if(traptype & BOOBYTRAP_REMOVE) SpringTrap(who);
    }
    else if(traptype & BOOBYTRAP_UNWIELD) SpringTrap(who);
    return ret;
}
