//::///////////////////////////////////////////////
//:: [Dive Attack]
//:: [avar_dive.nss]
//:://////////////////////////////////////////////
/*
    -2 AC +2 attack, double damage with peircing weapon
*/
//:://////////////////////////////////////////////
//:: Created By: Oni5115
//:: Created On: Sept. 24, 2004
//:://////////////////////////////////////////////

#include "prc_inc_combat"
//#include "prc_inc_util"
#include "prc_inc_skills"

void main()
{
    object oPC = OBJECT_SELF;
    object oTarget = PRCGetSpellTargetObject();

    if(!GetIsObjectValid(oTarget))
    {
       FloatingTextStringOnCreature("Invalid Target for Dive Attack", oPC, FALSE);
       return;
    }

    // PnP rules use feet, might as well convert it now.
    float fDistance = MetersToFeet(GetDistanceBetween(oPC, oTarget));
    if(fDistance >= 7.0)
    {
        // perform the jump
        if(PerformJump(oPC, GetLocation(oTarget), FALSE))
        {
             effect eACpen = EffectACDecrease(2);
             ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eACpen, oPC, 6.0);

             // get weapon information
             object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
             int iWeaponType = GetBaseItemType(oWeap);
             int iNumSides = StringToInt(Get2DACache("baseitems", "DieToRoll", iWeaponType));
             int iNumDice = StringToInt(Get2DACache("baseitems", "NumDice", iWeaponType));
             int iCritMult = GetWeaponCritcalMultiplier(oPC, oWeap);
             // deal double the damage
             if(GetWeaponDamageType(oWeap) == DAMAGE_TYPE_PIERCING)
                  iNumDice *= 2;

             struct BonusDamage sWeaponBonusDamage = GetWeaponBonusDamage(oWeap, oTarget);
             struct BonusDamage sSpellBonusDamage = GetMagicalBonusDamage(oPC, oTarget);

             // perform attack roll
             string sMes = "*Dive Attack Miss*";
             int iAttackRoll = GetAttackRoll(oTarget, oPC, oWeap, 0, 0, 2, TRUE, 3.1);
             int bIsCritical = iAttackRoll == 2;

             effect eDamage = GetAttackDamage(oTarget, oPC, oWeap, sWeaponBonusDamage, sSpellBonusDamage, 0, 0, bIsCritical, iNumDice, iNumSides, iCritMult);

             if(iAttackRoll)
             {
                 sMes = "*Dive Attack Hit*";
                 DelayCommand(3.2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget));
             }
             DelayCommand(3.3, FloatingTextStringOnCreature(sMes, oPC, FALSE));
        }
    }
    else
    {
        FloatingTextStringOnCreature("Too close for Dive Attack", oPC, FALSE);
    }
}