//::///////////////////////////////////////////////
//:: Rust Monster Antennae Attack
//:://////////////////////////////////////////////
/*
    Handles antennae attack and rusting functions
    if attack hits.  Also calls the end of combat
    script every round.
*/
//:://////////////////////////////////////////////
//:: Based on End of Round Combat Script by Preston Watamaniuk
//:: Modified by LordEmil (July-30-2002) to include rust monster abilities
//:: Modified by El Magnifico Uno (Sept-11-2002) to enhance an already great script
//:://////////////////////////////////////////////

#include "NW_I0_GENERIC"

// this will check to see if the object is metal
// or is partly metal - Returns 0 if no metal,
// 1 if part metal, 2 if mostly metal
// type 16 is armor and needs an extra check
int IsItemMetal(object oItem)
{
  int nReturnVal=0;
  int type=GetBaseItemType(oItem);
  if((type<6)||type==9||type==10||type==12||type==13||type==17||type==18
     ||type==22||type==27||type==32||type==33||type==35||type==37||type==28
     ||type==40||type==41||type==42||type==47||type==51||type==52||type==53
     ||type==57||type==59||type==60||type==63||type==65||type==76)
  {
    nReturnVal=2;// Mostly metal
  }
  if(type==7||type==7||type==19||type==20||type==21||type==28||type==31
     ||type==44||type==45||type==46||type==56||type==62||type==78
     ||type==25||type==55||type==58)
  {
    nReturnVal=1;// Part metal
  }
  if(type==BASE_ITEM_ARMOR)// see what kind of armor
  {
    int ac=GetItemACValue(oItem);
    int limit=3;
    if(GetItemHasItemProperty(oItem,ITEM_PROPERTY_AC_BONUS))limit=5;
    if(ac>limit)
    {
      nReturnVal=2;// mostly metal
    }
  }
  return nReturnVal;
}

void main()
{
  if(GetBehaviorState(NW_FLAG_BEHAVIOR_SPECIAL))
  {
    DetermineSpecialBehavior();
  }
  else if(!GetSpawnInCondition(NW_FLAG_SET_WARNINGS))
  {
    DetermineCombatRound();
  }
  // do rust attack against attakee
  if(GetIsInCombat())
  {
    string sItem;
    object oItem;
    int nItemSlot;
    int isMetal;
    object oPC=GetAttackTarget();
    if(oPC==OBJECT_INVALID)oPC=GetAttemptedAttackTarget();

    if (GetDistanceToObject(oPC) < 2.5)
    {
      for(nItemSlot=0;nItemSlot<13;nItemSlot++)
      {
        oItem=GetItemInSlot(nItemSlot,oPC);
        isMetal=IsItemMetal(oItem);
        if(isMetal!=0)break;// found a target
      }
      // El Magnifico Uno - Added TouchAttack
      if(nItemSlot<13 && (TouchAttackMelee(oPC)>0))// we got one
      {
      //Determine AC Bonus, Enhance Bonus, To Hit Bonus, & Misc. Properties
      int iBonus = 0;
      int iAC = 0;
      int iEnhance = 0;
      int iToHit = 0;
      int iProp = 0;
      //Resistance as a Function of overall AC Value
      if (GetItemACValue(oItem) > 3) iAC = 1;
      if (GetItemACValue(oItem) > 5) iAC = 2;
      if (GetItemACValue(oItem) > 7) iAC = 3;
      // Sums across all known ITEM_PROPERTY_ constants
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ABILITY_BONUS) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_AC_BONUS) == TRUE)
       {
       iProp+=1;
       iBonus=3;
       }
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_AC_BONUS_VS_ALIGNMENT_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_AC_BONUS_VS_DAMAGE_TYPE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_AC_BONUS_VS_RACIAL_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_AC_BONUS_VS_SPECIFIC_ALIGNMENT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS) == TRUE)
       {
       iProp+=1;
       iToHit=3;
       }
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS_VS_ALIGNMENT_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS_VS_RACIAL_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ATTACK_BONUS_VS_SPECIFIC_ALIGNMENT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_BASE_ITEM_WEIGHT_REDUCTION) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_BONUS_FEAT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_CAST_SPELL) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DAMAGE_BONUS) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DAMAGE_BONUS_VS_ALIGNMENT_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DAMAGE_BONUS_VS_RACIAL_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DAMAGE_BONUS_VS_SPECIFIC_ALIGNMENT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DAMAGE_RESISTANCE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DAMAGE_VULNERABILITY) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_DARKVISION) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ENHANCEMENT_BONUS) == TRUE)
       {
       iProp+=1;
       iEnhance=3;
       }
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_ALIGNMENT_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_RACIAL_GROUP) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ENHANCEMENT_BONUS_VS_SPECIFIC_ALIGNEMENT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_EXTRA_MELEE_DAMAGE_TYPE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_EXTRA_RANGED_DAMAGE_TYPE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_FREEDOM_OF_MOVEMENT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_HASTE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_HOLY_AVENGER) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_IMMUNITY_DAMAGE_TYPE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_IMMUNITY_SPECIFIC_SPELL) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_IMMUNITY_SPELL_SCHOOL) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_IMMUNITY_SPELLS_BY_LEVEL) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_IMPROVED_EVASION) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_KEEN) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_LIGHT) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_MASSIVE_CRITICALS) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_MIGHTY) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_MIND_BLANK) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ON_HIT_PROPERTIES) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_POISON) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_REGENERATION) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_REGENERATION_VAMPIRIC) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_SAVING_THROW_BONUS) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_SAVING_THROW_BONUS_SPECIFIC) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_SKILL_BONUS) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_SPELL_RESISTANCE) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_TRUE_SEEING) == TRUE) iProp+=1;
      if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_UNLIMITED_AMMUNITION) == TRUE) iProp+=1;

        sItem=GetName(oItem);
        SendMessageToPC(oPC,"The Rust Monster's antennae brush against your "+sItem );
        // El Magnifico Uno - Changed save mechanism
        // to a straight Reflex Save per 3e rules.
        // Normally only get a save for magical items.
        // But was lazy and didn't want to list 60+
        // instances of GetItemHasProperty.
        if (ReflexSave(oPC,15-iProp-iBonus-iAC-iEnhance-iToHit))// saved
        {
          SendMessageToPC(oPC,"...but your "+sItem+" resists the rust effects!");
        }else //didn't save
        {
          SendMessageToPC(oPC,"...and destroy your "+sItem+"!");
          DestroyObject(oItem);
          //El Magnifico Uno - Changed Effect
          // ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_ACID_L),oPC);
          ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_ACID),GetLocation(oPC));
        }
      }
    }
  }
  if(GetSpawnInCondition(NW_FLAG_END_COMBAT_ROUND_EVENT))
  {
    SignalEvent(OBJECT_SELF, EventUserDefined(1003));
  }
}


