Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
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();
|
||
}
|
||
}
|
||
}
|