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.
112 lines
4.6 KiB
Plaintext
112 lines
4.6 KiB
Plaintext
#include "tob_inc_tobfunc"
|
|
|
|
int GetIsSupernaturalCurse(effect eEff)
|
|
{
|
|
return GetTag(GetEffectCreator(eEff)) == "q6e_ShaorisFellTemple";
|
|
}
|
|
|
|
void DoReform(object oPC)
|
|
{
|
|
int nType, nSubType;
|
|
effect eBad = GetFirstEffect(oPC);
|
|
//Search for negative effects
|
|
while(GetIsEffectValid(eBad))
|
|
{
|
|
nType = GetEffectType(eBad);
|
|
if(nType == EFFECT_TYPE_ABILITY_DECREASE
|
|
|| nType == EFFECT_TYPE_BLINDNESS
|
|
|| nType == EFFECT_TYPE_DEAF
|
|
|| nType == EFFECT_TYPE_DISEASE
|
|
|| nType == EFFECT_TYPE_PARALYZE
|
|
|| nType == EFFECT_TYPE_POISON)
|
|
{
|
|
nSubType = GetEffectSubType(eBad);
|
|
//Remove effect if it is negative.
|
|
if(nSubType != SUBTYPE_EXTRAORDINARY
|
|
&& nSubType != SUBTYPE_SUPERNATURAL
|
|
&& !GetIsSupernaturalCurse(eBad))
|
|
RemoveEffect(oPC, eBad);
|
|
}
|
|
eBad = GetNextEffect(oPC);
|
|
}
|
|
|
|
int nHeal = GetMaxHitPoints(oPC) - GetCurrentHitPoints(oPC);
|
|
effect eHeal = EffectVisualEffect(VFX_IMP_HOLY_AID_DN_ORANGE);
|
|
eHeal = EffectLinkEffects(eHeal, EffectHeal(nHeal));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oPC);
|
|
|
|
effect eDaze = EffectDazed();
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDaze, oPC, 6.0);
|
|
}
|
|
|
|
void DoDeath(object oPC)
|
|
{
|
|
float fDur = RoundsToSeconds(d6(1));
|
|
|
|
effect eDeath = EffectLinkEffects(EffectCutsceneGhost(), EffectCutsceneParalyze());
|
|
eDeath = EffectLinkEffects(eDeath, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY));
|
|
eDeath = EffectLinkEffects(eDeath, EffectDamageImmunityAll());
|
|
eDeath = EffectLinkEffects(eDeath, EffectEthereal());
|
|
eDeath = EffectLinkEffects(eDeath, EffectSpellImmunity(SPELL_ALL_SPELLS));
|
|
eDeath = SupernaturalEffect(eDeath);
|
|
|
|
// Apply the effect
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDeath, oPC, fDur);
|
|
DelayCommand(fDur, DoReform(oPC));
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
location lTarget = GetLocation(oPC);
|
|
float fRange = FeetToMeters(20.0);
|
|
int nPenetr = PRCGetCasterLevel(oPC) + SPGetPenetr();
|
|
int nDamage;
|
|
|
|
//DoDebug("tob_jpm_emimmo: Calculating DC");
|
|
int nDC = 19 + GetAbilityScoreForClass(GetPrimaryArcaneClass(oPC), oPC);
|
|
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_FIREBALL), lTarget);
|
|
|
|
//Get first target in spell area
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, GetPosition(oPC));
|
|
//DoDebug("tob_jpm_emimmo: First target is: " + DebugObject2Str(oTarget));
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
//DoDebug("tob_jpm_emimmo: Is target friendly? " + IntToString(GetIsReactionTypeFriendly(oTarget)));
|
|
|
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oPC) && oTarget != oPC)
|
|
{
|
|
//DoDebug("tob_jpm_emimmo: Target is neutral or hostile");
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oPC, FEAT_JPM_EMERALD_IMMOLATION));
|
|
|
|
nDamage = PRCGetReflexAdjustedDamage(d6(20), oTarget, nDC, SAVING_THROW_TYPE_FIRE);
|
|
|
|
if(nDamage > 0)
|
|
{
|
|
//Make SR Check
|
|
if(!PRCDoResistSpell(oPC, oTarget, nPenetr))
|
|
{
|
|
if(MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER) // Are outsiders the only extraplanar?
|
|
{
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget);
|
|
}
|
|
}
|
|
//Do not add random delay to damage
|
|
//if damage is appled after EffectEthereal() it will remove it and all other DoDeath effects
|
|
effect eLink = EffectDamage(nDamage/2, DAMAGE_TYPE_FIRE);
|
|
eLink = EffectLinkEffects(eLink, EffectDamage(nDamage/2, DAMAGE_TYPE_MAGICAL));
|
|
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_IMP_FLAME_M));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
|
|
}
|
|
}
|
|
}
|
|
//Get next target in spell area
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE, GetPosition(oPC));
|
|
//DoDebug("tob_jpm_emimmo: Next target is: " + DebugObject2Str(oTarget));
|
|
}
|
|
DelayCommand(0.2, DoDeath(oPC));
|
|
} |