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.
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)).");
|
|
}
|
|
|
|
} |