Further file organization
Further file organization
This commit is contained in:
88
nwn/nwnprc/trunk/newspellbook/inv_dra_endrexp.nss
Normal file
88
nwn/nwnprc/trunk/newspellbook/inv_dra_endrexp.nss
Normal file
@@ -0,0 +1,88 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Name Endure Exposure
|
||||
//:: FileName inv_dra_endrexp.nss
|
||||
//::///////////////////////////////////////////////
|
||||
/*
|
||||
|
||||
Least Invocation
|
||||
3rd Level Spell
|
||||
|
||||
With a touch, you grant a creature (or yourself)
|
||||
the ability to withstand hot or cold environments,
|
||||
but doesn't protect against actual fire or cold
|
||||
damage. In addition, the target is immune to your
|
||||
breath weapon's effects. This invocation lasts for
|
||||
24 hours.
|
||||
|
||||
*/
|
||||
//::///////////////////////////////////////////////
|
||||
|
||||
#include "inv_inc_invfunc"
|
||||
#include "inv_invokehook"
|
||||
|
||||
void DispelMonitor(object oCaster, object oTarget, int nSpellID);
|
||||
|
||||
void main()
|
||||
{
|
||||
if (!PreInvocationCastCode()) return;
|
||||
|
||||
object oCaster = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nCasterLevel = GetInvokerLevel(oCaster, GetInvokingClass());
|
||||
int bValid = FALSE;
|
||||
int nBPIndex = 0;
|
||||
int nBPTIndex = 0;
|
||||
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_ELEMENTAL_PROTECTION);
|
||||
|
||||
//Add to array on target of breaths they're protected from
|
||||
|
||||
if(!array_exists(oTarget, "BreathProtected"))
|
||||
array_create(oTarget, "BreathProtected");
|
||||
|
||||
while(!bValid)
|
||||
{
|
||||
//find the first empty spot and add it
|
||||
if(array_get_object(oTarget, "BreathProtected", nBPIndex) == OBJECT_INVALID)
|
||||
{
|
||||
array_set_object(oTarget, "BreathProtected", nBPIndex, oCaster);
|
||||
bValid = TRUE;
|
||||
}
|
||||
else
|
||||
nBPIndex++;
|
||||
}
|
||||
|
||||
//add to array on caster of targets protected by their spell for resting cleanup
|
||||
|
||||
if(!array_exists(oCaster, "BreathProtectTargets"))
|
||||
array_create(oCaster, "BreathProtectTargets");
|
||||
|
||||
while(!bValid)
|
||||
{
|
||||
//find the first empty spot and add it
|
||||
if(array_get_object(oCaster, "BreathProtectTargets", nBPTIndex) == OBJECT_INVALID)
|
||||
{
|
||||
array_set_object(oCaster, "BreathProtectTargets", nBPTIndex, oTarget);
|
||||
if(DEBUG) DoDebug("Storing target: " + GetName(array_get_object(oCaster, "BreathProtectTargets", nBPTIndex)));
|
||||
bValid = TRUE;
|
||||
}
|
||||
else
|
||||
nBPTIndex++;
|
||||
}
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
||||
DispelMonitor(oCaster, oTarget, INVOKE_ENDURE_EXPOSURE);
|
||||
}
|
||||
|
||||
void DispelMonitor(object oCaster, object oTarget, int nSpellID)
|
||||
{
|
||||
// Has the power ended since the last beat, or does the duration run out now
|
||||
if(PRCGetDelayedSpellEffectsExpired(nSpellID, oTarget, oCaster))
|
||||
{
|
||||
if(DEBUG) DoDebug("inv_dra_endexp: The protection effect has been removed");
|
||||
array_delete(oCaster, "BreathProtected");
|
||||
DeleteLocalInt(oCaster, "DragonWard");
|
||||
}
|
||||
else
|
||||
DelayCommand(6.0f, DispelMonitor(oCaster, oTarget, nSpellID));
|
||||
}
|
Reference in New Issue
Block a user