#include "NW_I0_SPELLS"
#include "prc_inc_spells"

void DoFreeze(object oTarget, object oCaster)
{
    effect eImp = EffectVisualEffect(VFX_IMP_FROST_S);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eImp,oTarget);

    // Slow effect
    effect eVis = EffectVisualEffect(VFX_DUR_ICESKIN);
    effect eSlow = EffectSlow();
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
    effect eLink = EffectLinkEffects(eSlow,eVis);
    eLink = EffectLinkEffects(eLink,eDur);

    int nDC = 10 + GetHitDice(oCaster) /2 + GetAbilityModifier(ABILITY_CHARISMA);

    if ( !PRCMySavingThrow(SAVING_THROW_FORT,oTarget,nDC,SAVING_THROW_TYPE_COLD,oCaster) )
    {
        ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,oTarget,RoundsToSeconds(10));
    }
}

void DoAbilityDamage(object oTarget, object oCaster)
{
    // Con Damage
    int nDam = 4;
    int nType = ABILITY_CONSTITUTION;
    effect eDam = EffectAbilityDecrease(nType,nDam);
    eDam = SupernaturalEffect(eDam);
    eDam = ExtraordinaryEffect(eDam);

    int bKillEm = FALSE;
    if ( !GetIsPC(oTarget) || GetGameDifficulty() == GAME_DIFFICULTY_CORE_RULES
        || GetGameDifficulty() == GAME_DIFFICULTY_DIFFICULT )
        bKillEm = TRUE;


    ApplyEffectToObject(DURATION_TYPE_PERMANENT,eDam,oTarget);

    if ( GetIsImmune(oTarget,IMMUNITY_TYPE_ABILITY_DECREASE) )
        return;

    effect eHeal = EffectHeal(20);
    effect eHealVis = EffectVisualEffect(VFX_IMP_HEALING_M);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eHeal,oCaster);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eHealVis,oCaster);

    int nCon = GetAbilityScore(oTarget,ABILITY_CONSTITUTION);
    if ( ( nCon - nDam ) < 3 && bKillEm )
    {
        effect eVis2 = EffectVisualEffect(VFX_IMP_DEATH);
        effect eHP = EffectDamage( 9999 , DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
        effect eDeath = EffectDeath();
        ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis2,oTarget);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath,oTarget);
        ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP,oTarget);
    }



}

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

/*    int bIsPoisoned = GetLocalInt(oTarget,"IsPoisoned");
    if ( bIsPoisoned )
        return; */

    DoFreeze(oTarget,oCaster);
    DelayCommand(0.1,DoAbilityDamage(oTarget,oCaster));

}