Battledale_PRC8/_module/nss/jw_custom_spells.nss
Jaysyn904 e5b3f6ad61 Finished PRC8 integration
Finished PRC8 integration.  Moved creature abilities to top hak.  Setup tooling.  Created release archive
2024-03-12 21:27:23 -04:00

1096 lines
36 KiB
Plaintext

#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));
}