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.
175 lines
7.5 KiB
Plaintext
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));
|
|
|
|
}
|