The program compiled when the SpellIsTarget() function was commented out but it still did not work right in play. (It was healing my enemies as well as my allies.) However I moved the healing function outside of the SpellIsTarget() function and it does seem to be sort-of working. I still need to test further. I hope it does not heal the enemies as well.
#include "nw_i0_spells"
#include "nwn2_inc_spells"
#include "x2_inc_spellhook"
const int SPIRIT_ANCIENT = 1612;
int kL_GetIsEffectBad(effect eEffect);
void main()
{
if (!X2PreSpellCastCode())
{
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
return;
}
object oCaster = OBJECT_SELF;// = ; defn
location lCaster = GetLocation(oCaster);
effect eEffect;
int iCasterLvl = GetLevelByClass(64, OBJECT_SELF);
int iHeal = (iCasterLvl/4);
int iHeal1 = d8(iHeal);
effect eVis = EffectVisualEffect( VFX_IMP_HEALING_M );
effect eHeal2 = EffectHeal((iHeal1)+(iCasterLvl*2));
eHeal2 = SupernaturalEffect(eHeal2);
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lCaster); // 10' circle
while (GetIsObjectValid(oTarget))
{
if (spellsIsTarget(oTarget, SPELL_TARGET_ALLALLIES, oCaster))
{
eEffect = GetFirstEffect(oTarget);
while (GetIsEffectValid(eEffect))
{
if (kL_GetIsEffectBad(eEffect))
{
RemoveEffect(oTarget, eEffect);
eEffect = GetFirstEffect(oTarget); // remove linked effects safely.
}
else
eEffect = GetNextEffect(oTarget);
}
}
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eHeal2, oTarget);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lCaster);
}
}
// Returns TRUE if an effect is bad.
int kL_GetIsEffectBad(effect eEffect)
{
int iType = GetEffectType(eEffect);
if (iType == EFFECT_TYPE_ABILITY_DECREASE
|| iType == EFFECT_TYPE_AC_DECREASE
|| iType == EFFECT_TYPE_ARCANE_SPELL_FAILURE
|| iType == EFFECT_TYPE_AMORPENALTYINC
|| iType == EFFECT_TYPE_ATTACK_DECREASE
|| iType == EFFECT_TYPE_BLINDNESS
|| iType == EFFECT_TYPE_CHARMED
|| iType == EFFECT_TYPE_CONCEALMENT_NEGATED
|| iType == EFFECT_TYPE_CONFUSED
|| iType == EFFECT_TYPE_CURSE
|| iType == EFFECT_TYPE_CUTSCENE_PARALYZE
|| iType == EFFECT_TYPE_CUTSCENEGHOST
|| iType == EFFECT_TYPE_CUTSCENEIMMOBILIZE
|| iType == EFFECT_TYPE_DAMAGE_DECREASE
|| iType == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE
|| iType == EFFECT_TYPE_DAMAGE_REDUCTION_NEGATED
|| iType == EFFECT_TYPE_DARKNESS
|| iType == EFFECT_TYPE_DAZED
|| iType == EFFECT_TYPE_DEAF
|| iType == EFFECT_TYPE_DISEASE
|| iType == EFFECT_TYPE_DOMINATED
|| iType == EFFECT_TYPE_ENEMY_ATTACK_BONUS
|| iType == EFFECT_TYPE_ENTANGLE
|| iType == EFFECT_TYPE_FRIGHTENED
|| iType == EFFECT_TYPE_INSANE
|| iType == EFFECT_TYPE_JARRING
|| iType == EFFECT_TYPE_MESMERIZE
|| iType == EFFECT_TYPE_MISS_CHANCE
|| iType == EFFECT_TYPE_MOVEMENT_SPEED_DECREASE
|| iType == EFFECT_TYPE_NEGATIVELEVEL
|| iType == EFFECT_TYPE_PARALYZE
|| iType == EFFECT_TYPE_PETRIFY
|| iType == EFFECT_TYPE_POISON
|| iType == EFFECT_TYPE_POLYMORPH
|| iType == EFFECT_TYPE_SAVING_THROW_DECREASE
|| iType == EFFECT_TYPE_SILENCE
|| iType == EFFECT_TYPE_SKILL_DECREASE
|| iType == EFFECT_TYPE_SLEEP
|| iType == EFFECT_TYPE_SLOW
|| iType == EFFECT_TYPE_SPELL_FAILURE
|| iType == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE
|| iType == EFFECT_TYPE_STUNNED
|| iType == EFFECT_TYPE_SWARM
|| iType == EFFECT_TYPE_TURNED
|| iType == EFFECT_TYPE_WOUNDING)
{
return TRUE;
}
return FALSE;
}
Please advise if you can forsee any problems with this possible solution.