//:: //:: 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)); }