154 lines
7.0 KiB
Plaintext
154 lines
7.0 KiB
Plaintext
|
//::///////////////////////////////////////////////
|
|||
|
//:: Complete Warrior Samurai Frightful Presence
|
|||
|
//:: prc_cwsm_fright
|
|||
|
//::///////////////////////////////////////////////
|
|||
|
/** @file prc_cwsm_fright
|
|||
|
A 20th-level Samurais bravery, honor, and
|
|||
|
fighting prowess have become legendary. When
|
|||
|
the samurai draws his blade, opponents within
|
|||
|
30 feet must succeed on a Will save(DC 20 + Cha
|
|||
|
Modifier) or become panicked for 4d6 rounds (if
|
|||
|
they have 4 or fewer Hit Dice) or shaken for 4d6
|
|||
|
rounds (if they have more than 4 Hit Dice, but
|
|||
|
fewer than the Samurai). Creatures with more Hit
|
|||
|
Dice then the Samurai are not affected.
|
|||
|
Any foe that successfully resists the effect
|
|||
|
cannot be affected again by the same samurai's
|
|||
|
frightful presence for 24 hours.
|
|||
|
|
|||
|
SRD on panicked:
|
|||
|
A panicked creature must drop anything it holds and
|
|||
|
flee at top speed from the source of its fear, as
|
|||
|
well as any other dangers it encounters, along a
|
|||
|
random path. It can<61>t take any other actions.
|
|||
|
In addition, the creature takes a <20>2 penalty on all
|
|||
|
saving throws, skill checks, and ability checks. If
|
|||
|
cornered, a panicked creature cowers and does not
|
|||
|
attack, typically using the total defense action in
|
|||
|
combat. A panicked creature can use special abilities,
|
|||
|
including spells, to flee; indeed, the creature must
|
|||
|
use such means if they are the only way to escape.
|
|||
|
|
|||
|
SRD on shaken:
|
|||
|
A shaken character takes a <20>2 penalty on attack rolls,
|
|||
|
saving throws, skill checks, and ability checks.
|
|||
|
|
|||
|
@author Ornedan
|
|||
|
@date Created - 2006.07.05
|
|||
|
*/
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
//:://////////////////////////////////////////////
|
|||
|
|
|||
|
#include "prc_inc_spells"
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
object oPC = GetItemLastEquippedBy();
|
|||
|
object oItem = GetItemLastEquipped();
|
|||
|
|
|||
|
// Check if the character should still have this eventhook
|
|||
|
if(!GetHasFeat(FEAT_CWSM_FRIGHTFUL_PRESENCE, oPC))
|
|||
|
{
|
|||
|
// Missing the feat, unhook and abort
|
|||
|
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, "prc_cwsm_fright", TRUE, FALSE);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// To save CPU use, don't run this for both weapons in a double-equip. Implemented as a 2 second lock between uses.
|
|||
|
// This doesn't make any difference to the effectiveness of the ability, since anyone that wasn't already affected
|
|||
|
// by the first draw will be immune for 24h anyway
|
|||
|
if(GetLocalInt(oPC, "PRC_CWSM_Fright_Lock"))
|
|||
|
return;
|
|||
|
|
|||
|
// Determine if a blade was drawn. In this case, blade = katana || short sword
|
|||
|
if(GetBaseItemType(oItem) == BASE_ITEM_KATANA || GetBaseItemType(oItem) == BASE_ITEM_SHORTSWORD)
|
|||
|
{
|
|||
|
// Set the lock variable and queue unlock
|
|||
|
SetLocalInt(oPC, "PRC_CWSM_Fright_Lock", TRUE);
|
|||
|
DelayCommand(6.0f, DeleteLocalInt(oPC, "PRC_CWSM_Fright_Lock"));
|
|||
|
|
|||
|
effect eShaken = ExtraordinaryEffect(EffectShaken());
|
|||
|
// Construct Panicked effect
|
|||
|
effect ePanicked = EffectLinkEffects(eShaken, EffectFrightened());
|
|||
|
ePanicked = EffectLinkEffects(ePanicked, EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR));
|
|||
|
// Make the effects extraordinary
|
|||
|
ePanicked = ExtraordinaryEffect(ePanicked);
|
|||
|
|
|||
|
// Radius = 30ft
|
|||
|
float fRadius = FeetToMeters(30.0f);
|
|||
|
float fDuration;
|
|||
|
|
|||
|
// DC = 20 + Samurai's Cha mod
|
|||
|
int nDC = 20 + GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|||
|
int nPCHitDice = GetHitDice(oPC);
|
|||
|
int nTargetHitDice;
|
|||
|
int bDoVFX = FALSE;
|
|||
|
|
|||
|
// The samurai's object ID for enforcing the 24h rule
|
|||
|
string sPCOid = ObjectToString(oPC);
|
|||
|
|
|||
|
// Loop over creatures in range
|
|||
|
location lTarget = GetLocation(oPC);
|
|||
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE);
|
|||
|
while (GetIsObjectValid(oTarget))
|
|||
|
{
|
|||
|
// Target validity check
|
|||
|
if(oTarget != oPC && // Can't affect self
|
|||
|
!GetLocalInt(oTarget, "PRC_CWSM_Fright_SavedVs" + sPCOid) && // Hasn't saved successfully against this samurai's Frightful Presence in the last 24h
|
|||
|
spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oPC) && // Only hostiles
|
|||
|
nPCHitDice > (nTargetHitDice = GetHitDice(oTarget)) // Target must have less HD than the samurai
|
|||
|
)
|
|||
|
{
|
|||
|
// Set the marker that tells we tried to affect someone
|
|||
|
bDoVFX = TRUE;
|
|||
|
|
|||
|
// Let the target know something hostile happened
|
|||
|
SignalEvent(oTarget, EventSpellCastAt(oPC, -1, TRUE));
|
|||
|
|
|||
|
// Will save
|
|||
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_FEAR, oPC) &&
|
|||
|
!GetIsImmune(oTarget, IMMUNITY_TYPE_FEAR, oPC) // Explicit immunity check, because of the fucking stupid BW immunity handling
|
|||
|
)
|
|||
|
{
|
|||
|
// Roll duration
|
|||
|
fDuration = RoundsToSeconds(d6(4));
|
|||
|
|
|||
|
// HD 4 or less - panicked
|
|||
|
if(nTargetHitDice <= 4)
|
|||
|
{
|
|||
|
// Assign commands to drop items in left & right hands
|
|||
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget)))
|
|||
|
AssignCommand(oTarget, ActionPutDownItem(GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget)));
|
|||
|
if(GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)))
|
|||
|
AssignCommand(oTarget, ActionPutDownItem(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget)));
|
|||
|
|
|||
|
// Apply the effect
|
|||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, ePanicked, oTarget, fDuration);
|
|||
|
}
|
|||
|
// More then 4 HD, less than the samurai - shaken
|
|||
|
else
|
|||
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eShaken, oTarget, fDuration);
|
|||
|
}
|
|||
|
// Successfull save, set marker and queue marker deletion
|
|||
|
else
|
|||
|
{
|
|||
|
SetLocalInt(oTarget, "PRC_CWSM_Fright_SavedVs" + sPCOid, TRUE);
|
|||
|
|
|||
|
// Add variable deletion to the target's queue. That way, if the samurai logs out, it will still get cleared
|
|||
|
AssignCommand(oTarget, DelayCommand(HoursToSeconds(24), DeleteLocalInt(oTarget, "PRC_CWSM_Fright_SavedVs" + sPCOid)));
|
|||
|
}
|
|||
|
}// end if - Target validity check
|
|||
|
|
|||
|
// Get next target in area
|
|||
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE);
|
|||
|
}// end while - Loop over creatures in 30ft area
|
|||
|
|
|||
|
// If we tried to affect someone, do war cry VFX
|
|||
|
if(bDoVFX)
|
|||
|
ApplyEffectToObject(DURATION_TYPE_INSTANT,
|
|||
|
EffectVisualEffect(GetGender(oPC) == GENDER_FEMALE ? VFX_FNF_HOWL_WAR_CRY_FEMALE : VFX_FNF_HOWL_WAR_CRY),
|
|||
|
oPC
|
|||
|
);
|
|||
|
}// end if - Equipped a "blade"
|
|||
|
}
|