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.
126 lines
4.7 KiB
Plaintext
126 lines
4.7 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Spell Name Spike Growth - On Heartbeat
|
|
//:: Spell FileName PHS_S_SpikeGrowC
|
|
//:://////////////////////////////////////////////
|
|
//:: Spell Effects Applied / Notes
|
|
//:://////////////////////////////////////////////
|
|
On Heartbeat.
|
|
|
|
Gets the distance traveled, and must be over 1M to do damage, at 1d4 damage
|
|
per meter.
|
|
|
|
If any damage is done, they will have to have 50% speed deduction for 24
|
|
hours. Note: This doesn't overlap.
|
|
|
|
The any remaining/old locations are deleted On Exit.
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "PHS_INC_SPELLS"
|
|
|
|
void main()
|
|
{
|
|
// Check AOE
|
|
if(!PHS_CheckAOECreator()) return;
|
|
|
|
// Declare major variables
|
|
object oTarget;
|
|
object oCaster = GetAreaOfEffectCreator();
|
|
int nMetaMagic = PHS_GetAOEMetaMagic();
|
|
int nSpellSaveDC = PHS_GetAOESpellSaveDC();
|
|
int nDamage, nDice;
|
|
float fDelay, fDistance;
|
|
string sLocal = "PHS_SPIKE_GROWTH_LOCATION";
|
|
location lPrevious, lNew;
|
|
object oArea = GetArea(OBJECT_SELF);
|
|
|
|
// Get duration of speed decrease - 24 hours
|
|
float fDuration = PHS_GetDuration(PHS_HOURS, 24, nMetaMagic);
|
|
|
|
// Declare effects
|
|
effect eDur = EffectVisualEffect(VFX_DUR_ENTANGLE);
|
|
effect eSpeed = EffectMovementSpeedDecrease(50);
|
|
|
|
// Link eDur and eSpeed
|
|
effect eLink = EffectLinkEffects(eDur, eSpeed);
|
|
|
|
// Note: Make eLink supernatural. Dispel cannot affect it (but as it is only
|
|
// 24 hours, rest should remove it).
|
|
eLink = SupernaturalEffect(eLink);
|
|
|
|
// Start cycling through the AOE Object for viable targets
|
|
oTarget = GetFirstInPersistentObject(OBJECT_SELF, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
// PvP check
|
|
if(!GetIsReactionTypeFriendly(oTarget, oCaster))
|
|
{
|
|
// Get the distance traveled.
|
|
lPrevious = GetLocalLocation(oTarget, sLocal);
|
|
// Get current location
|
|
lNew = GetLocation(oTarget);
|
|
|
|
// Must be same area, this location and what is set.
|
|
if(GetAreaFromLocation(lPrevious) != oArea)
|
|
{
|
|
// Not same area - we set new location on them
|
|
SetLocalLocation(oTarget, sLocal, lNew);
|
|
}
|
|
else
|
|
{
|
|
// Same area - we can do damage
|
|
|
|
// Check distance.
|
|
fDistance = GetDistanceBetweenLocations(lPrevious, lNew);
|
|
|
|
// Must be at least 1M distance, else, we will just keep old
|
|
// location.
|
|
if(fDistance >= 1.0)
|
|
{
|
|
// Fire cast spell at event for the affected target
|
|
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_SPIKE_GROWTH);
|
|
|
|
// Set new location
|
|
SetLocalLocation(oTarget, sLocal, lNew);
|
|
|
|
// Change the distance to an integer (so it will round)
|
|
nDice = FloatToInt(fDistance);
|
|
|
|
// Get a very small delay
|
|
fDelay = PHS_GetRandomDelay(0.1, 0.5);
|
|
|
|
// This is one of the very few AOE spells which allow Spell Resistance.
|
|
if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
|
|
{
|
|
// Get damage
|
|
nDamage = PHS_MaximizeOrEmpower(4, nDice, nMetaMagic);
|
|
|
|
// Reflex Save
|
|
nDamage = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, nDamage, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_NONE, oCaster, fDelay);
|
|
|
|
if(nDamage > 0)
|
|
{
|
|
// Apply damage and visuals
|
|
DelayCommand(fDelay, PHS_ApplyDamageToObject(oTarget, nDamage, DAMAGE_TYPE_PIERCING));
|
|
|
|
// Apply reduction in speed for 24 hours
|
|
// * Remove previous too
|
|
// * Also note: Applied instantly, to prevent errors.
|
|
PHS_RemoveSpecificEffectFromSpell(EFFECT_TYPE_MOVEMENT_SPEED_DECREASE, PHS_SPELL_SPIKE_GROWTH, oTarget, SUBTYPE_IGNORE);
|
|
PHS_ApplyDuration(oTarget, eLink, fDuration);
|
|
}
|
|
}
|
|
}
|
|
//else
|
|
//{
|
|
// There is NOT 1M difference between locations, so we
|
|
// just use old location, and set nothing.
|
|
//}
|
|
}
|
|
}
|
|
//Get next target.
|
|
oTarget = GetNextInPersistentObject(OBJECT_SELF, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|