Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
188 lines
6.8 KiB
Plaintext
188 lines
6.8 KiB
Plaintext
/*:://////////////////////////////////////////////
|
||
//:: Spell Name Storm of Vengance On Heartbeat
|
||
//:: Spell FileName PHS_S_StormVenC
|
||
//:://////////////////////////////////////////////
|
||
//:: In Game Spell desctiption
|
||
//:://////////////////////////////////////////////
|
||
2nd round: Acid rain, 1d6 damage to everyone in AOE. No save.
|
||
3rd round: 6 bolts of lightning. 6 enemies affected. 10d6 reflex electrcity.
|
||
4th round: Hailstones, for 5d6 points of bludgeoning damage. No save.
|
||
5th to 10th rounds: Speed reduced by 3/4ths, and 20% miss chance.
|
||
|
||
No ranged attacks in the cloud. Spells cast within the area are disrupted unless
|
||
the caster succeeds on a Concentration check against a DC equal to the storm
|
||
of vengeance’s save DC + the level of the spell the caster is trying to cast.
|
||
//:://////////////////////////////////////////////
|
||
//:: Spell Effects Applied / Notes
|
||
//:://////////////////////////////////////////////
|
||
As above, really!
|
||
|
||
Concentration checks are made here in 2 second delay command heartbeats,
|
||
which are checked for the integer each time in the heartbeat.
|
||
|
||
If concentration is broken, the AOE is destroyed.
|
||
//:://////////////////////////////////////////////
|
||
//:: Created By: Jasperre
|
||
//::////////////////////////////////////////////*/
|
||
|
||
#include "PHS_INC_SPELLS"
|
||
|
||
void main()
|
||
{
|
||
// Check AOE creator
|
||
if(!PHS_CheckAOECreator()) return;
|
||
|
||
// Declare major variables
|
||
object oCaster = GetAreaOfEffectCreator();
|
||
object oTarget;
|
||
int nSpellSaveDC = PHS_GetSpellSaveDC();
|
||
float fDelay;
|
||
int nDamage;
|
||
|
||
// Get what round this is...we start at 0, obviously (as GetLocalInt returns
|
||
// 0 if it doesn't exsist) so we add one and use that
|
||
int nRound = PHS_IncreaseStoredInteger(OBJECT_SELF, "ROUNDS_DONE", 1);
|
||
|
||
// At round 1, we do nothing
|
||
if(nRound == 1)
|
||
{
|
||
return;
|
||
}
|
||
// 2nd round: Acid rain, 1d6 damage to everyone in AOE. No save.
|
||
else if(nRound == 2)
|
||
{
|
||
effect eAcidVis = EffectVisualEffect(VFX_IMP_ACID_S);
|
||
// For lag reasons, only if we get 1 on a d4 do we apply a visual
|
||
oTarget = GetFirstInPersistentObject();
|
||
while(GetIsObjectValid(oTarget))
|
||
{
|
||
// PvP Check
|
||
if(!GetIsReactionTypeFriendly(oTarget, oCaster))
|
||
{
|
||
// Signal event
|
||
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_STORM_OF_VENGEANCE);
|
||
|
||
// Random delay
|
||
fDelay = PHS_GetRandomDelay(0.1, 1.0);
|
||
|
||
// Spell resistance + Immunity check
|
||
if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
|
||
{
|
||
// Do damage, maybe visual - 1d6 acid.
|
||
if(d4() == 1)
|
||
{
|
||
DelayCommand(fDelay, PHS_ApplyDamageVFXToObject(oTarget, eAcidVis, d6(), DAMAGE_TYPE_ACID));
|
||
}
|
||
else
|
||
{
|
||
DelayCommand(fDelay, PHS_ApplyDamageToObject(oTarget, d6(), DAMAGE_TYPE_ACID));
|
||
}
|
||
}
|
||
}
|
||
oTarget = GetNextInPersistentObject();
|
||
}
|
||
}
|
||
//3rd round: 6 bolts of lightning. 6 enemies affected. 10d6 reflex electrcity.
|
||
else if(nRound == 3)
|
||
{
|
||
// Get the first 6 enemies to the centre of the AOE.
|
||
effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_M);
|
||
int nBolts, nCnt = 1;
|
||
oTarget = GetNearestObject(OBJECT_TYPE_CREATURE, OBJECT_SELF, nCnt);
|
||
while(GetIsObjectValid(oTarget) && nBolts <= 6 &&
|
||
GetIsInSubArea(oTarget, OBJECT_SELF))
|
||
{
|
||
// PvP check
|
||
if(!GetIsReactionTypeFriendly(oTarget, oCaster))
|
||
{
|
||
// Enemy? In our area?
|
||
if(!GetFactionEqual(oTarget, oCaster) && GetIsEnemy(oTarget, oCaster))
|
||
{
|
||
// Signal event
|
||
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_STORM_OF_VENGEANCE);
|
||
|
||
// One more bolt
|
||
nBolts++;
|
||
|
||
// Random delay
|
||
fDelay = PHS_GetRandomDelay(0.1, 1.0);
|
||
|
||
// Enemy: In our area: We cast a lightning bolt on them
|
||
if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
|
||
{
|
||
// Damage
|
||
nDamage = PHS_MaximizeOrEmpower(6, 10, METAMAGIC_NONE);
|
||
|
||
// Reflex damage
|
||
nDamage = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, nDamage, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_ELECTRICITY, oCaster);
|
||
|
||
// Do damage (if any)
|
||
if(nDamage > 0)
|
||
{
|
||
DelayCommand(fDelay, PHS_ApplyDamageVFXToObject(oTarget, eVis, nDamage, DAMAGE_TYPE_ELECTRICAL));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
// Get next
|
||
nCnt++;
|
||
oTarget = GetNearestObject(OBJECT_TYPE_CREATURE, OBJECT_SELF, nCnt);
|
||
}
|
||
}
|
||
// 4th round: Hailstones, for 5d6 points of bludgeoning damage. No save.
|
||
else if(nRound == 4)
|
||
{
|
||
// Apply hailstone VFX
|
||
effect eAOE = EffectVisualEffect(PHS_VFX_FNF_STORM_VENGANCE_HAIL);
|
||
PHS_ApplyLocationVFX(GetLocation(OBJECT_SELF), eAOE);
|
||
|
||
// Loop objects.
|
||
oTarget = GetFirstInPersistentObject();
|
||
while(GetIsObjectValid(oTarget))
|
||
{
|
||
// PvP Check
|
||
if(!GetIsReactionTypeFriendly(oTarget, oCaster))
|
||
{
|
||
// Signal event
|
||
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_STORM_OF_VENGEANCE);
|
||
|
||
// Random delay
|
||
fDelay = PHS_GetRandomDelay(0.1, 1.0);
|
||
|
||
// Spell resistance + Immunity check
|
||
if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
|
||
{
|
||
// Get damage
|
||
nDamage = PHS_MaximizeOrEmpower(6, 5, METAMAGIC_NONE);
|
||
|
||
// Do damage
|
||
DelayCommand(fDelay, PHS_ApplyDamageToObject(oTarget, nDamage, DAMAGE_TYPE_BLUDGEONING));
|
||
}
|
||
}
|
||
oTarget = GetNextInPersistentObject();
|
||
}
|
||
}
|
||
// 5th to 10th rounds: Speed reduced by 3/4ths, and 20% miss chance.
|
||
else
|
||
{
|
||
// Apply 6 seconds of these linked effects
|
||
effect eSpeed = EffectMovementSpeedDecrease(75);
|
||
effect eMiss = EffectMissChance(20);
|
||
effect eLink = EffectLinkEffects(eSpeed, eMiss);
|
||
|
||
// Loop objects.
|
||
oTarget = GetFirstInPersistentObject();
|
||
while(GetIsObjectValid(oTarget))
|
||
{
|
||
// Signal event
|
||
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_STORM_OF_VENGEANCE);
|
||
|
||
// Apply effects
|
||
PHS_ApplyDuration(oTarget, eLink, 6.0);
|
||
|
||
// Next person
|
||
oTarget = GetNextInPersistentObject();
|
||
}
|
||
}
|
||
}
|