#include "NW_I0_SPELLS" #include "prc_inc_spells" // The creature running this script tries to use a medicine bag on oTarget void medicinebag(object oTarget); // Paladin uses holy symbol. nLevel is the paladin level void UseHolySymbol(object oPC=OBJECT_SELF); int ScrollResist(object oCaster, object oTarget, float fDelay = 0.0); int ScrollResist(object oCaster, object oTarget, float fDelay = 0.0) { oCaster=GetObjectByTag("PR_Zacharias"); if (fDelay > 0.5) { fDelay = fDelay - 0.1; } int nResist = ResistSpell(oCaster, oTarget); effect eSR = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE); effect eGlobe = EffectVisualEffect(VFX_IMP_GLOBE_USE); effect eMantle = EffectVisualEffect(VFX_IMP_SPELL_MANTLE_USE); if(nResist == 1) //Spell Resistance { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eSR, oTarget)); } else if(nResist == 2) //Globe { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eGlobe, oTarget)); } else if(nResist == 3) //Spell Mantle { if (fDelay > 0.5) { fDelay = fDelay - 0.1; } DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eMantle, oTarget)); } return nResist; } void acidstorm(location lTarget) { ///AssignCommand(oUser,SpeakString("I am a valid object")); effect eVis = EffectVisualEffect(VFX_FNF_STORM); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lTarget); effect eAOE = EffectAreaOfEffect(AOE_PER_STORM,"jw_empty_script","jw_empty_script","jw_empty_script"); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, lTarget, 1.5); int nDamage; float fDelay; eVis = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_ACID); effect eDam; //Get the spell target location as opposed to the spell target. //Declare the spell shape, size and the location. Capture the first target object in the shape. object oMob = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); //Cycle through the targets within the spell shape until an invalid object is captured. while (GetIsObjectValid(oMob)) { if(!GetIsReactionTypeFriendly(oMob,OBJECT_SELF)) { fDelay = GetRandomDelay(0.4, 1.5); //Fire cast spell at event for the specified target SignalEvent(oMob, EventSpellCastAt(OBJECT_SELF, SPELL_FINGER_OF_DEATH)); if (!ScrollResist(OBJECT_SELF, oMob, fDelay)) { //Roll damage for each target nDamage = d6(6); eDam = EffectDamage(nDamage, DAMAGE_TYPE_ACID); // Apply effects to the currently selected target. DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oMob)); //This visual effect is applied to the target object not the location as above. This visual effect //represents the impact that erupts on the target not on the ground. DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oMob)); } else { // AssignCommand(oMob,SpeakString("I resisted")); } } //Select the next target within the spell shape. oMob = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } } void antimagic() { int nDuration=10; ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_FNF_DISPEL_GREATER),OBJECT_SELF); effect eVis=EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE); effect eImmune=EffectSpellImmunity(SPELL_ALL_SPELLS); effect eLink=EffectLinkEffects(eVis,eImmune); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,OBJECT_SELF,60.0); } void azuths() { //AssignCommand(oUser,SpeakString("I am a valid object")); int nDuration=6; int nCount=1; location lTarget=GetLocation(OBJECT_SELF); float fDelay; effect eVis = EffectVisualEffect(VFX_IMP_SPELL_MANTLE_USE); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); eVis = EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE); effect eResist=EffectSpellResistanceIncrease(12); effect eLink=EffectLinkEffects(eVis,eResist); //Get the spell target location as opposed to the spell target. //Declare the spell shape, size and the location. Capture the first target object in the shape. object oMob = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE); //Cycle through the targets within the spell shape until an invalid object is captured. while(GetIsObjectValid(oMob) && nCount != nDuration) { if(GetIsFriend(oMob,OBJECT_SELF)) { fDelay = GetRandomDelay(0.4, 1.5); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oMob,300.0)); nCount++; } //Select the next target within the spell shape. oMob = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE); } } void balllight(location lTarget) { ///AssignCommand(oUser,SpeakString("I am a valid object")); effect eSummon=EffectSummonCreature("jw_ball_light1",VFX_FNF_SUMMON_MONSTER_3,0.5); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, RoundsToSeconds(20)); } void blackblade(location lTarget) { //AssignCommand(oUser,SpeakString("I am a valid object")); effect eSummon=EffectSummonCreature("jw_black_bl",VFX_FNF_SUMMON_GATE,3.0); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, RoundsToSeconds(5)); } void bombard(object oTarget) { object oRock; int nIdx; int nDamage; location lLoc=GetLocation(oTarget); for (nIdx=1;nIdx<=8;nIdx++) { oRock=CreateObject(OBJECT_TYPE_PLACEABLE,"jw_smash_boulder",lLoc,TRUE); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDeath(TRUE,FALSE),oRock); if (!ScrollResist(OBJECT_SELF, oTarget)) { nDamage=d8(2); if (ReflexSave(oTarget,22,SAVING_THROW_TYPE_SPELL)!=0) { nDamage=nDamage/2; } ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectDamage(nDamage,DAMAGE_TYPE_BLUDGEONING,DAMAGE_POWER_PLUS_FOUR),oTarget); AssignCommand(oTarget,PlayVoiceChat(VOICE_CHAT_PAIN2)); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_HEAD_NATURE),oTarget); } } } void caststone(location lTarget) { //Declare major variables int nCount=1; int nHD = 15; int nDuration = 10; object oTarget; effect eGaze = EffectParalyze(); effect eVis = EffectVisualEffect(VFX_IMP_DOMINATE_S); effect eDur = EffectVisualEffect(VFX_DUR_PROT_GREATER_STONESKIN); effect eVisDur = EffectVisualEffect(VFX_DUR_PARALYZED); effect eLink = EffectLinkEffects(eDur, eVisDur); eLink = EffectLinkEffects(eLink, eGaze); eLink = EffectLinkEffects(eLink, eVis); float fDelay = 0.5; //Get first target in spell area oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE); //Cycle through the targets within the spell shape until an invalid object is captured. while(GetIsObjectValid(oTarget)) { if(!GetIsReactionTypeFriendly(oTarget) && oTarget != OBJECT_SELF && nCount != 5) { //Fire cast spell at event for the specified target SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_GAZE_DOMINATE)); //Determine effect delay if((!ScrollResist(OBJECT_SELF, oTarget))&&(WillSave(oTarget,22,SAVING_THROW_TYPE_SPELL)==0)) { //Apply the VFX impact and effects //DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration))); nCount++; } else { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DOMINATE_S), oTarget)); } } //Get next target in spell area oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE); } } void pipesharm() { PlaySound("as_cv_flute2"); //AssignCommand(oUser,SpeakString("I am a valid object")); int nDuration=15; int nCount=1; location lTarget=GetLocation(OBJECT_SELF); float fDelay; effect eVis = EffectVisualEffect(VFX_IMP_CHARM); object oThing; //Get the spell target location as opposed to the spell target. //Declare the spell shape, size and the location. Capture the first target object in the shape. object oMob = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE); //Cycle through the targets within the spell shape until an invalid object is captured. while(GetIsObjectValid(oMob) && nCount != nDuration) { if(GetIsEnemy(oMob,OBJECT_SELF)) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oMob,300.0); oThing=GetFirstFactionMember(OBJECT_SELF,FALSE); while (GetIsObjectValid(oThing)) { SetIsTemporaryFriend(oMob,oThing,TRUE,300.0); SetIsTemporaryFriend(oThing,oMob,TRUE,300.0); oThing=GetNextFactionMember(OBJECT_SELF,FALSE); } AssignCommand(oMob,ClearAllActions()); nCount++; } //Select the next target within the spell shape. oMob = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, lTarget, TRUE, OBJECT_TYPE_CREATURE); } } void palsym() { //Declare major variables int nLevel = GetLevelByClass(CLASS_TYPE_PALADIN); int nChr = GetAbilityModifier(ABILITY_CHARISMA); int nDuration = 8+nChr; effect eDamage; effect eAttack; effect eAC; effect eVis; int nAttack; int nDamage; int nAC; int nVis; //SpeakString("Level: " + IntToString(nLevel) + " Ranks: " + IntToString(nRanks)); if(nLevel >= 20) { nAttack = 8; nDamage = 7; nAC = 6; nVis=37; } else if(nLevel >= 19) { nAttack = 7; nDamage =7; nAC = 6; nVis=55; } else if(nLevel >= 18) { nAttack = 7; nDamage = 6; nAC = 6; nVis=55; } else if(nLevel >= 17) { nAttack = 6; nDamage = 6; nAC = 5; nVis=55; } else if(nLevel >= 16) { nAttack = 6; nDamage = 5; nAC = 5; nVis=71; } else if(nLevel >= 15) { nAttack = 5; nDamage = 5; nAC = 4; nVis=71; } else if(nLevel >= 14) { nAttack = 5; nDamage = 4; nAC = 4; nVis=71; } else if(nLevel >= 12) { nAttack = 4; nDamage = 4; nAC = 3; nVis=67; } else if (nLevel >= 8) { nAttack = 4; nDamage = 3; nAC = 3; nVis=67; } else if(nLevel >= 6) { nAttack = 3; nDamage = 3; nAC = 3; nVis=68; } else if(nLevel >= 3) { nAttack = 3; nDamage = 2; nAC = 2; nVis=68; } else if(nLevel >= 2) { nAttack = 2; nDamage = 2; nAC = 2; nVis=69; } else if(nLevel >= 1) { nAttack = 1; nDamage = 1; nAC = 1; nVis=69; } eVis = EffectVisualEffect(nVis); eAttack = EffectAttackIncrease(nAttack); eAttack=VersusAlignmentEffect(eAttack,ALIGNMENT_ALL,ALIGNMENT_EVIL); eDamage = EffectDamageIncrease(nDamage, DAMAGE_TYPE_DIVINE); eDamage = VersusAlignmentEffect(eDamage,ALIGNMENT_ALL,ALIGNMENT_EVIL); effect eLink = EffectLinkEffects(eAttack, eDamage); eAC = EffectACIncrease(nAC, AC_DODGE_BONUS); eAC= VersusAlignmentEffect(eAC,ALIGNMENT_ALL,ALIGNMENT_EVIL); eLink = EffectLinkEffects(eLink, eAC); eLink = ExtraordinaryEffect(eLink); ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,OBJECT_SELF,RoundsToSeconds(nDuration)); } void deathdragon() { effect eAC=EffectACIncrease(4,AC_NATURAL_BONUS); effect eDef=EffectACIncrease(4,AC_DEFLECTION_BONUS); effect eLink=EffectLinkEffects(eAC,eDef); effect eHP=EffectTemporaryHitpoints(15); eLink=EffectLinkEffects(eHP,eLink); effect eDam=EffectDamageIncrease(4,DAMAGE_TYPE_NEGATIVE); eLink=EffectLinkEffects(eDam,eLink); effect eVis=EffectVisualEffect(VFX_DUR_PROT_SHADOW_ARMOR); eLink=EffectLinkEffects(eVis,eLink); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_POLYMORPH),OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,OBJECT_SELF,RoundsToSeconds(15)); } void dirge() { location lTarget=GetLocation(OBJECT_SELF); PlaySound("al_mg_chntmagic1"); effect eAOE = EffectAreaOfEffect(AOE_PER_GREASE,"jw_dirge_aoe","jw_dirge_aoe","jw_empty_script"); effect eVis = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_GREASE); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, lTarget); //Create an instance of the AOE Object using the Apply Effect function ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, lTarget, RoundsToSeconds(12)); } void cascade(object oTarget) { //Declare major variables int nCasterLevel = 17; int nDamage = d6(nCasterLevel); int nDamStrike; int nNumAffected = 0; //Declare lightning effect connected the casters hands effect eLightning = EffectBeam(VFX_BEAM_FIRE, OBJECT_SELF, BODY_NODE_HAND);; effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S); effect eDamage; object oFirstTarget = oTarget; object oHolder; object oTarget; location lSpellLocation; //Damage the initial target if(!GetIsReactionTypeFriendly(oFirstTarget,OBJECT_SELF)) { //Fire cast spell at event for the specified target SignalEvent(oFirstTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING)); //Make an SR Check if (!ScrollResist(OBJECT_SELF, oFirstTarget)) { //Adjust damage via Reflex Save or Evasion or Improved Evasion nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oFirstTarget, 24, SAVING_THROW_TYPE_FIRE); //Set the damage effect for the first target eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE); //Apply damage to the first target and the VFX impact. if(nDamStrike > 0) { ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oFirstTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oFirstTarget); } } } //Apply the lightning stream effect to the first target, connecting it with the caster ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oFirstTarget,0.5); //Reinitialize the lightning effect so that it travels from the first target to the next target eLightning = EffectBeam(VFX_BEAM_FIRE, oFirstTarget, BODY_NODE_CHEST); //Halve the damage for all secondary targets beyond the first. // eDamage = EffectDamage(nDamage/2, DAMAGE_TYPE_ELECTRICAL); float fDelay = 0.2; int nCnt; //Get the first target in the spell shape oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); while (GetIsObjectValid(oTarget) && nCnt < nCasterLevel) { //Make sure the caster's faction is not hit and the first target is not hit if (oTarget != oFirstTarget && !GetIsReactionTypeFriendly(oTarget) && oTarget != OBJECT_SELF) { //Connect the new lightning stream to the older target and the new target DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oTarget,0.5)); //Fire cast spell at event for the specified target SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING)); //Do an SR check if (!ScrollResist(OBJECT_SELF, oTarget, fDelay)) { nDamage = d6(nCasterLevel); //Adjust damage via Reflex Save or Evasion or Improved Evasion nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oTarget, 24, SAVING_THROW_TYPE_FIRE); //Apply the damage and VFX impact to the current target eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE); if(nDamStrike > 0) //age > 0) { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oTarget)); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget)); } } oHolder = oTarget; //change the currect holder of the lightning stream to the current target eLightning = EffectBeam(VFX_BEAM_FIRE, oHolder, BODY_NODE_CHEST); fDelay = fDelay + 0.1f; } //Count the number of targets that have been hit. if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE) { nCnt++; } //Get the next target in the shape. oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } } void forcewave() { ActionPlayAnimation(ANIMATION_FIREFORGET_VICTORY2); effect eLink = EffectKnockdown(); float fDelay; int nDC = 32; int nDuration = 4; effect eImpact = EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY); ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, OBJECT_SELF); //Get first target in spell area object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); while(GetIsObjectValid(oTarget)) { if(!GetIsReactionTypeFriendly(oTarget) && !GetIsFriend(oTarget) && oTarget != OBJECT_SELF) { nDuration = GetScaledDuration(nDuration , oTarget); //Fire cast spell at event for the specified target //SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_HOWL_PARALYSIS)); fDelay = GetDistanceToObject(oTarget)/10; //Make a saving throw check if(FortitudeSave(oTarget,nDC,SAVING_THROW_TYPE_SONIC)==0) { //Apply the VFX impact and effects DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration))); if (d2()==1) { AssignCommand(oTarget,PlaySound("as_wt_thunderds1")); } else { AssignCommand(oTarget,PlaySound("as_wt_thunderds2")); } } } //Get next target in spell area oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); } } void summonvalk(location lTarget) { //AssignCommand(oUser,SpeakString("I am a valid object")); PlaySound("as_cv_eulpipe1"); effect eSummon=EffectSummonCreature("jw_bard_valk",VFX_FNF_SUMMON_CELESTIAL,3.0); ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, RoundsToSeconds(15)); } void minorcascade(object oTarget) { //Declare major variables int nCasterLevel = 6; int nDamage = d6(nCasterLevel); int nDamStrike; int nNumAffected = 0; //Declare lightning effect connected the casters hands effect eLightning = EffectBeam(VFX_BEAM_FIRE, OBJECT_SELF, BODY_NODE_HAND);; effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S); effect eDamage; object oFirstTarget = oTarget; object oHolder; object oTarget; location lSpellLocation; //Damage the initial target if(!GetIsReactionTypeFriendly(oFirstTarget,OBJECT_SELF)) { //Fire cast spell at event for the specified target SignalEvent(oFirstTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING)); //Make an SR Check if (!ScrollResist(OBJECT_SELF, oFirstTarget)) { //Adjust damage via Reflex Save or Evasion or Improved Evasion nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oFirstTarget, 24, SAVING_THROW_TYPE_FIRE); //Set the damage effect for the first target eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE); //Apply damage to the first target and the VFX impact. if(nDamStrike > 0) { ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oFirstTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oFirstTarget); } } } //Apply the lightning stream effect to the first target, connecting it with the caster ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oFirstTarget,0.5); //Reinitialize the lightning effect so that it travels from the first target to the next target eLightning = EffectBeam(VFX_BEAM_FIRE, oFirstTarget, BODY_NODE_CHEST); //Halve the damage for all secondary targets beyond the first. // eDamage = EffectDamage(nDamage/2, DAMAGE_TYPE_ELECTRICAL); float fDelay = 0.2; int nCnt; //Get the first target in the spell shape oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); while (GetIsObjectValid(oTarget) && nCnt < nCasterLevel) { //Make sure the caster's faction is not hit and the first target is not hit if (oTarget != oFirstTarget && !GetIsReactionTypeFriendly(oTarget) && oTarget != OBJECT_SELF) { //Connect the new lightning stream to the older target and the new target DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLightning,oTarget,0.5)); //Fire cast spell at event for the specified target SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_CHAIN_LIGHTNING)); //Do an SR check if (!ScrollResist(OBJECT_SELF, oTarget, fDelay)) { nDamage = d6(nCasterLevel); //Adjust damage via Reflex Save or Evasion or Improved Evasion nDamStrike = PRCGetReflexAdjustedDamage(nDamage, oTarget, 24, SAVING_THROW_TYPE_FIRE); //Apply the damage and VFX impact to the current target eDamage = EffectDamage(nDamStrike, DAMAGE_TYPE_FIRE); if(nDamStrike > 0) //age > 0) { DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eDamage,oTarget)); DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget)); } } oHolder = oTarget; //change the currect holder of the lightning stream to the current target eLightning = EffectBeam(VFX_BEAM_FIRE, oHolder, BODY_NODE_CHEST); fDelay = fDelay + 0.1f; } //Count the number of targets that have been hit. if(GetObjectType(oTarget) == OBJECT_TYPE_CREATURE) { nCnt++; } //Get the next target in the shape. oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oFirstTarget), TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } } void RunStrangle(int nStrength, int nSecondsRemaining, object oTarget) { if (GetIsDead(oTarget) == FALSE) { int nFree=0; //Roll damage int nDamage = d2(nStrength); //check for metamagic effect eDam = EffectDamage(nDamage,DAMAGE_TYPE_SLASHING,nStrength); effect eVis = EffectVisualEffect(VFX_COM_SPARKS_PARRY); ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget); int nDC=14+(nStrength*2); string sString=GetName(oTarget)+" has broken free of the garrote"; effect eCon=EffectAbilityDecrease(ABILITY_CONSTITUTION,1); eCon=ExtraordinaryEffect(eCon); if (FortitudeSave(oTarget,nDC,SAVING_THROW_TYPE_DEATH)==0) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eCon,oTarget,240.0); AssignCommand(oTarget,PlayVoiceChat(VOICE_CHAT_PAIN3)); SendMessageToPC(oTarget,"You are strangled by the cord"); } else { FloatingTextStringOnCreature(sString,OBJECT_SELF); FloatingTextStringOnCreature("You break free of the garrote",oTarget); nSecondsRemaining==0; nFree=1; } nSecondsRemaining=nSecondsRemaining-1; if (nSecondsRemaining > 0&&nFree==0) { DelayCommand(1.0f,RunStrangle(nStrength, nSecondsRemaining,oTarget)); } } } void garrote(object oTarget, int nStrength) { //Declare major variables effect eArrow=EffectVisualEffect(VFX_IMP_MIRV); float fDist = GetDistanceToObject(oTarget); float fDelay = (fDist/25.0); if (GetIsReactionTypeFriendly(oTarget)) { return; } //Make a touch attack int nHit=TouchAttackRanged(oTarget); // create the mirv effect ApplyEffectToObject(DURATION_TYPE_INSTANT, eArrow, oTarget); if (nHit==0) { DelayCommand(fDelay,FloatingTextStringOnCreature("Missed",OBJECT_SELF)); return; } if (MyPRCGetRacialType(oTarget)==RACIAL_TYPE_UNDEAD) { DelayCommand(fDelay,FloatingTextStringOnCreature("Undead cannot be strangled",OBJECT_SELF)); return; } if (MyPRCGetRacialType(oTarget)==RACIAL_TYPE_ELEMENTAL) { DelayCommand(fDelay,FloatingTextStringOnCreature("Elementals cannot be strangled",OBJECT_SELF)); return; } if (MyPRCGetRacialType(oTarget)==RACIAL_TYPE_CONSTRUCT) { DelayCommand(fDelay,FloatingTextStringOnCreature("Constructs cannot be strangled",OBJECT_SELF)); return; } FloatingTextStringOnCreature("A length of cord is thrown at you and wraps itself around your neck",oTarget); AssignCommand(oTarget,PlayVoiceChat(VOICE_CHAT_PAIN2)); DelayCommand(fDelay,RunStrangle(nStrength, nStrength, oTarget)); } void regeninst() { //Declare major variables int nLevel = GetLevelByClass(CLASS_TYPE_BARD); int nRanks = GetSkillRank(SKILL_PERFORM); int nChr = GetAbilityModifier(ABILITY_CHARISMA); int nPerform = nRanks; int nDuration = 10+ nChr; if (GetTag(GetItemInSlot(INVENTORY_SLOT_ARMS))=="jw_newitem2") { SendMessageToPC(OBJECT_SELF,"The elven gloves of the bard boost the power of your song."); nPerform=nPerform+6; nLevel=nLevel+3; } effect eRegen; int nRegenAmount; float fRegenTime; //SpeakString("Level: " + IntToString(nLevel) + " Ranks: " + IntToString(nRanks)); if(nPerform >= 60 && nLevel > 20) { nRegenAmount=4; fRegenTime=1.0; } if(nPerform >= 60 && nLevel >= 20) { nRegenAmount=5; fRegenTime=2.0; } else if(nPerform >= 55 && nLevel >= 20) { nRegenAmount=4; fRegenTime=2.0; } else if(nPerform >= 50 && nLevel >= 20) { nRegenAmount=4; fRegenTime=2.0; } else if(nPerform >= 45 && nLevel >= 19) { nRegenAmount=3; fRegenTime=2.0; } else if(nPerform >= 40 && nLevel >= 18) { nRegenAmount=3; fRegenTime=2.0; } else if(nPerform >= 35 && nLevel >= 17) { nRegenAmount=2; fRegenTime=2.0; } else if(nPerform >= 30 && nLevel >= 16) { nRegenAmount=2; fRegenTime=2.0; } else if(nPerform >= 24 && nLevel >= 15) { nRegenAmount=4; fRegenTime=4.0; } else if(nPerform >= 21 && nLevel >= 14) { nRegenAmount=4; fRegenTime=4.0; } else if(nPerform >= 18 && nLevel >= 12) { nRegenAmount=3; fRegenTime=4.0; } else if(nPerform >= 15 && nLevel >= 8) { nRegenAmount=3; fRegenTime=4.0; } else if(nPerform >= 12 && nLevel >= 6) { nRegenAmount=2; fRegenTime=4.0; } else if(nPerform >= 9 && nLevel >= 3) { nRegenAmount=2; fRegenTime=4.0; } else if(nPerform >= 6 && nLevel >= 2) { nRegenAmount=1; fRegenTime=4.0; } else if(nPerform >= 3 && nLevel >= 1) { nRegenAmount=1; fRegenTime=4.0; } effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG); eRegen=EffectRegenerate(nRegenAmount,fRegenTime); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); effect eLink = EffectLinkEffects(eRegen, eDur); effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_NATURE); effect eFNF = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, GetLocation(OBJECT_SELF)); object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); eLink = ExtraordinaryEffect(eLink); while(GetIsObjectValid(oTarget)) { if(oTarget == OBJECT_SELF) { effect eLinkBard = EffectLinkEffects(eLink, eVis); eLinkBard = ExtraordinaryEffect(eLinkBard); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLinkBard, oTarget, RoundsToSeconds(nDuration)); } else if(GetIsFriend(oTarget)) { ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration)); } oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); } } void dwarfire() { object oPC=OBJECT_SELF; effect eFear=EffectImmunity(IMMUNITY_TYPE_FEAR); effect eVis = EffectVisualEffect(VFX_FNF_LOS_HOLY_10); effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); effect eLink = EffectLinkEffects(eFear, eMind); eLink = EffectLinkEffects(eLink, eDur); effect eWis=EffectAbilityDecrease(ABILITY_WISDOM,10); effect eInt=EffectAbilityDecrease(ABILITY_INTELLIGENCE,10); if (GetRacialType(OBJECT_SELF)!=RACIAL_TYPE_DWARF) { if (FortitudeSave(OBJECT_SELF,22,SAVING_THROW_TYPE_POISON)==0) { eLink = EffectLinkEffects(eLink, eWis); eLink = EffectLinkEffects(eLink, eInt); PlayVoiceChat(VOICE_CHAT_POISONED); } } ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF,300.0); } // Blind-Dust by Aaron Holmes void blindust(object oVictim) { object oRogue = OBJECT_SELF; float nThrowRange; float fDistance; location lVictim; location lRogue; effect eVisual; string OutOfRange = "The target is out of range"; string TargetHit = "You throw a handful of blinding dust into the target's eyes"; string VictimHit = "A handful of blinding dust stings your eyes!"; int iBlind = 0; effect eDamage; int iDexmod = GetAbilityModifier(ABILITY_DEXTERITY, oRogue); int iLevels=GetLevelByClass(CLASS_TYPE_ROGUE,oRogue); if (iLevels>1) { iLevels=iLevels/2; } int iSavingThrow = 8+iDexmod+iLevels; // Set Range Increment in meters nThrowRange = FeetToMeters(5.0); // Determine the location of the victim lVictim = GetLocation(oVictim); lRogue = GetLocation(oRogue); fDistance = GetDistanceBetweenLocations(lRogue, lVictim); // Ranged touch attack for thrown dust int touchAttack = TouchAttackRanged(oVictim, 1); if(touchAttack == 1 || touchAttack == 2) { // Dont have any effect on Undead/Magical Beasts/Elementals and Constructs if(MyPRCGetRacialType(oVictim) == RACIAL_TYPE_UNDEAD) { SendMessageToPC(oRogue, "The dust has no effect on this kind of target"); return; } if(MyPRCGetRacialType(oVictim) == RACIAL_TYPE_MAGICAL_BEAST) { SendMessageToPC(oRogue, "The dust has no effect on this kind of target"); return; } if(MyPRCGetRacialType(oVictim) == RACIAL_TYPE_ELEMENTAL) { SendMessageToPC(oRogue, "The dust has no effect on this kind of target"); return; } if(MyPRCGetRacialType(oVictim) == RACIAL_TYPE_CONSTRUCT) { SendMessageToPC(oRogue, "The dust has no effect on this kind of target"); return; } // If the target is not any of the above, make a reflex save throw to close their eyes/turn away fast enough // Reflex save DC is D6 + Rogue Levels + Dexterity Modifier if (ReflexSave(oVictim, iSavingThrow)) { ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_MIND), oVictim); return; } else { if (!GetIsReactionTypeFriendly(oVictim,oRogue)) { // If the target fails the saving throw, apply d2 damage to them and make them blind for 2 rounds iBlind = 2; eDamage = EffectDamage(d2(), DAMAGE_TYPE_MAGICAL); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDamage, oVictim); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oVictim, RoundsToSeconds(iBlind)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_IMP_BLIND_DEAF_M), oVictim, RoundsToSeconds(iBlind)); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_MIND), oVictim); AssignCommand(oVictim, PlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 4.0)); AssignCommand(oVictim, PlayVoiceChat(VOICE_CHAT_PAIN1)); SendMessageToPC(oRogue, TargetHit); SendMessageToPC(oVictim, VictimHit); // If the target is also another PC, make the PC cry out in pain if (GetIsPC(oVictim)) { AssignCommand (oVictim, SpeakString("Ah.. my eyes!")); } } } } } void medicinebag(object oTarget) { if (oTarget==OBJECT_SELF) { SendMessageToPC(OBJECT_SELF,"You cannot use this on yourself"); return; } if ((!GetIsObjectValid(oTarget))||(!GetIsPC(oTarget))) { SendMessageToPC(OBJECT_SELF,"Target the bandages on a dying character to use them"); return; } int nHP=GetCurrentHitPoints(oTarget); if (nHP>0) { SendMessageToPC(OBJECT_SELF,"This character is not bleeding to death"); return; } if (GetIsInCombat(OBJECT_SELF)) { int nSkill=GetSkillRank(SKILL_HEAL,OBJECT_SELF); if (nSkill==-1) { nSkill=0; } int nRandom=d20(); int nTotal=nSkill+nRandom; SendMessageToPC(OBJECT_SELF,"Skill check for using the medicine bag in combat: Rolled "+IntToString(nRandom)+" plus heal skill "+IntToString(nSkill)+" for a total of "+IntToString(nTotal)+" vs DC 15"); if (nTotal<15) { return; } } int nHeal=2-nHP; ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(nHeal),oTarget); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_HEALING_S),oTarget); } void cormpot() { effect eAC=EffectACIncrease(4,AC_NATURAL_BONUS); effect eDef=EffectACIncrease(4,AC_DEFLECTION_BONUS); effect eLink=EffectLinkEffects(eAC,eDef); effect eHP=EffectTemporaryHitpoints(15); eLink=EffectLinkEffects(eHP,eLink); effect eDam=EffectDamageIncrease(4,DAMAGE_TYPE_POSITIVE); eLink=EffectLinkEffects(eDam,eLink); effect eVis=EffectVisualEffect(VFX_DUR_MAGIC_RESISTANCE); eLink=EffectLinkEffects(eVis,eLink); effect eRegen=EffectRegenerate(2,1.0); eLink=EffectLinkEffects(eRegen,eLink); ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_IMP_SUPER_HEROISM),OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eLink,OBJECT_SELF,RoundsToSeconds(15)); } void UseHolySymbol(object oPC=OBJECT_SELF) { int nDur=10+GetAbilityModifier(ABILITY_CHARISMA,oPC); effect eAOE = EffectAreaOfEffect(AOE_MOB_FIRE,"jw_empty_script","jw_palaur_hb","jw_empty_script"); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY), oPC); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oPC,RoundsToSeconds(nDur)); }