PRC8/nwn/nwnprc/trunk/newspellbook/tob_stsn_sftdef.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

79 lines
2.8 KiB
Plaintext

/*
----------------
Shifting Defense
tob_stsn_sftdef.nss
----------------
Sept 7 2018 by Stratovarius
Shifting Defense
Setting Sun (Stance)
Level: Swordsage 5
Initiation Action: 1 Swift Action
Range: Personal.
Target: You.
Duration: Stance.
The first time per round when an opponent hits you, you reset your position ten feet away from that opponent.
*/
#include "tob_inc_move"
#include "tob_movehook"
#include "prc_inc_combmove"
void main()
{
int nEvent = GetRunningEvent();
object oInitiator = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oInitiator);
// We're being called from the OnHit eventhook
if(nEvent == EVENT_ITEM_ONHIT)
{
oItem = GetSpellCastItem();
if(!GetHasSpellEffect(MOVE_SS_SHIFTING_DEFENSE, oInitiator)) // Clean up
{
// Clean Up - user needs to reactivate stance
oItem = GetLocalObject(oInitiator, "ShiftDefArm");
RemoveEventScript(oItem, EVENT_ITEM_ONHIT, "tob_stsn_sftdef", TRUE, FALSE);
RemoveSpecificProperty(oItem, ITEM_PROPERTY_ONHITCASTSPELL, IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 0, 1, "", -1, DURATION_TYPE_TEMPORARY);
return;
}
// find the target, if not already given
if (oTarget == OBJECT_INVALID)
oTarget = PRCGetSpellTargetObject(oInitiator);
if(DEBUG) DoDebug("tob_stsn_sftdef: OnHit:\n" + "oInitiator = " + DebugObject2Str(oInitiator) + "\n" + "oItem = " + DebugObject2Str(oItem) + "\n" + "oTarget = " + DebugObject2Str(oTarget) + "\n");
if (!GetLocalInt(oInitiator, "ShiftDefDelay"))
{
AssignCommand(oTarget, ClearAllActions(TRUE));
_DoBullRushKnockBack(oInitiator, oTarget, 10.0);
SetLocalInt(oInitiator, "ShiftDefDelay", TRUE);
DelayCommand(6.0f, DeleteLocalInt(oInitiator, "ShiftDefDelay")); // Once a round
}
}// end if - Running OnHit event
else if (!PreManeuverCastCode())
{
// If code within the PreManeuverCastCode (i.e. UMD) reports FALSE, do not run this spell
return;
}
else
{
struct maneuver move = EvaluateManeuver(oInitiator, oTarget);
if (move.bCanManeuver)
{
if (GetIsObjectValid(oItem)) // Legal items only
{
effect eDur = EffectVisualEffect(VFX_DUR_PROTECTION_EVIL_MINOR);
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, ExtraordinaryEffect(eDur), oInitiator);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
AddEventScript(oItem, EVENT_ITEM_ONHIT, "tob_stsn_sftdef", TRUE, FALSE);
SetLocalObject(oInitiator, "ShiftDefArm", oItem);
}
}
}
}