PRC8/nwn/nwnprc/trunk/scripts/prc_ondying.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

137 lines
4.8 KiB
Plaintext

//::///////////////////////////////////////////////
//:: OnPlayerDying eventscript
//:: prc_ondying
//:://////////////////////////////////////////////
#include "inc_utility"
#include "x0_i0_position"
#include "moi_inc_moifunc"
//////////////////////////////////////////
// Private Functions //
//////////////////////////////////////////
void Kill_PC(object oPC)
{
effect eDeath = EffectDeath(FALSE, FALSE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oPC);
}
void feat_save(object oDying)
{
//////////////////////////////////////////
// FEAT_SHADOWDISCOPOR
//////////////////////////////////////////
// Telflammar Shadowlord Shadow Discorporation. If successfull, prevents the rest of the script from executing
/// @todo TLK the feedback strings
if(GetHasFeat(FEAT_SHADOWDISCOPOR, oDying) &&
(GetIsAreaAboveGround(GetArea(oDying)) == AREA_UNDERGROUND ||
GetIsNight() ||
PRCGetHasEffect(EFFECT_TYPE_DARKNESS, oDying)
))
{
int nRoll = d20();
int nDC = 5 + GetLocalInt(oDying, "PRC_LastDamageTaken");
int bSuccess = nRoll + GetReflexSavingThrow(oDying) >= nDC;
// Some informational spam
string sFeedback = "*Reflex Save vs Death : "
+ (bSuccess ? "*success*" : "*failure*")
+ " :(" + IntToString(nRoll) + " + " + IntToString(GetReflexSavingThrow(oDying)) + " = " + IntToString(nRoll + GetReflexSavingThrow(oDying)) + " vs. DC:" + IntToString(nDC) + ")";
FloatingTextStringOnCreature(sFeedback, oDying);
// Handle keeping the character alive
if(bSuccess)
{// Resurrect the character. Necessary because the game considers them already dead at this point
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(1 - (GetCurrentHitPoints(oDying))), oDying);
SignalEvent(oDying, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
// Move the character to a random nearby location
location locJump = GetRandomLocation(GetArea(oDying), oDying, 30.0f);
AssignCommand(oDying, ClearAllActions(TRUE));
AssignCommand(oDying, ActionJumpToLocation(locJump));
// The character is not dying after all, so skip the rest of the script to avoid complications
// Though, the module's own OnDying script may very well supply complications anyway
return;
}
}
//////////////////////////////////////////
// FEAT_REMAIN_CONSCIOUS
//////////////////////////////////////////
// Code added by Oni5115 for Remain Concious
if(GetHasFeat(FEAT_REMAIN_CONSCIOUS, oDying) && GetCurrentHitPoints(oDying) > -10)
{
int pc_Damage = (GetCurrentHitPoints(oDying) * -1) + 1;
int prev_Damage = GetLocalInt(oDying, "PC_Damage");
// Store damage taken in a local variable
pc_Damage = pc_Damage + prev_Damage;
SetLocalInt(oDying, "PC_Damage", pc_Damage);
if(pc_Damage < 10)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
}
string sFeedback = GetName(oDying) + " : Current HP = " + IntToString(pc_Damage * -1);
SendMessageToPC(oDying, sFeedback);
}
//////////////////////////////////////////
// FEAT_DIEHARD
//////////////////////////////////////////
// When your hit points are reduced to 0 or below, you automatically become stable.
// You heal to 1 HP, but behave as if disabled.
int nHP = GetCurrentHitPoints(oDying);
if ((GetHasFeat(FEAT_DIEHARD, oDying)) && (nHP > -10) && (nHP <= 0))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
SetPersistantLocalInt(oDying, "STATUS", DISABLED);
}
//////////////////////////////////////////
// Rageclaws Meld
//////////////////////////////////////////
nHP = GetCurrentHitPoints(oDying);
int nLimit = (10 + GetEssentiaInvested(oDying, MELD_RAGECLAWS)) * -1;
if ((GetHasSpellEffect(MELD_RAGECLAWS, oDying)) && (nHP > nLimit) && (nHP <= 0))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectResurrection(), oDying);
}
//////////////////////////////////////////
// End of Feat/abilities
//////////////////////////////////////////
}
//////////////////////////////////////////
// End of private Functions //
//////////////////////////////////////////
void main()
{
object oDying = GetLastPlayerDying();
// Fire code for ANY Feats or abilities which can prevent death here.
feat_save(oDying);
// Execute scripts hooked to this event for the player triggering it
ExecuteAllScriptsHookedToEvent(oDying, EVENT_ONPLAYERDYING);
// Trigger the death/bleed if the PRC Death system is enabled (ElgarL).
if(GetPRCSwitch(PRC_PNP_DEATH_ENABLE))
AddEventScript(oDying, EVENT_ONHEARTBEAT, "prc_timer_dying", TRUE, FALSE);
}