Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
174 lines
9.4 KiB
Plaintext
174 lines
9.4 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Symbol of **** : On Enter
|
|
//:: sp_symbola.nss
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
This script triggers the Symbol effect.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//#include "inc_target_list"
|
|
#include "prc_inc_spells"
|
|
#include "prc_add_spell_dc"
|
|
|
|
void ApplySymbolEffect(object oSymbol, object oCreator);
|
|
|
|
void main()
|
|
{
|
|
object oSymbol = OBJECT_SELF;
|
|
object oCreator = GetAreaOfEffectCreator(oSymbol);
|
|
|
|
if(!GetIsObjectValid(oCreator) || !GetLocalInt(oSymbol, "PRC_Symbol_HP_Limit"))
|
|
{
|
|
DestroyObject(oSymbol);
|
|
return;
|
|
}
|
|
|
|
if(GetIsEnemy(GetEnteringObject(), oCreator))
|
|
ApplySymbolEffect(oSymbol, oCreator);
|
|
}
|
|
|
|
void ApplySymbolEffect(object oSymbol, object oCreator)
|
|
{
|
|
int nSpellID = GetLocalInt(oSymbol, "X2_AoE_SpellID");
|
|
int nCasterLvl = GetLocalInt(oSymbol, "X2_AoE_Caster_Level");
|
|
int nMetaMagic = GetLocalInt(oSymbol, "PRC_Symbol_Metamagic");
|
|
int nPenetr = SPGetPenetrAOE(oCreator, nCasterLvl);
|
|
location lTarget = GetLocation(oSymbol);
|
|
float fDist = FeetToMeters(60.0);
|
|
float fDelay, fDuration;
|
|
int nHPLimit;
|
|
effect eSymbol;
|
|
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_MIND), GetLocation(oSymbol));//VFX_FNF_HOWL_ODD
|
|
|
|
// make a list of valid targets
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fDist, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
// Enemy & can see the symbol
|
|
if(GetIsEnemy(oTarget, oCreator) && !PRCGetHasEffect(EFFECT_TYPE_BLINDNESS, oTarget))
|
|
{
|
|
AddToTargetList(oTarget, oSymbol, INSERTION_BIAS_DISTANCE);
|
|
}
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fDist, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
|
|
// apply symbol effect
|
|
oTarget = GetTargetListHead(oSymbol);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
nHPLimit = GetLocalInt(oSymbol, "PRC_Symbol_HP_Limit");
|
|
if(nHPLimit == -1 || nHPLimit >= GetCurrentHitPoints(oTarget))
|
|
{
|
|
SignalEvent(oTarget, EventSpellCastAt(oCreator, nSpellID));
|
|
|
|
// SR check
|
|
fDelay = PRCGetRandomDelay();
|
|
if(!PRCDoResistSpell(oCreator, oTarget, nPenetr, fDelay))
|
|
{
|
|
if(nSpellID == SPELL_SYMBOL_OF_DEATH)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_DEATH, oCreator, fDelay))
|
|
{
|
|
nHPLimit -= GetCurrentHitPoints(oTarget);
|
|
SetLocalInt(oSymbol, "PRC_Symbol_HP_Limit", nHPLimit);
|
|
|
|
DeathlessFrenzyCheck(oTarget);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DEATH), oTarget));
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_FEAR)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_FEAR, oCreator, fDelay))
|
|
{
|
|
nHPLimit -= GetCurrentHitPoints(oTarget);
|
|
SetLocalInt(oSymbol, "PRC_Symbol_HP_Limit", nHPLimit);
|
|
|
|
eSymbol = EffectLinkEffects(EffectFrightened(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR));
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
|
|
fDuration = RoundsToSeconds(nCasterLvl);
|
|
if(nMetaMagic & METAMAGIC_EXTEND) fDuration *= 2;
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSymbol, oTarget, fDuration));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_FEAR_S), oTarget));
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_STUNING)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_MIND_SPELLS, oCreator, fDelay))
|
|
{
|
|
nHPLimit -= GetCurrentHitPoints(oTarget);
|
|
SetLocalInt(oSymbol, "PRC_Symbol_HP_Limit", nHPLimit);
|
|
|
|
eSymbol = EffectLinkEffects(EffectStunned(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED));
|
|
fDuration = RoundsToSeconds(d6());
|
|
if(nMetaMagic & METAMAGIC_EXTEND) fDuration *= 2;
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSymbol, oTarget, fDuration));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_STUN), oTarget));
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_INSANITY)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_MIND_SPELLS, oCreator, fDelay))
|
|
{
|
|
eSymbol = EffectLinkEffects(PRCEffectConfused(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED));
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
|
|
eSymbol = SupernaturalEffect(eSymbol);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eSymbol, oTarget));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_CONFUSION_S), oTarget));
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_PAIN)
|
|
{
|
|
if(PRCGetIsAliveCreature(oTarget))
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_EVIL, oCreator, fDelay))
|
|
{
|
|
eSymbol = EffectLinkEffects(EffectAttackDecrease(4), EffectSavingThrowDecrease(SAVING_THROW_ALL, 4));
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectSkillDecrease(SKILL_ALL_SKILLS, 4));
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
|
|
fDuration = HoursToSeconds(1);
|
|
if(nMetaMagic & METAMAGIC_EXTEND) fDuration *= 2;
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSymbol, oTarget, fDuration));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_DOOM), oTarget));
|
|
}
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_PERSUASION)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_MIND_SPELLS, oCreator, fDelay))
|
|
{
|
|
eSymbol = PRCGetScaledEffect(EffectCharmed(), oTarget);
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE));
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
|
|
fDuration = HoursToSeconds(nCasterLvl);
|
|
if(nMetaMagic & METAMAGIC_EXTEND) fDuration *= 2;
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSymbol, oTarget, fDuration));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_CHARM), oTarget));
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_SLEEP)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_MIND_SPELLS, oCreator, fDelay))
|
|
{
|
|
eSymbol = EffectLinkEffects(EffectSleep(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE));
|
|
eSymbol = EffectLinkEffects(eSymbol, EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));
|
|
fDuration = TurnsToSeconds(d6(3) * 10);
|
|
if(nMetaMagic & METAMAGIC_EXTEND) fDuration *= 2;
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSymbol, oTarget, fDuration));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SLEEP), oTarget));
|
|
}
|
|
}
|
|
else if(nSpellID == SPELL_SYMBOL_OF_WEAKNESS)
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, PRCGetSaveDC(oTarget, oCreator), SAVING_THROW_TYPE_SPELL, oCreator, fDelay))
|
|
{
|
|
DelayCommand(fDelay, ApplyAbilityDamage(oTarget, ABILITY_STRENGTH, d6(3), DURATION_TYPE_PERMANENT, TRUE, 0.0f, TRUE, oCreator));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE), oTarget));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetTargetListHead(oSymbol);
|
|
}
|
|
} |