154 lines
5.6 KiB
Plaintext
154 lines
5.6 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Dragon Breath for Wyrmling Shape
|
|
//:: x2_s1_wyrmbreath
|
|
//:: 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
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
-- Modified by Iznoghoud January 13 2004
|
|
Made a fix for the way the damage is calculated.
|
|
|
|
- Before, it would determine a number of dice and die type (d4, d6, d8, d10), throw
|
|
that die one time, and then multiply that number with the number of dice.
|
|
Also, every target got the same amount of damage.
|
|
|
|
- Now, it determines a number of dice N and die type (d4, d6, d8, d10), throws that
|
|
die N times, and adds up the results.
|
|
This results in the damage being averaged out like all other spells, instead of
|
|
going into the low or high extremes so often. Also, every target can get a
|
|
different amount of damage, just like with other spells.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "NW_I0_SPELLS"
|
|
#include "x2_inc_shifter"
|
|
|
|
void main()
|
|
{
|
|
|
|
if(GetLocalInt(GetArea(OBJECT_SELF), "NOCAST")==2 && !GetIsDM(OBJECT_SELF))
|
|
{
|
|
|
|
FloatingTextStringOnCreature("All spells fizzle in town.", OBJECT_SELF);
|
|
|
|
return;
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
// 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) /2)+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) /2)+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) /3)+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) /2)+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) /3)+1;
|
|
break;
|
|
|
|
}
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Calculate Save DC based on shifter level
|
|
//--------------------------------------------------------------------------
|
|
int nDC = ShifterGetSaveDC(OBJECT_SELF,SHIFTER_DC_NORMAL);
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Calculate Damage
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
int nDamage = 0;
|
|
int i;
|
|
int nDamStrike;
|
|
float fDelay;
|
|
object oTarget;
|
|
effect eVis, eBreath;
|
|
|
|
//--------------------------------------------------------------------------
|
|
//Loop through all targets and do damage
|
|
//--------------------------------------------------------------------------
|
|
oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 14.0, GetSpellTargetLocation(), TRUE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
if(oTarget != OBJECT_SELF && !GetIsReactionTypeFriendly(oTarget))
|
|
{
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, nSpell));
|
|
fDelay = GetDistanceBetween(OBJECT_SELF, oTarget)/20;
|
|
// Calculate damage for this target
|
|
nDamage = 0;
|
|
for (i = 0; i < nDice; i++) // Roll the damage die nDice times and add up the damage.
|
|
nDamage += (Random(nDamageDie)+1);
|
|
|
|
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, GetSpellTargetLocation(), TRUE);
|
|
}
|
|
}
|