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

#include <combat_modules.h>

inherit SWORD;

#if BLOWS_STYLE == BLOWS_TYPES
#define evt_data(evt)  evt->data[0]
#define decrement_damage(evt)  evt->data[sizeof(evt->data) - 1]--
#else /* BLOWS_STYLE == BLOWS_SIMPLE */
#define evt_data(evt)  evt->data
#define decrement_damage(evt)  evt->data--
#endif

class event_info source_modify_event(class event_info evt)
{
  int opp_health;
  int damage;
  int excess;
  string array system_limbs;

  if(evt->data == "miss" || evt->data == "disarm")
    return evt;

#ifdef HEALTH_USES_LIMBS
  opp_health = evt->target->query_health(evt->target_extra);
#else
  opp_health = evt->target->query_health();
#endif
  damage = evt->data[sizeof(evt->data) - 1];

  if(opp_health <= damage)
  {
    excess = damage - opp_health;
#if HEALTH_STYLE == HEALTH_HITPOINTS
    for(int i = 0; i<=excess;i++)
      decrement_damage(evt);
#else /* HEALTH_STYLE == HEALTH_LIMBS || HEALTH_STYLE == HEALTH_WOUNDS */
    if(evt->target->is_vital_limb(evt->target_extra))
      for(int i = 0; i<excess;i++)
        decrement_damage(evt);
    if(evt->target->is_system_limb(evt->target_extra))
    {
      system_limbs = evt->target->query_system_limbs() - ({ evt->target_extra });
      foreach(string s in system_limbs)
      {
        if(evt->target->query_health(s) != -1)
        return evt;
      }

      for(int i = 0; i<excess;i++)
        decrement_damage(evt);
    }
#endif /* HEALTH_STYLE */
  }
   return evt;
}

void setup()
{
  set_adj("glowing");
  set_id("sword");
  add_id("mercy");
  add_adj("sword of");
  set_proper_name("the Sword of Mercy");
#ifdef USE_SIZE
  set_size(MEDIUM);
#endif
#ifdef USE_MASS
  set_mass(MEDIUM);
#endif
}
