//::///////////////////////////////////////////////
//:: Dragon Breath Gas Cloud
//:: NW_S1_DragGas
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
    Calculates the proper damage and DC Save for the
    breath weapon based on the HD of the dragon.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: May 9, 2001
//:://////////////////////////////////////////////
/*
Patch 1.70

- wrong target check (could affect other NPCs)
- damage was the same for all creatures in AoE
- old evasion behaviour (now that evasion is applied will appear in log)
> breath weapon damage and DC calculation changed in order to allow higher values
for custom content dragons with 40+ HD. DC calculation is now 10+1/2 dragon's HD+
dragon's constitution modifier.
*/

#include "70_inc_dragons"
#include "x0_i0_spells"

void main()
{
    //Declare major variables
    int nDamage = GetDragonBreathNumDice();
    int nDC = GetDragonBreathDC();

    //When used by a dragon disciple, calculate DC and damage based on their DD levels
    if (GetLocalInt(OBJECT_SELF, "ddbreath") == 1 )
    {
    int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONDISCIPLE, OBJECT_SELF);
    nDamage = 2*nLevel / 3;
    //if (nLevel == 29) nDamage = 25;
    //if (nLevel == 30) nDamage = 30;

    switch (nLevel)
        {
        case 1: nDC = 15; break;
        case 2: nDC = 15; break;
        case 3: nDC = 15; break;
        case 4: nDC = 15; break;
        case 5: nDC = 16; break;
        case 6: nDC = 16; break;
        case 7: nDC = 17; break;
        case 8: nDC = 17; break;
        case 9: nDC = 18; break;
        case 10: nDC = 18; break;
        case 11: nDC = 19; break;
        case 12: nDC = 20; break;
        case 13: nDC = 21; break;
        case 14: nDC = 22; break;
        case 15: nDC = 23; break;
        case 16: nDC = 24; break;
        case 17: nDC = 25; break;
        case 18: nDC = 26; break;
        case 19: nDC = 27; break;
        case 20: nDC = 28; break;
        case 21: nDC = 29; break;
        case 22: nDC = 30; break;
        case 23: nDC = 31; break;
        case 24: nDC = 32; break;
        case 25: nDC = 33; break;
        case 26: nDC = 34; break;
        case 27: nDC = 35; break;
        case 28: nDC = 36; break;
        case 29: nDC = 37; break;
        case 30: nDC = 38; break;
        }
    }
    //Done

    int nDamStrike;
    float fDelay;
    effect eVis = EffectVisualEffect(VFX_IMP_POISON_L);
    effect eBreath;

     if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) PlayDragonBattleCry();
    //Get first target in spell area
    object oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE);
    while(GetIsObjectValid(oTarget))
    {
        if(oTarget != OBJECT_SELF && spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
        {
            //Fire cast spell at event for the specified target
            SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_DRAGON_BREATH_GAS));
            //randomize damage for each creature in AoE
            nDamStrike = d10(nDamage);
             if (GetLocalInt(OBJECT_SELF, "ddbreath") == 0 ) nDamStrike = d6(nDamage);
            //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
            nDamStrike = GetReflexAdjustedDamage(nDamStrike, oTarget, nDC, SAVING_THROW_TYPE_ACID, OBJECT_SELF);
            if (nDamStrike > 0)
            {
                //Set Damage and VFX
                eBreath = EffectDamage(nDamStrike, DAMAGE_TYPE_ACID);
                //Determine effect delay
                fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
                //Apply the VFX impact and effects
                DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
                DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget));
             }
        }
        //Get next target in spell area
        oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE);
    }
    SetLocalInt(OBJECT_SELF, "ddbreath", 0);
}