PRC8/nwn/nwnprc/trunk/include/psi_spellhook.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

212 lines
8.5 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Spell Hook Include File
//:: prc_psi_splhook
//:://////////////////////////////////////////////
/*
This file acts as a hub for all code that
is hooked into the psionic spellscripts
*/
//:://////////////////////////////////////////////
//:: Created By: Stratovarius
//:: Created On: 20-10-2004
//:://////////////////////////////////////////////
//#include "prc_x2_craft"
#include "x2_inc_spellhook"
#include "prc_inc_spells"
#include "inc_utility"
#include "prc_inc_itmrstr"
#include "psi_inc_psifunc"
// 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 PsiPrePowerCastCode();
//This function handles the "free swipe when manifesting" ability of the Diamond Dragon
void Dragonswipe()
{
object oPC = OBJECT_SELF;
// If claws are not activated, exit
if(!GetLocalInt(oPC, "DiamondClawsOn")) return;
object oTarget = PRCGetSpellTargetObject();
// Get the item used to cast the spell
object oItem = GetSpellCastItem();
// Clawswipes only work on powers manifested by the Diamond Dragon, not by items he uses.
if (oItem != OBJECT_INVALID)
{
FloatingTextStringOnCreature("You do not gain clawswipes from Items.", OBJECT_SELF, FALSE);
return;
}
effect eInvalid;
if(TakeSwiftAction(oPC))
{
//grab the closest enemy to swipe at
oTarget = GetNearestCreature(CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN, oPC, 1,
CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY);
if (oTarget != oPC && GetDistanceToObject(oTarget) < FeetToMeters(15.0))
{
object oClaw = GetItemInSlot(INVENTORY_SLOT_CWEAPON_R, oPC);
PerformAttack(oTarget, oPC, eInvalid, 0.0, 0, 0, DAMAGE_TYPE_SLASHING, "*Clawswipe Hit*", "*Clawswipe Missed*", FALSE, oClaw);
}
}
}
//------------------------------------------------------------------------------
// 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 PsiPrePowerCastCode()
{
object oManifester = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nPowerID = PRCGetSpellId();
int nPowerLevel = GetPowerLevel(oManifester);
int nManifestingClass = GetManifestingClass(oManifester);
int bPowerIsHostile = Get2DACache("spells", "HostileSetting", nPowerID) == "1";
int nContinue = !ExecuteScriptAndReturnInt("prespellcode", oManifester);
//---------------------------------------------------------------------------
// Break any spell require maintaining concentration
//---------------------------------------------------------------------------
X2BreakConcentrationSpells();
// Ectoplasmic Form conc check
if (GetLocalInt(oTarget, "PRC_Power_EctoForm"))
{
nContinue = GetIsSkillSuccessful(oManifester, SKILL_CONCENTRATION, (20 + nPowerLevel));
}
//---------------------------------------------------------------------------
// Run Disrupting Strike Check
//---------------------------------------------------------------------------
if (nContinue && GetLocalInt(oManifester, "DisruptingStrike_PsionicsFail"))
{
nContinue = FALSE;
}
//---------------------------------------------------------------------------
// Check for PRC spell effects
//---------------------------------------------------------------------------
if(nContinue)
nContinue = PRCSpellEffects(oManifester, oTarget, nPowerID, nPowerLevel, nManifestingClass, bPowerIsHostile, -1);
//---------------------------------------------------------------------------
// Run Grappling Concentration Check
//---------------------------------------------------------------------------
if (nContinue)
nContinue = GrappleConc(oManifester, nPowerLevel);
//---------------------------------------------------------------------------
// 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(oManifester)
&& !GetPRCSwitch(PRC_NPC_HAS_PC_SPELLCASTING))
{
if(!GetIsDMPossessed(oManifester) && !GetLocalInt(GetArea(oManifester), "X2_L_WILD_MAGIC"))
{
return TRUE;
}
}
if (nContinue)
{
//---------------------------------------------------------------------------
// Run use magic device skill check
//---------------------------------------------------------------------------
nContinue = X2UseMagicDeviceCheck(oManifester);
}
if (nContinue)
{
//-----------------------------------------------------------------------
// run any user defined spellscript here
//-----------------------------------------------------------------------
nContinue = X2RunUserDefinedSpellScript();
}
//---------------------------------------------------------------------------
// Check for the new restricted itemproperties
//---------------------------------------------------------------------------
if(nContinue
&& GetIsObjectValid(GetSpellCastItem())
&& !CheckPRCLimitations(GetSpellCastItem(), oManifester))
{
SendMessageToPC(oManifester, "You cannot use "+GetName(GetSpellCastItem()));
nContinue = FALSE;
}
//perform the clawswipe
Dragonswipe();
//---------------------------------------------------------------------------
// The following code is only of interest if an item was targeted
//---------------------------------------------------------------------------
if (GetIsObjectValid(oTarget) && GetObjectType(oTarget) == OBJECT_TYPE_ITEM)
{
//-----------------------------------------------------------------------
// Check if spell was used to trigger item creation feat
//-----------------------------------------------------------------------
if (nContinue) {
nContinue = !ExecuteScriptAndReturnInt("x2_pc_craft", oManifester);
}
//-----------------------------------------------------------------------
// * Execute item OnSpellCast At routing script if activated
//-----------------------------------------------------------------------
SetUserDefinedItemEventNumber(X2_ITEM_EVENT_SPELLCAST_AT);
//Tag-based PRC scripts first
int nRet = ExecuteScriptAndReturnInt("is_"+GetTag(oTarget), oManifester);
if(nRet == X2_EXECUTE_SCRIPT_END)
return FALSE;
if(GetModuleSwitchValue(MODULE_SWITCH_ENABLE_TAGBASED_SCRIPTS) == TRUE)
{
nRet = ExecuteScriptAndReturnInt(GetUserDefinedItemEventScriptName(oTarget), oManifester);
if(nRet == X2_EXECUTE_SCRIPT_END)
return FALSE;
}
//-----------------------------------------------------------------------
// Prevent any spell that has no special coding to handle targetting of items
// from being cast on items. We do this because we can not predict how
// all the hundreds spells in NWN will react when cast on items
//-----------------------------------------------------------------------
if (nContinue) {
nContinue = X2CastOnItemWasAllowed(oTarget);
}
}
//Cleaning spell variables used for holding the charge
if(!GetLocalInt(oManifester, "PRC_SPELL_EVENT"))
{
DeleteLocalInt(oManifester, "PRC_SPELL_CHARGE_COUNT");
DeleteLocalInt(oManifester, "PRC_SPELL_CHARGE_SPELLID");
DeleteLocalObject(oManifester, "PRC_SPELL_CONC_TARGET");
DeleteLocalInt(oManifester, "PRC_SPELL_METAMAGIC");
DeleteLocalManifestation(oManifester, "PRC_POWER_HOLD_MANIFESTATION");
DeleteLocalMystery(oManifester, "MYST_HOLD_MYST");
}
else if(GetLocalInt(oManifester, "PRC_SPELL_CHARGE_SPELLID") != PRCGetSpellId())
{ //Sanity check, in case something goes wrong with the action queue
DeleteLocalInt(oManifester, "PRC_SPELL_EVENT");
}
return nContinue;
}