Added PEPS AI. Hopefully stopped "bleed" bug after being healed from dying. Full compile.
164 lines
5.2 KiB
Plaintext
164 lines
5.2 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: 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)
|
|
//////////////////////////////////////////////////
|
|
//::Modified by Jaysyn (Guile)
|
|
//::Modified On: 2025-10-21 08:50:59
|
|
//////////////////////////////////////////////////
|
|
|
|
//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
|
|
}
|
|
|
|
void bleed(int iBleedAmt)
|
|
{
|
|
object oPC = GetLastPlayerDying();
|
|
if (!GetIsPC(oPC))
|
|
return;
|
|
|
|
string ddVarName = "dd" + GetName(oPC);
|
|
object oModule = GetModule();
|
|
|
|
int nHP = GetCurrentHitPoints(oPC);
|
|
if (nHP > 0) // stop bleeding if above 0 HP
|
|
{
|
|
DeleteLocalInt(oModule, ddVarName);
|
|
return;
|
|
}
|
|
|
|
if (nHP <= -10)
|
|
{
|
|
SetLocalInt(oModule, ddVarName, 1);
|
|
PlayVoiceChat(VOICE_CHAT_DEATH);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), oPC);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oPC);
|
|
return;
|
|
}
|
|
|
|
// still bleeding
|
|
effect eBleedEff;
|
|
if (iBleedAmt > 0)
|
|
eBleedEff = EffectDamage(iBleedAmt);
|
|
else
|
|
eBleedEff = EffectHeal(-iBleedAmt);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eBleedEff, oPC);
|
|
|
|
// chance to stabilize
|
|
if (iBleedAmt > 0 && d10(1) == 1)
|
|
{
|
|
iBleedAmt = -iBleedAmt;
|
|
PlayVoiceChat(VOICE_CHAT_LAUGH);
|
|
}
|
|
else if (iBleedAmt > 0)
|
|
{
|
|
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); break;
|
|
}
|
|
}
|
|
|
|
DelayCommand(6.0, bleed(iBleedAmt));
|
|
}
|
|
|
|
//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
|
|
}
|
|
}
|
|
*/ |