forked from Jaysyn/PRC8
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.
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"
|
||
}
|