146 lines
5.4 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|