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.
171 lines
6.5 KiB
Plaintext
171 lines
6.5 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Invocation Hook File.
|
|
//:: inv_invokehook.nss
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
This file acts as a hub for all code that
|
|
is hooked into the invocation scripts
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Fox
|
|
//:: Created On: 25-1-2008
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_inc_spells"
|
|
#include "inv_inc_invfunc"
|
|
#include "x2_inc_spellhook"
|
|
|
|
// This function holds all functions that are supposed to run before the actual
|
|
// spellscript gets run. If this functions returns FALSE, the spell is aborted
|
|
// and the spellscript will not run
|
|
int PreInvocationCastCode();
|
|
|
|
// All invocations have somatic component so we will roll ASF check here
|
|
int InvocationASFCheck(object oInvoker, int nClass)
|
|
{
|
|
int nASF = GetArcaneSpellFailure(oInvoker);
|
|
|
|
// Warlocks ignore ASF chance while casting in light armor
|
|
if(nClass == CLASS_TYPE_WARLOCK)
|
|
{
|
|
object oArmor = GetItemInSlot(INVENTORY_SLOT_CHEST, oInvoker);
|
|
int nAC = GetBaseAC(oArmor);
|
|
|
|
//armors
|
|
switch(nAC)
|
|
{
|
|
case 1: nASF -= 5; break;//light
|
|
case 2: nASF -= 10; break;//light
|
|
case 3: nASF -= 20; break;//light
|
|
case 4: nASF -= GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 20 : 0; break;//medium;
|
|
case 5: nASF -= GetHasFeat(FEAT_BATTLE_CASTER, oInvoker) ? 30 : 0; break;//medium
|
|
default: break;
|
|
}
|
|
}
|
|
else if(nClass == CLASS_TYPE_DRAGON_SHAMAN)
|
|
{
|
|
//no ASF chance
|
|
return TRUE;
|
|
}
|
|
|
|
if(Random(100) < nASF)
|
|
{
|
|
//52946 = Spell failed due to arcane spell failure!
|
|
FloatingTextStrRefOnCreature(52946, oInvoker, FALSE);
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// if FALSE is returned by this function, the spell will not be cast
|
|
// the order in which the functions are called here DOES MATTER, changing it
|
|
// WILL break the crafting subsystems
|
|
//------------------------------------------------------------------------------
|
|
int PreInvocationCastCode()
|
|
{
|
|
object oInvoker = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
object oCastItem = GetSpellCastItem();
|
|
int nInvokeId = PRCGetSpellId();
|
|
int nInvokingClass = GetInvokingClass(oInvoker);
|
|
int nInvokeLevel = GetInvocationLevel(oInvoker);
|
|
int bInvokeIsHostile = Get2DACache("spells", "HostileSetting", nInvokeId) == "1";
|
|
|
|
int nContinue = !ExecuteScriptAndReturnInt("prespellcode", oInvoker);
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Break any spell require maintaining concentration
|
|
//---------------------------------------------------------------------------
|
|
X2BreakConcentrationSpells();
|
|
|
|
//---------------------------------------------------------------------------
|
|
// No invoking while using expertise
|
|
//---------------------------------------------------------------------------
|
|
if(nContinue)
|
|
if (GetActionMode(oInvoker, ACTION_MODE_EXPERTISE) || GetActionMode(oInvoker, ACTION_MODE_IMPROVED_EXPERTISE))
|
|
nContinue = FALSE;
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Check for PRC spell effects
|
|
//---------------------------------------------------------------------------
|
|
if(nContinue)
|
|
nContinue = PRCSpellEffects(oInvoker, oTarget, nInvokeId, nInvokeLevel, nInvokingClass, bInvokeIsHostile, -1);
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Run Grappling Concentration Check
|
|
//---------------------------------------------------------------------------
|
|
if(nContinue)
|
|
nContinue = GrappleConc(oInvoker, nInvokeLevel);
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Run ASF Check
|
|
//---------------------------------------------------------------------------
|
|
if(nContinue)
|
|
nContinue = InvocationASFCheck(oInvoker, nInvokingClass);
|
|
|
|
//---------------------------------------------------------------------------
|
|
// This stuff is only interesting for player characters we assume that use
|
|
// magic device always works and NPCs don't use the crafting feats or
|
|
// sequencers anyway. Thus, any NON PC spellcaster always exits this script
|
|
// with TRUE (unless they are DM possessed or in the Wild Magic Area in
|
|
// Chapter 2 of Hordes of the Underdark.
|
|
//---------------------------------------------------------------------------
|
|
if(!GetIsPC(oInvoker)
|
|
&& !GetPRCSwitch(PRC_NPC_HAS_PC_SPELLCASTING))
|
|
{
|
|
if(!GetIsDMPossessed(oInvoker) && !GetLocalInt(GetArea(oInvoker), "X2_L_WILD_MAGIC"))
|
|
{
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Run use magic device skill check
|
|
//---------------------------------------------------------------------------
|
|
if(nContinue)
|
|
{
|
|
nContinue = X2UseMagicDeviceCheck(oInvoker);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
// run any user defined spellscript here
|
|
//-----------------------------------------------------------------------
|
|
if (nContinue)
|
|
{
|
|
nContinue = X2RunUserDefinedSpellScript();
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
// Check for the new restricted itemproperties
|
|
//---------------------------------------------------------------------------
|
|
if(nContinue
|
|
&& GetIsObjectValid(oCastItem)
|
|
&& !CheckPRCLimitations(oCastItem, oInvoker))
|
|
{
|
|
SendMessageToPC(oInvoker, "You cannot use "+GetName(oCastItem));
|
|
nContinue = FALSE;
|
|
}
|
|
|
|
//Cleaning spell variables used for holding the charge
|
|
if(!GetLocalInt(oInvoker, "PRC_SPELL_EVENT"))
|
|
{
|
|
DeleteLocalInt(oInvoker, "PRC_SPELL_CHARGE_COUNT");
|
|
DeleteLocalInt(oInvoker, "PRC_SPELL_CHARGE_SPELLID");
|
|
DeleteLocalObject(oInvoker, "PRC_SPELL_CONC_TARGET");
|
|
DeleteLocalInt(oInvoker, "PRC_SPELL_METAMAGIC");
|
|
DeleteLocalManifestation(oInvoker, "PRC_POWER_HOLD_MANIFESTATION");
|
|
DeleteLocalMystery(oInvoker, "MYST_HOLD_MYST");
|
|
}
|
|
else if(GetLocalInt(oInvoker, "PRC_SPELL_CHARGE_SPELLID") != nInvokeId)
|
|
{ //Sanity check, in case something goes wrong with the action queue
|
|
DeleteLocalInt(oInvoker, "PRC_SPELL_EVENT");
|
|
}
|
|
|
|
return nContinue;
|
|
}
|
|
|