#include "prc_alterations"
#include "prc_feat_const"

void main()
{
   if (GetIsImmune(PRCGetSpellTargetObject(),IMMUNITY_TYPE_CRITICAL_HIT)) return;

   object oWeap=GetSpellCastItem();

   if (GetBaseItemType(oWeap)!=BASE_ITEM_SHORTSPEAR ) return;


   int nThreat  = 20;

   if (GetItemHasItemProperty(oWeap, ITEM_PROPERTY_KEEN) == TRUE)
   {
   nThreat = nThreat - 1;
   }

   if (GetHasFeat(FEAT_IMPROVED_CRITICAL_SPEAR) == TRUE)
   {
   nThreat = nThreat - 1;
   }

   int dice=d20();

   int iDiceCritical = 2 + (GetHasFeat(FEAT_WEAPON_OF_CHOICE_SHORTSPEAR) && GetHasFeat(FEAT_INCREASE_MULTIPLIER));

     if (dice>=nThreat)
    {
      FloatingTextStringOnCreature("Critical Hit", OBJECT_SELF);

      if (GetHasFeat( FEAT_SHOCKING_WEAPON,OBJECT_SELF))
        ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(d10(iDiceCritical),DAMAGE_TYPE_ELECTRICAL,DAMAGE_POWER_NORMAL),PRCGetSpellTargetObject());

      ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(d8(iDiceCritical),DAMAGE_TYPE_SONIC,DAMAGE_POWER_NORMAL),PRCGetSpellTargetObject());

    }
    
  if (GetHasSpellEffect( SPELL_DARKFIRE,oWeap))
  {

     int nDamageType = GetLocalInt(oWeap, "X2_Wep_Dam_Type");
     int nAppearanceTypeS = VFX_IMP_FLAME_S;
     int nAppearanceTypeM = VFX_IMP_FLAME_M;

     switch(nDamageType)
     {
        case DAMAGE_TYPE_ACID: nAppearanceTypeS = VFX_IMP_ACID_S; nAppearanceTypeM = VFX_IMP_ACID_L; break;
        case DAMAGE_TYPE_COLD: nAppearanceTypeS = VFX_IMP_FROST_S; nAppearanceTypeM = VFX_IMP_FROST_L; break;
        case DAMAGE_TYPE_ELECTRICAL: nAppearanceTypeS = VFX_IMP_LIGHTNING_S; nAppearanceTypeM =VFX_IMP_LIGHTNING_M;break;
        case DAMAGE_TYPE_SONIC: nAppearanceTypeS = VFX_IMP_SONIC; nAppearanceTypeM = VFX_IMP_SONIC; break;
     }

     // Get Caster Level
     int nLevel = GetLocalInt(oWeap, "X2_Wep_Caster_Lvl");

    int nDmg = d6() + (nLevel/2);

    effect eDmg = EffectDamage(nDmg,nDamageType);
    effect eVis;
    if (nDmg<10) // if we are doing below 12 point of damage, use small flame
    {
      eVis =EffectVisualEffect(nAppearanceTypeS);
    }
    else
    {
       eVis =EffectVisualEffect(nAppearanceTypeM);
    }
    eDmg = EffectLinkEffects (eVis, eDmg);
    object oTarget = PRCGetSpellTargetObject();

    if (GetIsObjectValid(oTarget))
    {
      ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, oTarget);
    }

  }
}