Major script update for 8 class support. prc_wipeNSB.nss PRC_S_spellb.nss prc_amagsys_gain.nss - AMSCompatibilityCheck() prc_prereq.nss - Dragonheart(), KnightWeave() prc_onenter.nss - OnEnter_AMSCompatibilityCheck() prc_metamagic.nss - GetHasSpontaneousNSBClass() prc_feats.nss prc_dracactive.nss prc_debug_hfeatm.nss prc_cbtmed_spnhl.nss psi_powconv.nss psi_pow_bstpwr.nss x2_pc_umdcheck.nss
206 lines
6.7 KiB
Plaintext
206 lines
6.7 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Draconic Active Feats
|
|
//:: prc_dracactive.nss
|
|
//::///////////////////////////////////////////////
|
|
/*
|
|
Handles the usable feats of the Draconic series of feats from
|
|
Races of the Dragon and Dragon Magic
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Fox
|
|
//:: Created On: Nov 17, 2007
|
|
//:://////////////////////////////////////////////
|
|
|
|
//:: Updated for .35 by Jaysyn 2023/03/11
|
|
|
|
|
|
#include "prc_inc_burn"
|
|
#include "prc_inc_breath"
|
|
|
|
void ActivateSavingThrow(int nSpellLevel, object oPC = OBJECT_SELF)
|
|
{
|
|
SetLocalInt(oPC, "BurnSpellLevel", nSpellLevel);
|
|
int bCanUse = BurnSpell(oPC);
|
|
DeleteLocalInt(oPC, "BurnSpellLevel");
|
|
|
|
//if none left, exit
|
|
if(!bCanUse) return;
|
|
|
|
effect eLink = EffectSavingThrowIncrease(SAVING_THROW_ALL, nSpellLevel);
|
|
float fDur = 6.0f;
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, fDur);
|
|
|
|
}
|
|
|
|
|
|
void ActivateBreath(int nSpellLevel, object oPC = OBJECT_SELF)
|
|
{
|
|
SetLocalInt(oPC, "BurnSpellLevel", nSpellLevel);
|
|
int bCanUse = BurnSpell(oPC);
|
|
DeleteLocalInt(oPC, "BurnSpellLevel");
|
|
|
|
//if none left, exit
|
|
if(!bCanUse) return;
|
|
|
|
int nDamageType;
|
|
struct breath DracBreath;
|
|
|
|
//Acid
|
|
if(GetHasFeat(FEAT_DRACONIC_HERITAGE_BK, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_CP, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_GR, oPC))
|
|
{
|
|
nDamageType = DAMAGE_TYPE_ACID;
|
|
}
|
|
|
|
//Cold
|
|
if(GetHasFeat(FEAT_DRACONIC_HERITAGE_CR, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_SR, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_TP, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_WH, oPC))
|
|
{
|
|
nDamageType = DAMAGE_TYPE_COLD;
|
|
}
|
|
//Electric
|
|
if(GetHasFeat(FEAT_DRACONIC_HERITAGE_BL, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_BZ, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_SA, oPC))
|
|
{
|
|
nDamageType = DAMAGE_TYPE_ELECTRICAL;
|
|
}
|
|
//Fire
|
|
if(GetHasFeat(FEAT_DRACONIC_HERITAGE_BS, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_GD, oPC)
|
|
|| GetHasFeat(FEAT_DRACONIC_HERITAGE_RD, oPC))
|
|
{
|
|
nDamageType = DAMAGE_TYPE_FIRE;
|
|
}
|
|
//Sonic
|
|
if(GetHasFeat(FEAT_DRACONIC_HERITAGE_EM, oPC))
|
|
{
|
|
nDamageType = DAMAGE_TYPE_SONIC;
|
|
}
|
|
//"Concussive Force"
|
|
if(GetHasFeat(FEAT_DRACONIC_HERITAGE_AM, oPC))
|
|
{
|
|
nDamageType = DAMAGE_TYPE_BLUDGEONING;
|
|
}
|
|
|
|
|
|
int nSaveDCBonus = nSpellLevel;
|
|
int nNumberOfDice = 2;
|
|
int nDieSize = 6;
|
|
location lTarget = PRCGetSpellTargetLocation();
|
|
|
|
//check for Dragonheart Mage abilities
|
|
int nHeartLevel = GetLevelByClass(CLASS_TYPE_DRAGONHEART_MAGE, oPC);
|
|
if ( nHeartLevel > 5)
|
|
{
|
|
nDieSize = 8;
|
|
}
|
|
if ( nHeartLevel > 9)
|
|
{
|
|
nNumberOfDice = 3;
|
|
nDieSize = 6;
|
|
}
|
|
if ( nHeartLevel > 15)
|
|
{
|
|
nNumberOfDice = 3;
|
|
nDieSize = 8;
|
|
}
|
|
if ( nHeartLevel > 19)
|
|
{
|
|
nNumberOfDice = 4;
|
|
nDieSize = 6;
|
|
}
|
|
if ( nHeartLevel > 25)
|
|
{
|
|
nNumberOfDice = 4;
|
|
nDieSize = 8;
|
|
}
|
|
if ( nHeartLevel > 29)
|
|
{
|
|
nNumberOfDice = 5;
|
|
nDieSize = 6;
|
|
}
|
|
|
|
nNumberOfDice = nNumberOfDice * nSpellLevel;
|
|
|
|
//cone handling for sonic, fire, and cold
|
|
if((nDamageType == DAMAGE_TYPE_COLD)
|
|
|| (nDamageType == DAMAGE_TYPE_FIRE)
|
|
|| (nDamageType == DAMAGE_TYPE_SONIC))
|
|
{
|
|
DracBreath = CreateBreath(oPC, FALSE, 30.0, nDamageType, nDieSize, nNumberOfDice, ABILITY_CHARISMA, nSaveDCBonus, BREATH_NORMAL, 0);
|
|
}//end cone handling
|
|
|
|
//otherwise do a line
|
|
else
|
|
{
|
|
DracBreath = CreateBreath(oPC, TRUE, 60.0, nDamageType, nDieSize, nNumberOfDice, ABILITY_CHARISMA, nSaveDCBonus, BREATH_NORMAL, 0);
|
|
}//end Electric line breath handling
|
|
|
|
ApplyBreath(DracBreath, lTarget);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
int bSpontCaster = FALSE;
|
|
int nFirstArcane = GetPrimaryArcaneClass(oPC);
|
|
|
|
//make sure new spellbooks are allowed
|
|
if((GetPRCSwitch(PRC_SORC_DISALLOW_NEWSPELLBOOK) && nFirstArcane == CLASS_TYPE_SORCERER)
|
|
|| (GetPRCSwitch(PRC_BARD_DISALLOW_NEWSPELLBOOK) && nFirstArcane == CLASS_TYPE_BARD))
|
|
{
|
|
FloatingTextStringOnCreature("New spellbooks are disabled and this feat requires them.", oPC, FALSE);
|
|
return;
|
|
}
|
|
|
|
//make sure user is a spontaneous caster
|
|
int i;
|
|
for(i = 1; i <= 8; i++)
|
|
{
|
|
int nClass = GetClassByPosition(i, oPC);
|
|
if((GetSpellbookTypeForClass(nClass) == SPELLBOOK_TYPE_SPONTANEOUS)
|
|
&& GetIsArcaneClass(nClass, oPC))
|
|
bSpontCaster = TRUE;
|
|
}
|
|
|
|
if(!bSpontCaster)
|
|
{
|
|
FloatingTextStringOnCreature("This ability requires spontaneous arcane spell slots.", oPC, FALSE);
|
|
return;
|
|
}
|
|
|
|
int nFeatUsed = GetSpellId();
|
|
|
|
switch(nFeatUsed)
|
|
{
|
|
//Draconic Arcane Grace activations
|
|
case SPELL_DRACONIC_GRACE_1: ActivateSavingThrow(1); break;
|
|
case SPELL_DRACONIC_GRACE_2: ActivateSavingThrow(2); break;
|
|
case SPELL_DRACONIC_GRACE_3: ActivateSavingThrow(3); break;
|
|
case SPELL_DRACONIC_GRACE_4: ActivateSavingThrow(4); break;
|
|
case SPELL_DRACONIC_GRACE_5: ActivateSavingThrow(5); break;
|
|
case SPELL_DRACONIC_GRACE_6: ActivateSavingThrow(6); break;
|
|
case SPELL_DRACONIC_GRACE_7: ActivateSavingThrow(7); break;
|
|
case SPELL_DRACONIC_GRACE_8: ActivateSavingThrow(8); break;
|
|
case SPELL_DRACONIC_GRACE_9: ActivateSavingThrow(9); break;
|
|
|
|
//Draconic Breath
|
|
case SPELL_DRACONIC_BREATH_1: ActivateBreath(1); break;
|
|
case SPELL_DRACONIC_BREATH_2: ActivateBreath(2); break;
|
|
case SPELL_DRACONIC_BREATH_3: ActivateBreath(3); break;
|
|
case SPELL_DRACONIC_BREATH_4: ActivateBreath(4); break;
|
|
case SPELL_DRACONIC_BREATH_5: ActivateBreath(5); break;
|
|
case SPELL_DRACONIC_BREATH_6: ActivateBreath(6); break;
|
|
case SPELL_DRACONIC_BREATH_7: ActivateBreath(7); break;
|
|
case SPELL_DRACONIC_BREATH_8: ActivateBreath(8); break;
|
|
case SPELL_DRACONIC_BREATH_9: ActivateBreath(9); break;
|
|
|
|
default: FloatingTextStringOnCreature("Should not happen. o.O", oPC, FALSE); break;
|
|
}
|
|
}
|