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.
109 lines
3.6 KiB
Plaintext
109 lines
3.6 KiB
Plaintext
/*
|
|
----------------
|
|
Island of Blades
|
|
|
|
tob_sdhd_islebld.nss
|
|
----------------
|
|
|
|
01/04/07 by Stratovarius
|
|
*/ /** @file
|
|
|
|
Island of Blades
|
|
|
|
Shadow Hand (Stance)
|
|
Level: Swordsage 1
|
|
Initiation Action: 1 Swift Action
|
|
Range: Personal.
|
|
Target: You.
|
|
Duration: Stance.
|
|
|
|
You cloak yourself in a swirling nimbus of shadow energy. These shadows spin
|
|
and flow around you, preventing any creature near you from being able to
|
|
anticipate your attacks.
|
|
|
|
If both you and an ally are in melee range of the same creature, you gain a
|
|
+2 bonus to attack rolls.
|
|
*/
|
|
|
|
#include "prc_inc_combat"
|
|
#include "tob_inc_move"
|
|
#include "tob_movehook"
|
|
|
|
void DoMeleeRangeCheck(object oPC, int nMoveId);
|
|
|
|
void main()
|
|
{
|
|
if (!PreManeuverCastCode())
|
|
{
|
|
// If code within the PreManeuverCastCode (i.e. UMD) reports FALSE, do not run this spell
|
|
return;
|
|
}
|
|
|
|
// End of Spell Cast Hook
|
|
|
|
object oInitiator = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
struct maneuver move = EvaluateManeuver(oInitiator, oTarget);
|
|
|
|
if(move.bCanManeuver)
|
|
{
|
|
// Apply a marker effect
|
|
effect eLink = ExtraordinaryEffect(EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
|
|
if (GetHasDefensiveStance(oInitiator, DISCIPLINE_SHADOW_HAND))
|
|
eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_ALL, 2, SAVING_THROW_TYPE_ALL));
|
|
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
|
|
|
|
DoMeleeRangeCheck(oInitiator, move.nMoveId);
|
|
}
|
|
}
|
|
|
|
void DoMeleeRangeCheck(object oPC, int nMoveId)
|
|
{
|
|
location lTarget = GetLocation(oPC);
|
|
object oAreaTarget;
|
|
// Flip through your enemies, seeing if there is one both in melee range of you and an ally
|
|
object oAreaFriend = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oAreaFriend))
|
|
{
|
|
// First, find the nearest ally
|
|
if(oAreaFriend != oPC && // Can't be you
|
|
GetIsFriend(oAreaFriend, oPC)) // Gotta be a friend
|
|
{
|
|
// Now we need to loop through valid enemies
|
|
oAreaTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oAreaTarget))
|
|
{
|
|
// Find the nearest valid target
|
|
if(oAreaTarget != oPC && // Can't be you
|
|
oAreaTarget != oAreaFriend && // Can't be your friend
|
|
GetIsInMeleeRange(oPC, oAreaTarget) && // They must be in melee range
|
|
GetIsInMeleeRange(oAreaFriend, oAreaTarget) && // And with your friend
|
|
GetIsEnemy(oAreaTarget, oPC)) // Gotta be an enemy
|
|
{
|
|
// Now we apply the bonuses to both of you
|
|
effect eVis = EffectVisualEffect(VFX_IMP_HEAD_HOLY);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oPC);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oAreaFriend);
|
|
effect eLink = ExtraordinaryEffect(EffectAttackIncrease(2));
|
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, 6.0);
|
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oAreaFriend, 6.0);
|
|
|
|
|
|
}
|
|
//Select the next target within the spell shape.
|
|
oAreaTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|
|
|
|
//Select the next target within the spell shape.
|
|
oAreaFriend = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
|
|
// If they still have the spell, keep going
|
|
if (GetHasSpellEffect(nMoveId, oPC))
|
|
{
|
|
DelayCommand(6.0, DoMeleeRangeCheck(oPC, nMoveId));
|
|
if(DEBUG) DoDebug("DoMeleeRangeCheck: DelayCommand(6.0, DoMeleeRangeCheck(oPC, nMoveId)).");
|
|
}
|
|
|
|
} |