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.
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’t take any other actions.
|
||
In addition, the creature takes a –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 –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"
|
||
}
|