///:://///////////////////////////////////////////// //:: Bigby's Crushing Hand //:: [x0_s0_bigby5] //:: Copyright (c) 2002 Bioware Corp. //::////////////////////////////////////////////// /* Similar to Bigby's Grasping Hand. If Grapple succesful then will hold the opponent and do 2d6 + 12 points of damage EACH round for 1 round/level // Mark B's famous advice: // Note: if the target is dead during one of these second-long heartbeats, // the DelayCommand doesn't get run again, and the whole package goes away. // Do NOT attempt to put more than two parameters on the delay command. They // may all end up on the stack, and that's all bad. 60 x 2 = 120. */ //::////////////////////////////////////////////// //:: Created By: Brent //:: Created On: September 7, 2002 //::////////////////////////////////////////////// //:: VFX Pass By: #include "x0_i0_spells" #include "x2_inc_spellhook" #include "x2_i0_spells" int nSpellID = 463; void RunHandImpact(object oTarget, object oCaster) { //-------------------------------------------------------------------------- // Check if the spell has expired (check also removes effects) //-------------------------------------------------------------------------- if (GZGetDelayedSpellEffectsExpired(nSpellID,oTarget,oCaster)) { return; } int nDam = MaximizeOrEmpower(6,2,GetMetaMagicFeat(), 12); effect eDam = EffectDamage(nDam, DAMAGE_TYPE_BLUDGEONING); effect eVis = EffectVisualEffect(VFX_IMP_ACID_L); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); DelayCommand(6.0f,RunHandImpact(oTarget,oCaster)); } void RunPalmerHandImpact(object oTarget, object oCaster, int nDC) { //-------------------------------------------------------------------------- // Check if the spell has expired (check also removes effects) //-------------------------------------------------------------------------- if (GZGetDelayedSpellEffectsExpired(nSpellID,oTarget,oCaster)) { return; } effect eKnockdown = EffectParalyze(); // creatures immune to paralzation are still prevented from moving if (GetIsImmune(oTarget, EFFECT_TYPE_PARALYZE) == TRUE) { eKnockdown = EffectCutsceneImmobilize(); } int nCasterModifiers = GetCasterAbilityModifier(oCaster) + GetCasterLevel(oCaster); int nCasterRoll = d20(1) + nCasterModifiers + 12 + -1; int nTargetRoll = GetAC(oTarget); if (nCasterRoll >= nTargetRoll) { int nDam = MaximizeOrEmpower(6,2,GetMetaMagicFeat(), 12); effect eDam = EffectDamage(nDam, DAMAGE_TYPE_BLUDGEONING); effect eVis = EffectVisualEffect(VFX_IMP_ACID_L); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); if (!MySavingThrow(SAVING_THROW_FORT, oTarget, nDC)) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnockdown, oTarget, RoundsToSeconds(1)); } DelayCommand(6.0f,RunPalmerHandImpact(oTarget,oCaster, nDC)); } } void main() { /* Spellcast Hook Code Added 2003-06-20 by Georg If you want to make changes to all spells, check x2_inc_spellhook.nss to find out more */ if (!X2PreSpellCastCode()) { // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell return; } // End of Spell Cast Hook object oTarget = GetSpellTargetObject(); //-------------------------------------------------------------------------- // This spell no longer stacks. If there is one hand, that's enough //-------------------------------------------------------------------------- if (GetHasSpellEffect(nSpellID,oTarget) || GetHasSpellEffect(462,oTarget) ) { FloatingTextStrRefOnCreature(100775,OBJECT_SELF,FALSE); return; } int nDuration = GetCasterLevel(OBJECT_SELF); int nMetaMagic = GetMetaMagicFeat(); //Check for metamagic extend if (nMetaMagic == METAMAGIC_EXTEND) //Duration is +100% { nDuration = nDuration * 2; } if(!GetIsReactionTypeFriendly(oTarget)) { //Fire cast spell at event for the specified target SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_BIGBYS_CRUSHING_HAND, TRUE)); //SR if(!MyResistSpell(OBJECT_SELF, oTarget)) { effect eHand = EffectVisualEffect(VFX_DUR_BIGBYS_CRUSHING_HAND); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHand, oTarget, RoundsToSeconds(nDuration)); object oSelf = OBJECT_SELF; int nHandDC=GetSpellSaveDC(); RunPalmerHandImpact(oTarget, oSelf, nHandDC); FloatingTextStrRefOnCreature(2478, OBJECT_SELF); } else { FloatingTextStrRefOnCreature(83309, OBJECT_SELF); } } }