//::///////////////////////////////////////////////
//:: Name codi_ondeath
//::
//:://////////////////////////////////////////////
/*
    NPC OnDeath event script caller to run
    CODI AI & PRC events.
*/
//:://////////////////////////////////////////////
//:: Created By: Jaysyn
//:: Created On: 20240331
//:://////////////////////////////////////////////
#include "prc_inc_spells"
#include "prc_inc_combmove"

void main()
{
//:: Declare major variables
    object oNPC = OBJECT_SELF;
    object oPC = GetLastKiller();

    //int nKillFlag = GetLocalInt(GetLastKiller(), "KILL_TASK_FLAG");

    string sTagSelf = GetTag(oNPC);
    //string sTagTarget = GetLocalString(oPC, "KILL_TASK_TARGET");

    string sResRef  = GetResRef(oNPC);

    if (GetLocalInt(GetModule(),"X3_ENABLE_MOUNT_DB")&&GetIsObjectValid(GetMaster(OBJECT_SELF))) SetLocalInt(GetMaster(OBJECT_SELF),"bX3_STORE_MOUNT_INFO",TRUE);

//:: End any active grapple from Improved Grab
	EndGrapple(oNPC, GetGrappleTarget(oNPC));   
	EndGrapple(GetGrappleTarget(oNPC), oNPC); 

   int nBalor = GetStringLeft(GetTag(OBJECT_SELF), 9) == "POA_BALOR" ? TRUE : FALSE;
    if(nBalor)
	{
		DelayCommand(0.0f, ExecuteScript("nw_s3_balordeth",OBJECT_SELF));
	}
	
	
	int nInsanity  = GetLocalInt(OBJECT_SELF,"INSANITY");
    if(nInsanity)
        {
            object oCaster = OBJECT_SELF;
            object oTarget = GetLastKiller();
            effect eConfuse = EffectConfused();
            effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
            effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
            effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
            effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
            effect eLink = EffectLinkEffects(eMind, eConfuse);
            eLink = EffectLinkEffects(eLink, eDur);
            eLink = SupernaturalEffect(eLink);

            // Get oCaster's DC
            int nCreCHAMod = GetAbilityModifier(ABILITY_CHARISMA, oCaster);
            int nCreHD = GetHitDice (oCaster);
            int nDC = (10 + (nCreHD/2) + nCreCHAMod);

            ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, GetSpellTargetLocation());

            if ( !PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS, oCaster))
                {
                    ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);           // Apply Viz
                    ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
                    AssignCommand(oTarget,SpeakString("*The "+GetName(oCaster)+" has driven you insane!*"));
                }
        }


//:: Vampire's Gaseous Form onDeath
    if(sResRef == "ra_vampspawn01" || sResRef == "ra_vampspawn02")
    {
        effect eVFX;
        object oSpawn;
        location lSelf = GetLocation(OBJECT_SELF);

//:: Apply some visual effects & unload the model.
        eVFX = EffectVisualEffect(VFX_COM_UNLOAD_MODEL);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
        eVFX = EffectVisualEffect(VFX_COM_BLOOD_CRT_RED);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
        eVFX = EffectVisualEffect(491);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
        eVFX = EffectVisualEffect(VFX_COM_CHUNK_RED_SMALL);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);
        eVFX = EffectVisualEffect(VFX_FNF_SMOKE_PUFF);
        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oNPC);

//:: Spawn Gaseous Form.
    eVFX = EffectVisualEffect(133);
    oSpawn = CreateObject(OBJECT_TYPE_CREATURE, "ra_vamp_gas_form", GetLocation(oNPC));
    DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSpawn));;

    }

//:: Execute CODI AI NPC OnDeath script
    DelayCommand(0.0f, ExecuteScript("no_ai_dth", OBJECT_SELF));

//:: Execute NWN NPC OnDeath script
    //ExecuteScript("nw_c2_default7", OBJECT_SELF);

//:: Execute PWFXP XP script
    //DelayCommand(0.0f, ExecuteScript("pwfxp", OBJECT_SELF));

//:: Execute PRC NPC OnDeath script
    DelayCommand(0.0f, ExecuteScript("prc_npc_death", OBJECT_SELF));

//:: Execute PRC PW OnDeath scripts
    DelayCommand(0.0f, ExecuteScript("prc_pwondeath", OBJECT_SELF));
}