// MorgenGrauen MUDlib
//
// container/inventory.c -- Umgang mit besonderen Objekten im Inventory
//
// $Id: inventory.c 6554 2007-10-17 22:45:53Z Zesstra $
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone

inherit "/std/container/inventory";

#define NEED_PROTOTYPES

#include <properties.h>
#include <sensitive.h>
#include <attributes.h>

#define ME this_object()

public void RemoveSensitiveObject(object ob) {
  ::RemoveSensitiveObject(ob);
  RemoveSensitiveObjectFromList(ob,SENSITIVE_ATTACK);
  if (objectp(ob) && (ob->QueryProp(P_X_ATTR_MOD)   ||
                      ob->QueryProp(P_X_HEALTH_MOD) ))
  {
    deregister_modifier(ob);
    // Erst wenn das Objekt den Spieler verlassen konnte, die Attribute
    // neu berechnen.
    if (find_call_out("UpdateAttributes")==-1)
      call_out("UpdateAttributes",0); 
  }
}

public void InsertSensitiveObject(object ob, mixed arg) {
  ::InsertSensitiveObject(ob,arg);
  if (objectp(ob) && (ob->QueryProp(P_X_ATTR_MOD)   ||
                      ob->QueryProp(P_X_HEALTH_MOD) ))
  {
    register_modifier(ob);
    UpdateAttributes();
  }
}

public void CheckSensitiveAttack(int dam, mixed dam_type, mixed spell, 
                                 object enemy) {
  mixed a,x;
  int i;
  
  if (!pointerp(a=QueryProp(P_SENSITIVE_ATTACK)))
    return;
  if (!pointerp(dam_type))
    dam_type=({dam_type});
  for (i=sizeof(a)-1;i>=0;i--)
    if (pointerp(x=a[i]) &&
	dam>x[SENS_THRESHOLD] &&
	member(dam_type,x[SENS_KEY])>=0 &&
	objectp(x[SENS_OBJECT]) &&
	environment(x[SENS_OBJECT])==ME &&
	closurep(x[SENS_CLOSURE]))
      funcall(x[SENS_CLOSURE],
	      enemy,x[SENS_KEY],dam,
	      spell,x[SENS_OPT]);
}

