Alangara_PRC8/_removed/X2_S1_WYRMBREATH.nss
Jaysyn904 86feb9ca6f Initial commit
Initial commit.
2024-06-05 21:21:06 -04:00

146 lines
5.4 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Dragon Breath for Wyrmling Shape
//:: x2_s2_dragbreath
//:: Copyright (c) 2003Bioware Corp.
//:://////////////////////////////////////////////
/*
Calculates the power of the dragon breath
used by a player polymorphed into wyrmling
shape
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: June, 17, 2003
//:://////////////////////////////////////////////
#include "NW_I0_SPELLS"
#include "x2_inc_shifter"
void main()
{
//--------------------------------------------------------------------------
// Set up variables
//--------------------------------------------------------------------------
int nType = GetSpellId();
int nDamageType;
int nDamageDie;
int nVfx;
int nSave;
int nSpell;
int nDice;
//--------------------------------------------------------------------------
// Decide on breath weapon type, vfx based on spell id
//--------------------------------------------------------------------------
switch (nType)
{
case 663: //white
nDamageDie = 4;
nDamageType = DAMAGE_TYPE_COLD;
nVfx = VFX_IMP_FROST_S;
nSave = SAVING_THROW_TYPE_COLD;
nSpell = SPELLABILITY_DRAGON_BREATH_COLD;
nDice = (GetLevelByClass(CLASS_TYPE_SHIFTER,OBJECT_SELF) /1)+1;
break;
case 664: //black
nDamageDie = 4;
nDamageType = DAMAGE_TYPE_ACID;
nVfx = VFX_IMP_ACID_S;
nSave = SAVING_THROW_TYPE_ACID;
nSpell = SPELLABILITY_DRAGON_BREATH_ACID;
nDice = (GetLevelByClass(CLASS_TYPE_SHIFTER,OBJECT_SELF) /1)+1;
break;
case 665: //red
nDamageDie = 10;
nDamageType = DAMAGE_TYPE_FIRE;
nVfx = VFX_IMP_FLAME_M;
nSave = SAVING_THROW_TYPE_FIRE;
nSpell = SPELLABILITY_DRAGON_BREATH_FIRE;
nDice = (GetLevelByClass(CLASS_TYPE_SHIFTER,OBJECT_SELF) /1)+1;
break;
case 666: //green
nDamageDie = 6;
nDamageType = DAMAGE_TYPE_ACID;
nVfx = VFX_IMP_ACID_S;
nSave = SAVING_THROW_TYPE_ACID;
nSpell = SPELLABILITY_DRAGON_BREATH_GAS;
nDice = (GetLevelByClass(CLASS_TYPE_SHIFTER,OBJECT_SELF) /1)+1;
break;
case 667: //blue
nDamageDie = 8;
nDamageType = DAMAGE_TYPE_ELECTRICAL;
nVfx = VFX_IMP_LIGHTNING_S;
nSave = SAVING_THROW_TYPE_ELECTRICITY;
nSpell = SPELLABILITY_DRAGON_BREATH_LIGHTNING;
nDice = (GetLevelByClass(CLASS_TYPE_SHIFTER,OBJECT_SELF) /1)+1;
break;
}
//--------------------------------------------------------------------------
// Calculate Save DC based on shifter level
//--------------------------------------------------------------------------
int nDC = ShifterGetSaveDC(OBJECT_SELF,SHIFTER_DC_NORMAL);
//--------------------------------------------------------------------------
// Calculate Damage
//--------------------------------------------------------------------------
int nDamage = (Random(nDamageDie)+1)* nDice;
int nDamStrike;
float fDelay;
object oTarget;
effect eVis, eBreath;
//--------------------------------------------------------------------------
//Loop through all targets and do damage
//--------------------------------------------------------------------------
location lFinalTarget = GetSpellTargetLocation();
vector vFinalPosition;
if ( lFinalTarget == GetLocation(OBJECT_SELF) )
{
// Since the target and origin are the same, we have to determine the
// direction of the spell from the facing of OBJECT_SELF (which is more
// intuitive than defaulting to East everytime).
// In order to use the direction that OBJECT_SELF is facing, we have to
// instead we pick a point slightly in front of OBJECT_SELF as the target.
vector lTargetPosition = GetPositionFromLocation(lFinalTarget);
vFinalPosition.x = lTargetPosition.x + cos(GetFacing(OBJECT_SELF));
vFinalPosition.y = lTargetPosition.y + sin(GetFacing(OBJECT_SELF));
lFinalTarget = Location(GetAreaFromLocation(lFinalTarget),vFinalPosition,GetFacingFromLocation(lFinalTarget));
}
oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, lFinalTarget, TRUE);
while(GetIsObjectValid(oTarget))
{
if(oTarget != OBJECT_SELF && !GetIsReactionTypeFriendly(oTarget))
{
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpell));
fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
nDamStrike = GetReflexAdjustedDamage(nDamage, oTarget, nDC);
if (nDamStrike > 0)
{
eBreath = EffectDamage(nDamStrike, nDamageType);
eVis = EffectVisualEffect(nVfx);
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eBreath, oTarget));
}
}
oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 14.0, lFinalTarget, TRUE);
}
}