/**
 * @file
 * Spellscript for Lich touch attack
 */
#include "prc_inc_sp_tch"
#include "prc_inc_template"

void main()
{
    object oTarget = PRCGetSpellTargetObject();
    int nIsDemi = GetHasTemplate(TEMPLATE_DEMILICH,OBJECT_SELF);

    // Gotta hit first
    if(PRCDoMeleeTouchAttack(oTarget)<1)
        return;

    // Gotta be a living critter
    int nType = MyPRCGetRacialType(oTarget);
    if ((nType == RACIAL_TYPE_CONSTRUCT) ||
        (nType == RACIAL_TYPE_UNDEAD) ||
        (nType == RACIAL_TYPE_ELEMENTAL))
        return;

    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));

    // Total character levels
    int nTotalHD = GetHitDice(OBJECT_SELF);
    // Save DC
    int nSaveDC = 10 + nTotalHD/2 + GetAbilityModifier(ABILITY_CHARISMA,OBJECT_SELF);
    // Damage
    int nDam = d8()+5;
    if(nIsDemi)
        nDam = d6(10)+20;
    // Apply Damage 1/2 if they will save, Demiliches - no save
    effect eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
    if(WillSave(oTarget,nSaveDC,SAVING_THROW_TYPE_NEGATIVE) && !nIsDemi)
        nDam = nDam/2;

    effect eDamage = EffectDamage(nDam,DAMAGE_TYPE_NEGATIVE);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oTarget);
    // Apply paralyze touch
    if(FortitudeSave(oTarget,nSaveDC,SAVING_THROW_TYPE_NONE,OBJECT_SELF))
        return;
    eVis = EffectVisualEffect(VFX_DUR_PARALYZED);
    effect ePara = EffectParalyze();
    ePara = EffectLinkEffects(eVis,ePara);
    // Cant be dispelled
    ePara = SupernaturalEffect(ePara);
    ApplyEffectToObject(DURATION_TYPE_PERMANENT,ePara,oTarget);
    eVis = EffectVisualEffect(VFX_IMP_STUN);
    ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
}