forked from Jaysyn/PRC8
133 lines
4.7 KiB
Plaintext
133 lines
4.7 KiB
Plaintext
|
/*:://////////////////////////////////////////////
|
|||
|
//:: Spell Name Dancing Lights
|
|||
|
//:: Spell FileName sp_Danclight
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:: In Game Spell desctiption
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
Dancing Lights
|
|||
|
Evocation [Light]
|
|||
|
Level: Brd 0, Sor/Wiz 0
|
|||
|
Components: V, S
|
|||
|
Casting Time: 1 standard action
|
|||
|
Range: Medium (100 ft. + 10 ft./level)
|
|||
|
Effect: Up to four lights, all within a 10-ft.-radius area
|
|||
|
Duration: 1 minute (D)
|
|||
|
Saving Throw: None
|
|||
|
Spell Resistance: No
|
|||
|
|
|||
|
You create up to four glowing spheres of light (which look like will-o<>-wisps).
|
|||
|
The dancing lights must stay within a 10-foot-radius area in relation to each
|
|||
|
other. A light winks out if the distance between you and it
|
|||
|
exceeds the spell<6C>s range.
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:: Spell Effects Applied / Notes
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
Gone for the wisp version.
|
|||
|
|
|||
|
4 wisps, with ghost effect, which stay around the caster if they can,
|
|||
|
each 1.5M from the caster in each direction (each gets a set direction).
|
|||
|
|
|||
|
The distance thing easily works as dimension door, and suchlike, could be
|
|||
|
used.
|
|||
|
|
|||
|
Oh, and why have tihs instead of the longer duration "light"? well, basically,
|
|||
|
it is a lot more light :-) but only 1 minute's worth (or 2 extended)
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:: Created By: Jasperre
|
|||
|
//::////////////////////////////////////////////*/
|
|||
|
|
|||
|
#include "prc_inc_spells"
|
|||
|
|
|||
|
void DestroyLights(object oTarget)
|
|||
|
{
|
|||
|
MyDestroyObject(GetLocalObject(oTarget, "DANCING_LIGHT"));
|
|||
|
MyDestroyObject(GetLocalObject(oTarget, "DANCING_LIGHT_SET1"));
|
|||
|
MyDestroyObject(GetLocalObject(oTarget, "DANCING_LIGHT_SET2"));
|
|||
|
MyDestroyObject(GetLocalObject(oTarget, "DANCING_LIGHT_SET3"));
|
|||
|
MyDestroyObject(GetLocalObject(oTarget, "DANCING_LIGHT_SET4"));
|
|||
|
}
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
if(!X2PreSpellCastCode()) return;
|
|||
|
|
|||
|
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
|||
|
|
|||
|
//Declare major variables
|
|||
|
object oCaster = OBJECT_SELF;
|
|||
|
object oTarget = PRCGetSpellTargetObject();
|
|||
|
object oLight;
|
|||
|
location lTarget;
|
|||
|
string sResRef;
|
|||
|
|
|||
|
int bTargeted = FALSE;
|
|||
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|||
|
float fDuration = TurnsToSeconds(1); // Duration is 1 minute
|
|||
|
if(nMetaMagic & METAMAGIC_EXTEND)
|
|||
|
fDuration *= 2;
|
|||
|
|
|||
|
// Declare effect for the caster to check for and the light effect
|
|||
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|||
|
effect eLight = EffectVisualEffect(VFX_DUR_LIGHT_WHITE_20);
|
|||
|
eLight = EffectLinkEffects(eLight, EffectVisualEffect(VFX_DUR_GLOW_LIGHT_BLUE));
|
|||
|
eLight = EffectLinkEffects(eLight, EffectCutsceneGhost());
|
|||
|
eLight = SupernaturalEffect(eLight);
|
|||
|
|
|||
|
if(GetIsObjectValid(oTarget))
|
|||
|
bTargeted = TRUE;
|
|||
|
else
|
|||
|
oTarget = oCaster;
|
|||
|
|
|||
|
lTarget = bTargeted ? GetLocation(oTarget) : PRCGetSpellTargetLocation();
|
|||
|
|
|||
|
// Remove previous castings
|
|||
|
PRCRemoveEffectsFromSpell(oTarget, SPELL_DANCING_LIGHTS);
|
|||
|
DestroyLights(oTarget);
|
|||
|
|
|||
|
// Signal Event
|
|||
|
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_DANCING_LIGHTS, FALSE));
|
|||
|
|
|||
|
// New eDur effect on you
|
|||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, fDuration);
|
|||
|
|
|||
|
if(bTargeted)
|
|||
|
{
|
|||
|
sResRef = "prc_danclights";
|
|||
|
string DANCING_LIGHT_SET = "DANCING_LIGHT_SET";
|
|||
|
int nCnt;
|
|||
|
|
|||
|
// Create the 4 creatures (and set them in locals)
|
|||
|
for(nCnt = 1; nCnt <= 4; nCnt++)
|
|||
|
{
|
|||
|
// Create the light
|
|||
|
oLight = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lTarget);
|
|||
|
// Set local on target (self)
|
|||
|
SetLocalObject(oTarget, DANCING_LIGHT_SET + IntToString(nCnt), oLight);
|
|||
|
// Set local on light for caster
|
|||
|
SetLocalObject(oLight, "Caster", oCaster);
|
|||
|
// Set local on light for target object
|
|||
|
SetLocalObject(oLight, "Target", oTarget);
|
|||
|
// Set local for the light number (1 = north, Etc, see "C" script)
|
|||
|
SetLocalInt(oLight, DANCING_LIGHT_SET, nCnt);
|
|||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oLight);
|
|||
|
SetPlotFlag(oLight, TRUE);
|
|||
|
// Force first heartbeat
|
|||
|
ExecuteScript("sp_danclightcs", oLight);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
sResRef = "prc_danclighth";
|
|||
|
oLight = CreateObject(OBJECT_TYPE_CREATURE, sResRef, lTarget);
|
|||
|
SetLocalObject(oLight, "Caster", oCaster);
|
|||
|
SetLocalObject(oCaster, "DANCING_LIGHT", oLight);
|
|||
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLight, oLight);
|
|||
|
SetPlotFlag(oLight, TRUE);
|
|||
|
// Force first heartbeat
|
|||
|
ExecuteScript("sp_danclightch", oLight);
|
|||
|
AssignCommand(oLight, ActionRandomWalk());
|
|||
|
}
|
|||
|
|
|||
|
PRCSetSchool();
|
|||
|
}
|