PRC8/trunk/scripts/prc_dracactive.nss
Jaysyn904 6585d40a0f Major script update for 8 class support
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
2023-03-11 12:04:30 -05:00

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;
}
}