PRC8_fork/trunk/newspellbook/tob_jpm_fireb.nss

94 lines
3.7 KiB
Plaintext
Raw Normal View History

#include "tob_inc_move"
#include "tob_movehook"
////#include "prc_alterations"
#include "inc_newspellbook"
// Helper functions
void DoDamage(object oInitiator, int nDice, int nClass)
{
location lTarget = GetLocation(oInitiator);
float fRange = FeetToMeters(10.0);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE, GetPosition(oInitiator));
while(GetIsObjectValid(oTarget))
{
if(oTarget != oInitiator)
{
int nDamage = d6(nDice);
int nDC = 14 + GetDCAbilityModForClass(nClass, oInitiator);
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_FIRE);
effect eLink = EffectDamage(nDamage/2, DAMAGE_TYPE_FIRE);
eLink = EffectLinkEffects(eLink, EffectDamage(nDamage/2, DAMAGE_TYPE_MAGICAL));
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_IMP_FLAME_M));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget);
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTarget, FALSE, OBJECT_TYPE_CREATURE, GetPosition(oInitiator));
}
}
void DoLoop(object oInitiator, int nDice, int nClass)
{
if(DEBUG) DoDebug("Dice: " + IntToString(nDice));
DelayCommand(RoundsToSeconds(9), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(8), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(7), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(6), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(5), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(4), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(3), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(2), DoDamage(oInitiator, nDice, nClass));
DelayCommand(RoundsToSeconds(1), DoDamage(oInitiator, nDice, nClass));
DoDamage(oInitiator, nDice, nClass);
}
void main()
{
if(!PreManeuverCastCode()) return;
object oInitiator = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct maneuver move = EvaluateManeuver(oInitiator, oTarget);
if(move.bCanManeuver)
{
// See if they want augmented stance
if(GetSpellId() == JPM_SPELL_FIREBIRD_AUGMENTED)
{
int nSpellID = GetLocalInt(oInitiator, "JPM_SPELL_CURRENT");
string sArray = GetLocalString(oInitiator, "JPM_SPELL_CURRENT");
int nUses = sArray == "" ? GetHasSpell(nSpellID, oInitiator) :
persistant_array_get_int(oInitiator, sArray, nSpellID);
if(nUses)
{
int nClass = GetPrimaryArcaneClass(oInitiator);
int nLevel = GetLocalInt(oInitiator, "JPM_SPELL_CURRENT_LVL");
if(sArray == "")
{
DecrementRemainingSpellUses(oInitiator, nSpellID);
}
else
{
nUses--;
persistant_array_set_int(oInitiator, sArray, nSpellID, nUses);
}
DoLoop(oInitiator, nLevel, nClass);
}
}
// This adds 3 caster levels when using a fire spell
SetLocalInt(oInitiator, "ToB_JPM_FireB", TRUE);
if(GetLocalInt(oInitiator, "ReserveFeatsRunning"))
DelayCommand(0.1f, ExecuteScript("prc_reservefeat", oInitiator));
effect eLink = EffectLinkEffects(EffectDamageResistance(DAMAGE_TYPE_FIRE, 10), EffectVisualEffect(VFX_DUR_ELEMENTAL_SHIELD));
eLink = ExtraordinaryEffect(eLink);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
}
}