Files
PRC8/nwn/nwnprc/trunk/newspellbook/tob_dmnd_prlbdt.nss
Jaysyn904 279580e5b5 2025/12/28 Early update
Wemics have 5 RHD.
Fixed Whirling Blade.
Factotum now regenerates Inspiration after logging off and back on in he same server session.
Spellfire Wielder can't get extra spell levels from overcharging items.
Only one Chilling Fog at a time, casting a new one destroys the old one.
Heart of Fire now has a Chakra totem.
Pearl of Black doubt should be a bit more accurate.
Tweaked and tested psionic Keen Edge.
Fixed reversed sign for Echoblade validity in prc_equip.
Havoc Mage's Battlecast should clean up properly.
Updated readme.
2025-12-28 00:28:56 -05:00

171 lines
4.5 KiB
Plaintext

/*
----------------
Pearl of Black Doubt
tob_dmnd_prlbdt
----------------
15/07/07 by Stratovarius
*/ /** @file
Pearl of Black Doubt
Diamond Mind (Stance)
Level: Swordsage 3, Warmage 3
Prerequisite: One Diamond Mind maneuver.
Initiation Action: 1 Swift Action
Range: Personal
Target: You
Duration: Stance
With every miss, your opponents become more uncertain, their doubt growing
like an irritating pearl in the mouth of a helpless oyster.
Whenever a foe swings and misses you, you gain +2 AC.
*/
#include "tob_inc_move"
#include "tob_movehook"
////#include "prc_alterations"
int GetApproximateAPR(object oCreature)
{
int nBAB = GetBaseAttackBonus(oCreature);
int nAttacks = 1;
if (nBAB >= 6) nAttacks++;
if (nBAB >= 11) nAttacks++;
if (nBAB >= 16) nAttacks++;
if (PRCGetHasEffect(EFFECT_TYPE_HASTE, oCreature))
{
nAttacks++;
}
return nAttacks;
}
void main()
{
//Declare main variables.
int nEvent = GetRunningEvent();
object oItem;
object oInitiator;
object oTarget = PRCGetSpellTargetObject();
switch(nEvent)
{
case EVENT_ONHEARTBEAT: oInitiator = OBJECT_SELF; break;
case EVENT_ONPLAYERREST_FINISHED: oInitiator = GetLastBeingRested(); break;
default:
oInitiator = OBJECT_SELF;
}
if(nEvent == FALSE)
{
if (!PreManeuverCastCode())
{
// If code within the PreManeuverCastCode (i.e. UMD) reports FALSE, do not run this spell
return;
}
// End of Spell Cast Hook
struct maneuver move = EvaluateManeuver(oInitiator, oTarget);
if(move.bCanManeuver)
{
object oItem = GetItemInSlot(INVENTORY_SLOT_CHEST, oInitiator);
IPSafeAddItemProperty(oItem, ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1),
9999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
effect eDur = EffectVisualEffect(VFX_DUR_BLUESHIELDPROTECT);
eDur = TagEffect(eDur, "PEARL_OF_BLACK_DOUBT");
eDur = ExtraordinaryEffect(eDur);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, 9999.0);
if(DEBUG) DoDebug("PoBD stance activated");
AddEventScript(oInitiator, EVENT_ONHEARTBEAT, "tob_dmnd_prlbdt", TRUE, FALSE);
AddEventScript(oInitiator, EVENT_ONPLAYERREST_FINISHED, "tob_dmnd_prlbdt", TRUE, FALSE);
}
}
if(nEvent == EVENT_ONHEARTBEAT)
{
int nBonus = 0;
location lLoc = GetLocation(oTarget);
object oEnemy = GetFirstObjectInShape(SHAPE_SPHERE, 5.0, lLoc, TRUE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oEnemy))
{
if (GetIsEnemy(oTarget, oEnemy) &&
GetIsInCombat(oEnemy) &&
GetDistanceBetween(oEnemy, oTarget) <= 5.0 &&
GetCurrentAction(oEnemy) == ACTION_ATTACKOBJECT && // Must be attacking
GetAttackTarget(oEnemy) == oTarget) // Must be attacking this PC
{
int nAPR = GetApproximateAPR(oEnemy);
nBonus += 2 * nAPR;
string s = "Enemy: " + GetName(oEnemy) + " APR: " + IntToString(nAPR);
if(DEBUG) DoDebug(s, oTarget);
}
oEnemy = GetNextObjectInShape(SHAPE_SPHERE, 5.0, lLoc);
}
if (nBonus > 0)
{
if(GetLocalInt(oTarget, "PearlOfBlackDoubt_JustHit"))
{
DeleteLocalInt(oTarget, "PearlOfBlackDoubt_JustHit");
// Skip this heartbeat's bonus calculation
return;
}
if(DEBUG) DoDebug("Applying AC Bonus: " + IntToString(nBonus));
effect eAC = EffectACIncrease(nBonus);
eAC = ExtraordinaryEffect(eAC);
eAC = TagEffect(eAC, "PEARL_OF_BLACK_DOUBT_BONUS");
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAC, oTarget, 5.9);
SetLocalInt(oTarget, "PearlOfBlackDoubtBonus", nBonus);
}
else
{
if(DEBUG) DoDebug("PoBD: No enemies in melee");
DeleteLocalInt(oTarget, "PearlOfBlackDoubtBonus");
effect eEffect = GetFirstEffect(oInitiator);
while(GetIsEffectValid(eEffect))
{
if(GetEffectTag(eEffect) == "PEARL_OF_BLACK_DOUBT_BONUS")
RemoveEffect(oInitiator, eEffect);
eEffect = GetNextEffect(oInitiator);
}
}
}
if(nEvent == EVENT_ONPLAYERREST_FINISHED)
{
effect eEffect = GetFirstEffect(oInitiator);
while(GetIsEffectValid(eEffect))
{
if(GetEffectTag(eEffect) == "PEARL_OF_BLACK_DOUBT")
RemoveEffect(oInitiator, eEffect);
eEffect = GetNextEffect(oInitiator);
}
if(DEBUG) DoDebug("Removing Pearl of Black Doubt");
RemoveEventScript(oInitiator, EVENT_ONHEARTBEAT, "tob_dmnd_prlbdt", TRUE, FALSE);
RemoveEventScript(oInitiator, EVENT_ONPLAYERREST_FINISHED, "tob_dmnd_prlbdt", TRUE, FALSE);
}
}