PoA_PRC8/_module/nss/draining_touch.nss
Jaysyn904 bfbbd2f1ac Major update
Added several new undead models & facelifted overrides for other models.  Added dozens of new undead creatures from Libris Mortis & the monster manuals.  Added CODI Core AI.  Added NESS spawner system.  Added randomized respawning trap system.  Added undead feeding system.  Greatly revamped Catacombs & Halls of the Dead.  Updated nimtools.  Full compile.  Updated release archive.
2024-04-07 01:06:57 -04:00

175 lines
7.5 KiB
Plaintext

//::
//:: A pnp version of the Ghost's ability draining touch.
//::
//:: Modified by: DM Heatstroke 01-10-11
//::
#include "nw_i0_spells"
#include "nw_i0_plot"
#include "prc_inc_spells"
void DoAbilityDamage(object oTarget, object oCaster)
{ // Get ability & amount to drain
int nAbility;
int nDam = Random(5)+1;
int nRandom = Random(5)+1;
if (nRandom == 1)
{
nAbility = ABILITY_STRENGTH;
//SpeakString("Choice "+IntToString(nRandom)+". Draining "+IntToString(nDam)+" Strength", TALKVOLUME_SILENT_SHOUT);
}
else if (nRandom == 2)
{
nAbility = ABILITY_CONSTITUTION;
//SpeakString("Choice "+IntToString(nRandom)+". Draining "+IntToString(nDam)+" Constitution", TALKVOLUME_SILENT_SHOUT);
}
else if (nRandom == 3)
{
nAbility = ABILITY_DEXTERITY;
//SpeakString("Choice "+IntToString(nRandom)+". Draining "+IntToString(nDam)+" Dexterity", TALKVOLUME_SILENT_SHOUT);
}
else if (nRandom == 4)
{
nAbility = ABILITY_INTELLIGENCE;
//SpeakString("Choice "+IntToString(nRandom)+". Draining "+IntToString(nDam)+" Intelligence", TALKVOLUME_SILENT_SHOUT);
}
else if (nRandom == 5)
{
nAbility = ABILITY_WISDOM;
//SpeakString("Choice "+IntToString(nRandom)+". Draining "+IntToString(nDam)+" Wisdom", TALKVOLUME_SILENT_SHOUT);
}
else
{
nAbility = ABILITY_CHARISMA;
//SpeakString("Choice "+IntToString(nRandom)+". Draining "+IntToString(nDam)+" Charisma", TALKVOLUME_SILENT_SHOUT);
}
// Setup ability drain
effect eVis = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
effect eDrain = EffectAbilityDecrease(nAbility, nDam);
eDrain = ExtraordinaryEffect(eDrain);
// Setup oCaster's healing
effect eHeal = EffectHeal(5);
effect eDrainVis = EffectVisualEffect(VFX_IMP_HEALING_L);
// Determine if they can die from ability loss
int bKillEm = FALSE;
if ( !GetIsPC(oTarget) || GetGameDifficulty() == GAME_DIFFICULTY_CORE_RULES
|| GetGameDifficulty() == GAME_DIFFICULTY_DIFFICULT )
bKillEm = TRUE;
// Get oCaster's Touch DC
int nCreCHAMod = GetAbilityModifier(ABILITY_CHARISMA, oCaster);
int nCreHD = GetHitDice (oCaster);
int nTouchDC = (10 + (nCreHD/2) + nCreCHAMod);
// Roll a saving throw
if ( !PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nTouchDC, SAVING_THROW_TYPE_NONE, oCaster) )
{ // If they fail a save & have less than a 3 in any ability score, kill them
int nStr = GetAbilityScore(oTarget,ABILITY_STRENGTH);
int nCon = GetAbilityScore(oTarget,ABILITY_CONSTITUTION);
int nDex = GetAbilityScore(oTarget,ABILITY_DEXTERITY);
int nInt = GetAbilityScore(oTarget,ABILITY_INTELLIGENCE);
int nWis = GetAbilityScore(oTarget,ABILITY_WISDOM);
int nCha = GetAbilityScore(oTarget,ABILITY_CHARISMA);
if ( ( nStr - nDam ) < 3 && bKillEm )
{
effect eVis3 = EffectVisualEffect(VFX_IMP_DEATH);
effect eHP2 = EffectDamage( 9999, DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath2 = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath2,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP2,oTarget);
SendMessageToPC(oTarget,"You died from Strength Drain.");
//SpeakString(GetName(oTarget)+" Died from Strength Drain", TALKVOLUME_SILENT_SHOUT);
}
else if ( ( nDex - nDam ) < 3 && bKillEm )
{
effect eVis3 = EffectVisualEffect(VFX_IMP_DEATH);
effect eHP2 = EffectDamage( 9999, DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath2 = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath2,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP2,oTarget);
SendMessageToPC(oTarget,"You died from Dexterity Drain.");
//SpeakString(GetName(oTarget)+" Died from Dexterity Drain", TALKVOLUME_SILENT_SHOUT);
}
else if ( ( nCon - nDam ) < 3 && bKillEm )
{
effect eVis3 = EffectVisualEffect(VFX_IMP_DEATH);
effect eHP2 = EffectDamage( 9999, DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath2 = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath2,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP2,oTarget);
SendMessageToPC(oTarget,"You died from Constitution Drain.");
//SpeakString(GetName(oTarget)+" Died from Constitution Drain", TALKVOLUME_SILENT_SHOUT);
}
else if ( ( nInt - nDam ) < 3 && bKillEm )
{
effect eVis3 = EffectVisualEffect(VFX_IMP_DEATH);
effect eHP2 = EffectDamage( 9999, DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath2 = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath2,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP2,oTarget);
SendMessageToPC(oTarget,"You died from Intelligence Drain.");
//SpeakString(GetName(oTarget)+" Died from Intelligence Drain", TALKVOLUME_SILENT_SHOUT);
}
else if ( ( nWis - nDam ) < 3 && bKillEm )
{
effect eVis3 = EffectVisualEffect(VFX_IMP_DEATH);
effect eHP2 = EffectDamage( 9999, DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath2 = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath2,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP2,oTarget);
SendMessageToPC(oTarget,"You died from Wisdom Drain.");
//SpeakString(GetName(oTarget)+" Died from Wisdom Drain", TALKVOLUME_SILENT_SHOUT);
}
else if ( ( nCha - nDam ) < 3 && bKillEm )
{
effect eVis3 = EffectVisualEffect(VFX_IMP_DEATH);
effect eHP2 = EffectDamage( 9999, DAMAGE_TYPE_MAGICAL , DAMAGE_POWER_PLUS_TWENTY);
effect eDeath2 = EffectDeath();
ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis3,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eDeath2,oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT,eHP2,oTarget);
SendMessageToPC(oTarget,"You died from Charisma Drain.");
//SpeakString(GetName(oTarget)+" Died from Charisma Drain", TALKVOLUME_SILENT_SHOUT);
}
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); // Apply Viz
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDrain, oTarget, 8640.0); // 24 "Athas Reborn" hours -DMH
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oCaster); // Heal up
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDrainVis, oCaster); // Apply Viz
}
}
void main()
{
object oTarget = PRCGetSpellTargetObject();
object oCaster = OBJECT_SELF;
/* int bIsPoisoned = GetLocalInt(oTarget,"IsPoisoned");
if ( bIsPoisoned )
return; */
if ( GetIsImmune(oTarget,IMMUNITY_TYPE_ABILITY_DECREASE) )
{
SendMessageToPC(oTarget,"Immune to ability drain.");
return;
}
DelayCommand(0.1,DoAbilityDamage(oTarget,oCaster));
}