Finished PRC8 integration. Moved creature abilities to top hak. Setup tooling. Created release archive
1096 lines
36 KiB
Plaintext
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));
|
|
}
|
|
|
|
|