PRC8/nwn/nwnprc/trunk/include/psi_inc_pwresist.nss
Jaysyn904 e641b42f84 Exalted update
Updated Vow of Poverty. Added Sanctify Ki Strike, Holy Strike, Fist of Heavens, Vow of Abstinence, Vow of Chastity & Gift of Faith.  (@fenac).  Turned off the Taunt & Parry skills.  Re-disabled AC & save bonuses from Tumble & Spellcraft.   Updated min() & max() to PRCmin() & PRCmax() to not conflict with similarly named NUI adjacent functions.  Set Point Blank Shot to 30' per PnP.  Added icon for Chosen of Evil.  Started work on Hidden Talent.  Created Psionics function cheatsheet.  Updated release archive.
2025-01-29 22:46:38 -05:00

149 lines
4.6 KiB
Plaintext

/*
----------------
prc_inc_psionics
----------------
20/10/04 by Stratovarius
Calculates Power Resistance for Psionics and performs the checks.
*/
/*
#include "prc_inc_racial"
#include "prc_feat_const"
#include "prc_class_const"
*/
#include "prc_alterations"
// Constants that dictate ResistPower results
const int POWER_RESIST_FAIL = 1;
const int POWER_RESIST_PASS = 0;
//
// This function is a wrapper should someone wish to rewrite the Bioware
// version. This is where it should be done.
//
int
PRCResistPower(object oCaster, object oTarget)
{
return ResistSpell(oCaster, oTarget);
}
//
// This function is a wrapper should someone wish to rewrite the Bioware
// version. This is where it should be done.
//
int
PRCGetPowerResistance(object oTarget, object oCaster)
{
int iPowerRes = GetSpellResistance(oTarget);
//racial pack SR
int iRacialPowerRes = 0;
if(GetHasFeat(FEAT_SPELL27, oTarget))
iRacialPowerRes += 27+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL25, oTarget))
iRacialPowerRes += 25+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL18, oTarget))
iRacialPowerRes += 18+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL16, oTarget))
iRacialPowerRes += 16+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL15, oTarget))
iRacialPowerRes += 15+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL14, oTarget))
iRacialPowerRes += 14+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL13, oTarget))
iRacialPowerRes += 13+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL11, oTarget))
iRacialPowerRes += 11+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL10, oTarget))
iRacialPowerRes += 10+GetHitDice(oTarget);
else if(GetHasFeat(FEAT_SPELL5, oTarget))
iRacialPowerRes += 5+GetHitDice(oTarget);
if(iRacialPowerRes > iPowerRes)
iPowerRes = iRacialPowerRes;
// Exalted Companion, can also be used for Celestial Template
if (GetLocalInt(oTarget, "CelestialTemplate"))
{
int nHD = GetHitDice(oTarget);
int nSR = nHD * 2;
if (nSR > 25) nSR = 25;
if (nSR > iPowerRes) iPowerRes = nSR;
}
// Thought Shield, 13 + augment vs Mind-Affecting
if(GetLocalInt(oTarget, "PRC_Power_ThoughtShield_PR") &&
Get2DACache("spells", "ImmunityType", PRCGetSpellId()) == "Mind_Affecting"
)
{
// Only use the PR given by the power if it's higher than the previous
iPowerRes = PRCMax(iPowerRes, GetLocalInt(oTarget, "PRC_Power_ThoughtShield_PR"));
}
// Tower of Iron Will, 19 + augment vs Mind-Affecting
if(GetLocalInt(oTarget, "PRC_Power_TowerOfIronWill_PR") &&
Get2DACache("spells", "ImmunityType", PRCGetSpellId()) == "Mind_Affecting"
)
{
// Only use the PR given by the power if it's higher than the previous
iPowerRes = PRCMax(iPowerRes, GetLocalInt(oTarget, "PRC_Power_TowerOfIronWill_PR"));
}
// Foe Hunter SR stacks with normal SR
// when a Power is cast by their hated enemy
if(GetHasFeat(FEAT_HATED_ENEMY_SR, oTarget) && GetLocalInt(oTarget, "HatedFoe") == MyPRCGetRacialType(oCaster) )
{
iPowerRes += 15 + GetLevelByClass(CLASS_TYPE_FOE_HUNTER, oTarget);
}
return iPowerRes;
}
//
// If a Power is resisted, display the effect
//
void
PRCShowPowerResist(object oCaster, object oTarget, int nResist, float fDelay = 0.0)
{
// If either caster/target is a PC send them a message
if (GetIsPC(oCaster))
{
string message = nResist == POWER_RESIST_FAIL ?
"Target is affected by the power." : "Target resisted the power.";
SendMessageToPC(oCaster, message);
}
if (GetIsPC(oTarget))
{
string message = nResist == POWER_RESIST_FAIL ?
"You are affected by the power." : "You resisted the power.";
SendMessageToPC(oTarget, message);
}
}
//
// This function overrides the BioWare MyResistSpell.
// TODO: Change name to PRCMyResistPower.
//
int
PRCMyResistPower(object oCaster, object oTarget, int nEffCasterLvl=0, float fDelay = 0.0)
{
int nResist = POWER_RESIST_FAIL;
int nCasterCheck = nEffCasterLvl + d20(1);
int nTargetPR = PRCGetPowerResistance(oTarget, oCaster);
// A tie favors the caster.
if (nCasterCheck < nTargetPR) nResist = POWER_RESIST_PASS;
//Spellfire - done this way because constants may change
if(CheckSpellfire(oCaster, oTarget)) nResist = POWER_RESIST_PASS;
// Only show resistance if the target has any
if (nTargetPR > 0) PRCShowPowerResist(oCaster, oTarget, nResist, fDelay);
return nResist;
}
// Test main
//void main(){}