forked from Jaysyn/PRC8
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.
77 lines
2.7 KiB
Plaintext
77 lines
2.7 KiB
Plaintext
#include "x2_inc_spellhook"
|
|
#include "prc_inc_sp_tch"
|
|
|
|
/*
|
|
* This is the spellhook code, called when the Arcane Fire feat is activated
|
|
* Turns the spell into an arcane fire
|
|
*/
|
|
void main()
|
|
{
|
|
//Declare major variables ( fDist / (3.0f * log( fDist ) + 2.0f) )
|
|
object oTarget = GetLocalObject(OBJECT_SELF, "arcane_fire_target");
|
|
int nCasterLvl = GetLevelByClass(CLASS_TYPE_ARCHMAGE, OBJECT_SELF);
|
|
int nDamage = 0;
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nCnt;
|
|
effect eMissile = EffectVisualEffect(VFX_IMP_MIRV);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_MAGBLUE);
|
|
float fDist = GetDistanceBetween(OBJECT_SELF, oTarget);
|
|
float fDelay = fDist/(3.0 * log(fDist) + 2.0);
|
|
float fDelay2, fTime;
|
|
string nSpellLevel = lookup_spell_level(PRCGetSpellId());
|
|
|
|
/* Whatever happens next we must restore the hook */
|
|
PRCSetUserSpecificSpellScript(GetLocalString(OBJECT_SELF, "archmage_save_overridespellscript"));
|
|
|
|
/* Tell to not execute the original spell */
|
|
PRCSetUserSpecificSpellScriptFinished();
|
|
|
|
/* Allow to use it once again */
|
|
SetLocalInt(OBJECT_SELF, "arcane_fire_active", 0);
|
|
|
|
/* Paranoia -- should never happen */
|
|
if (!GetHasFeat(FEAT_ARCANE_FIRE, OBJECT_SELF)) return;
|
|
|
|
/* Only wizard/sorc spells */
|
|
if (nSpellLevel == "")
|
|
{
|
|
FloatingTextStringOnCreature("Arcane Fire can only consume arcane spells.", OBJECT_SELF, FALSE);
|
|
return;
|
|
}
|
|
|
|
/* No item casting */
|
|
if (GetIsObjectValid(GetSpellCastItem()))
|
|
{
|
|
FloatingTextStringOnCreature("Arcane Fire may not be used with scrolls.", OBJECT_SELF, FALSE);
|
|
return;
|
|
}
|
|
|
|
if(!GetIsReactionTypeFriendly(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_MAGIC_MISSILE));
|
|
|
|
//Make ranged touch attack check
|
|
if (PRCDoRangedTouchAttack(oTarget))
|
|
{
|
|
//Roll damage
|
|
int nDam = d6(nCasterLvl + StringToInt(nSpellLevel));
|
|
|
|
fTime = fDelay;
|
|
fDelay2 += 0.1;
|
|
fTime += fDelay2;
|
|
|
|
//Set damage effect
|
|
effect eDam = EffectDamage(nDam, DAMAGE_TYPE_MAGICAL);
|
|
//Apply the MIRV and damage effect
|
|
DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
|
DelayCommand(fTime, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget));
|
|
DelayCommand(fDelay2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget));
|
|
}
|
|
else
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget);
|
|
}
|
|
}
|
|
}
|