PRC8_fork/trunk/include/psi_inc_pwresist.nss
Jaysyn904 1662218bb4 Initial upload.
Adding base PRC 4.19a files to repository.
2022-10-07 13:51:24 -04: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 = max(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 = max(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(){}