#include "prc_inc_spells" #include "NW_I0_SPELLS" // The creature running this script tries to use a medicine bag on oTarget void medicinebag(object oTarget); // Paladin uses holy symbol. void UseHolySymbol(object oPC=OBJECT_SELF); // Nlackguard uses unholy symbol. void UseUnHolySymbol(object oPC=OBJECT_SELF); 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 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 = 16; int nDuration=d2(); 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(PRCMySavingThrow(nDC,oTarget,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 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 = d4()+Random(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); 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/10.0)+2.00; if (GetIsReactionTypeFriendly(oTarget)) { return; } //Make a touch attack int nHit=TouchAttackRanged(oTarget); // create the mirv effect //ApplyEffectToObject(DURATION_TYPE_INSTANT, eArrow, oTarget); // cast a fake spell ClearAllActions(); if (!GetIsPC(OBJECT_SELF)) { ActionCastFakeSpellAtObject(793,oTarget,PROJECTILE_PATH_TYPE_HOMING); } else { ActionCastSpellAtObject(793, oTarget, METAMAGIC_ANY, TRUE, 0, PROJECTILE_PATH_TYPE_HOMING,TRUE); } 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; } DelayCommand(fDelay,FloatingTextStringOnCreature("A length of cord is thrown at you and wraps itself around your neck",oTarget)); DelayCommand(fDelay,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 (MyPRCGetRacialType(OBJECT_SELF)!=RACIAL_TYPE_DWARF) { if (FortitudeSave(OBJECT_SELF,22,SAVING_THROW_TYPE_POISON)==0) { eLink = EffectLinkEffects(eInt, eWis); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE)); eVis = EffectVisualEffect(VFX_FNF_LOS_EVIL_10); PlayVoiceChat(VOICE_CHAT_POISONED); } } ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF,240.0); } 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)); } void UseUnHolySymbol(object oPC=OBJECT_SELF) { int nDur=10+GetAbilityModifier(ABILITY_CHARISMA,oPC); effect eAOE = EffectAreaOfEffect(AOE_MOB_UNEARTHLY,"jw_empty_script","jw_blackaur_hb","jw_empty_script"); ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_HARM), oPC); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAOE, oPC,RoundsToSeconds(nDur)); }