generated from Jaysyn/ModuleTemplate
617 lines
22 KiB
Plaintext
617 lines
22 KiB
Plaintext
#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));
|
|
}
|
|
|
|
|