//::///////////////////////////////////////////////
//:: Script Name: onplayerdying
//:://////////////////////////////////////////////
/*
    This script handles the default behavior
    that occurs when a character is dying. Dying
    is when the character is between 0 and -9 hit
    points; -10 and below is death. To use, redirect
    the OnDying event script of the module to this script.
*/
//:://////////////////////////////////////////////
//:: Author : Scott Thorne
//:: Updated: July 25, 2002
//:://////////////////////////////////////////////
//::Modified by Genisys (Guile)
//::Modified On: 4/23/08 (Updated 8/10/08)
//////////////////////////////////////////////////

//Required Include
#include "nw_i0_tool"

//PROTOTYPE DECLARED
void bleed(int iBleedAmt);

//Main Script
void main()
{
ExecuteScript("prc_ondying", OBJECT_SELF);
        //Declare Major Variables
        object oDying = GetLastPlayerDying();
        object oPlayer = GetLastPlayerDying();
        object oPC = GetLastPlayerDying();
        string ddVarName = "dd"+GetName(oPC);
        object oModule = GetModule();
        SetLocalInt (oModule, ddVarName, 1);

     //If the player is being tortured in Hell, ressurect them...
     object hell = GetArea(oPlayer);
     object helltest = GetArea(GetObjectByTag("satan1"));
     if (hell == helltest)
     {
     DelayCommand(3.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oPlayer));
     return;
     }

     AssignCommand(oDying, ClearAllActions());
    AssignCommand(oDying, bleed(1));

//Main Script End
}

//PROTOTYPE DEFINED
void bleed(int iBleedAmt)
{

           object oPC = GetLastPlayerDying();
           if (!GetIsPC(oPC)){
return;
}
        string ddVarName = "dd"+GetName(oPC);
        object oModule = GetModule();
    effect eBleedEff;

    /* keep executing recursively until character is dead or at +1 hit points */
    if (GetCurrentHitPoints() <= 0) {

        /* a positive bleeding amount means damage, otherwise heal the character */
        if (iBleedAmt > 0) {
            eBleedEff = EffectDamage(iBleedAmt);
        } else {
            eBleedEff = EffectHeal(-iBleedAmt);  /* note the negative sign */
        }


        ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, OBJECT_SELF);

        /* -10 hit points is the death threshold, at or beyond it the character dies */
        if (GetCurrentHitPoints() <= -10) {
        SetLocalInt (oModule, ddVarName, 1);
            PlayVoiceChat(VOICE_CHAT_DEATH); /* scream one last time */
            ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), OBJECT_SELF); /* make death dramatic */
            ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF); /* now kill them */
            return;
        }

        if (iBleedAmt > 0) { /* only check if character has not stablized */
            if (d10(1) == 1) {
                /* 10% chance to stablize */
                iBleedAmt = -iBleedAmt; /* reverse the bleeding process */
                PlayVoiceChat(VOICE_CHAT_LAUGH);
                /* laugh at death -- this time */
            } else {
                switch (d6()) {
                    case 1: PlayVoiceChat(VOICE_CHAT_PAIN1); break;
                    case 2: PlayVoiceChat(VOICE_CHAT_PAIN2); break;
                    case 3: PlayVoiceChat(VOICE_CHAT_PAIN3); break;
                    case 4: PlayVoiceChat(VOICE_CHAT_HEALME); break;
                    case 5: PlayVoiceChat(VOICE_CHAT_NEARDEATH); break;
                    case 6: PlayVoiceChat(VOICE_CHAT_HELP);
                }
            }
        }
        DelayCommand(6.0,bleed(iBleedAmt)); /* do this again next round */
    }
}