forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
194 lines
10 KiB
Plaintext
194 lines
10 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Breath Weapon for Half Dragon template
|
|
//:: tmp_hdrag_breath.nss
|
|
//:: Copyright (c) 2003Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Georg Zoeller (modified by Silver)
|
|
//:: Created On: June, 17, 2003 (June, 7, 2005)
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_inc_spells"
|
|
#include "prc_inc_breath"
|
|
#include "prc_inc_template"
|
|
|
|
//////////////////////////
|
|
// Constant Definitions //
|
|
//////////////////////////
|
|
const string HDRAGBREATHLOCK = "HalfDragonBreathLock";
|
|
|
|
int IsLineBreath()
|
|
{
|
|
int nSubTemplate = GetPersistantLocalInt(OBJECT_SELF, "HalfDragon_Template");
|
|
|
|
if(nSubTemplate == TEMPLATE_HDRAGON_CHROMATIC_BLACK
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_CHROMATIC_BLUE
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_METALLIC_BRASS
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_METALLIC_BRONZE
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_METALLIC_COPPER
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_GEM_AMETHYST
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_BROWN
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_CHAOS
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_OCEANUS
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_RADIANT
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_RUST
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_STYX
|
|
|| nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_TARTERIAN
|
|
)
|
|
return TRUE;
|
|
return FALSE;
|
|
}
|
|
|
|
//Returns range in feet for breath struct. Conversion to meters is
|
|
//handled internally in the include
|
|
float GetRangeFromSize(int nSize)
|
|
{
|
|
float fRange = 30.0;
|
|
switch(nSize)
|
|
{
|
|
case CREATURE_SIZE_FINE:
|
|
case CREATURE_SIZE_DIMINUTIVE:
|
|
case CREATURE_SIZE_TINY: fRange = 15.0; break;
|
|
case CREATURE_SIZE_SMALL: fRange = 20.0; break;
|
|
case CREATURE_SIZE_MEDIUM: fRange = 30.0; break;
|
|
case CREATURE_SIZE_LARGE: fRange = 40.0; break;
|
|
case CREATURE_SIZE_HUGE: fRange = 50.0; break;
|
|
case CREATURE_SIZE_GARGANTUAN: fRange = 60.0; break;
|
|
case CREATURE_SIZE_COLOSSAL: fRange = 70.0; break;
|
|
}
|
|
return fRange;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
if(GetLocalInt(OBJECT_SELF, "TemplateSLA_"+IntToString(GetSpellId())))
|
|
{
|
|
FloatingTextStringOnCreature("You have already used this ability today.", OBJECT_SELF);
|
|
return;
|
|
}
|
|
|
|
// Check the dragon breath delay lock
|
|
if(GetLocalInt(OBJECT_SELF, HDRAGBREATHLOCK))
|
|
{
|
|
SendMessageToPC(OBJECT_SELF, "You cannot use your breath weapon again so soon"); /// TODO: TLKify
|
|
IncrementRemainingFeatUses(OBJECT_SELF, FEAT_TEMPLATE_HALF_DRAGON_BREATH);
|
|
return;
|
|
}
|
|
|
|
//Declare main variables.
|
|
object oPC = OBJECT_SELF;
|
|
object oSkin = GetPCSkin(oPC);
|
|
int nSubTemplate = GetPersistantLocalInt(OBJECT_SELF, "HalfDragon_Template");
|
|
struct breath DiscBreath;
|
|
int nDamageDice = 6;
|
|
int DBREED;
|
|
effect eVis;
|
|
|
|
//Sets the save DC for Dragon Breath attacks. This is a reflex save to halve the damage.
|
|
int nSaveDCBonus = GetLevelByClass(CLASS_TYPE_DRAGON, oPC)/2;
|
|
|
|
//range calculation
|
|
float fRange = GetRangeFromSize(PRCGetCreatureSize(oPC));
|
|
if(IsLineBreath()) fRange = fRange * 2.0;
|
|
|
|
//Only Dragons with Breath Weapons will have damage caused by their breath attack.
|
|
//Any Dragon type not listed here will have a breath attack, but it will not
|
|
//cause damage or create a visual effect.
|
|
switch(nSubTemplate)
|
|
{
|
|
case TEMPLATE_HDRAGON_CHROMATIC_RED: DBREED = DAMAGE_TYPE_FIRE; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND); break;
|
|
case TEMPLATE_HDRAGON_METALLIC_BRASS: DBREED = DAMAGE_TYPE_FIRE; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND); break;
|
|
case TEMPLATE_HDRAGON_METALLIC_GOLD: DBREED = DAMAGE_TYPE_FIRE; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND); break;
|
|
case TEMPLATE_HDRAGON_LUNG_LUNGWANG: DBREED = DAMAGE_TYPE_FIRE; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND); break;
|
|
case TEMPLATE_HDRAGON_LUNG_TIENLUNG: DBREED = DAMAGE_TYPE_FIRE; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND); break;
|
|
case TEMPLATE_HDRAGON_CHROMATIC_BLACK: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_CHROMATIC_GREEN: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_METALLIC_COPPER: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_BROWN: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_DEEP: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_RUST: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_STYX: DBREED = DAMAGE_TYPE_ACID; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID); break;
|
|
case TEMPLATE_HDRAGON_METALLIC_SILVER: DBREED = DAMAGE_TYPE_COLD; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHCOLD); break;
|
|
case TEMPLATE_HDRAGON_CHROMATIC_WHITE: DBREED = DAMAGE_TYPE_COLD; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHCOLD); break;
|
|
case TEMPLATE_HDRAGON_CHROMATIC_BLUE: DBREED = DAMAGE_TYPE_ELECTRICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHMIND); break;//VFX_FNF_DRAGBREATHELEC
|
|
case TEMPLATE_HDRAGON_METALLIC_BRONZE: DBREED = DAMAGE_TYPE_ELECTRICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHMIND); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_OCEANUS: DBREED = DAMAGE_TYPE_ELECTRICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHMIND); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_SONG: DBREED = DAMAGE_TYPE_ELECTRICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHMIND); break;
|
|
case TEMPLATE_HDRAGON_GEM_EMERALD: DBREED = DAMAGE_TYPE_SONIC; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHSONIC); break;
|
|
case TEMPLATE_HDRAGON_GEM_SAPPHIRE: DBREED = DAMAGE_TYPE_SONIC; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHSONIC); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_BATTLE: DBREED = DAMAGE_TYPE_SONIC; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHSONIC); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_HOWLING: DBREED = DAMAGE_TYPE_SONIC; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHSONIC); break;
|
|
case TEMPLATE_HDRAGON_GEM_CRYSTAL: DBREED = DAMAGE_TYPE_POSITIVE; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHHOLY); break;
|
|
case TEMPLATE_HDRAGON_GEM_AMETHYST: DBREED = DAMAGE_TYPE_BLUDGEONING; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHODD); break;
|
|
case TEMPLATE_HDRAGON_GEM_TOPAZ: DBREED = DAMAGE_TYPE_MAGICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHODD); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_ETHEREAL: DBREED = DAMAGE_TYPE_MAGICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHODD); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_RADIANT: DBREED = DAMAGE_TYPE_MAGICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHODD); break;
|
|
case TEMPLATE_HDRAGON_OBSCURE_TARTERIAN: DBREED = DAMAGE_TYPE_MAGICAL; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHODD); break;
|
|
default: DBREED = -1; eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND); break;
|
|
}
|
|
|
|
if (DBREED > 0) DiscBreath = CreateBreath(oPC, IsLineBreath(), fRange, DBREED, 8, nDamageDice, ABILITY_CONSTITUTION, nSaveDCBonus);
|
|
//If Topaz, activate override for special impact VFX for Topaz's breath
|
|
if (nSubTemplate == TEMPLATE_HDRAGON_GEM_TOPAZ) DiscBreath.nOverrideSpecial = BREATH_TOPAZ;
|
|
if (nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_CHAOS)
|
|
{
|
|
int eleBreath;
|
|
int nNumDice = d10();
|
|
//Sets the random Element factor of the Chaos Dragons Breath Weapon.
|
|
//Affects damage, saving throw, and impact visual.
|
|
if((nNumDice==1) || (nNumDice==2))
|
|
{
|
|
eleBreath = DAMAGE_TYPE_COLD;
|
|
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHCOLD);
|
|
}
|
|
else if((nNumDice==3) || (nNumDice==4))
|
|
{
|
|
eleBreath = DAMAGE_TYPE_ACID;
|
|
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHACID);
|
|
}
|
|
else if((nNumDice==5) || (nNumDice==6))
|
|
{
|
|
eleBreath = DAMAGE_TYPE_FIRE;
|
|
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND);
|
|
}
|
|
else if((nNumDice==7) || (nNumDice==8))
|
|
{
|
|
eleBreath = DAMAGE_TYPE_SONIC;
|
|
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHSONIC);
|
|
}
|
|
else //if((nNumDice==9) || (nNumDice==10))
|
|
{
|
|
eleBreath = DAMAGE_TYPE_ELECTRICAL;
|
|
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHMIND);//VFX_FNF_DRAGBREATHELEC
|
|
}
|
|
|
|
DiscBreath = CreateBreath(oPC, IsLineBreath(), fRange, eleBreath, 8, nDamageDice, ABILITY_CONSTITUTION, nSaveDCBonus);
|
|
}
|
|
if (nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_PYROCLASTIC) DiscBreath = CreateBreath(oPC, IsLineBreath(), fRange, DAMAGE_TYPE_SONIC, 8, nDamageDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_PYROCLASTIC);
|
|
if (nSubTemplate == TEMPLATE_HDRAGON_OBSCURE_SHADOW) DiscBreath = CreateBreath(oPC, IsLineBreath(), fRange, -1, 8, nDamageDice, ABILITY_CONSTITUTION, nSaveDCBonus, BREATH_SHADOW);
|
|
|
|
//actual breath effect
|
|
ApplyBreath(DiscBreath, PRCGetSpellTargetLocation());
|
|
|
|
//breath VFX
|
|
//effect eVis = EffectVisualEffect(1332);
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, PRCGetSpellTargetLocation());
|
|
|
|
if(GetHasFeat(FEAT_FULL_DRAGON_BREATH, oPC))
|
|
{
|
|
// Schedule opening the delay lock
|
|
float fDelay = RoundsToSeconds(DiscBreath.nRoundsUntilRecharge);
|
|
IncrementRemainingFeatUses(oPC, FEAT_TEMPLATE_HALF_DRAGON_BREATH);
|
|
SendMessageToPC(oPC, "Your breath weapon will be ready again in " + IntToString(DiscBreath.nRoundsUntilRecharge) + " rounds.");
|
|
// Set the lock
|
|
SetLocalInt(oPC, HDRAGBREATHLOCK, TRUE);
|
|
|
|
DelayCommand(fDelay, DeleteLocalInt(oPC, HDRAGBREATHLOCK));
|
|
DelayCommand(fDelay, SendMessageToPC(oPC, "Your breath weapon is ready now"));
|
|
}
|
|
else
|
|
SetLocalInt(oPC, "TemplateSLA_"+IntToString(GetSpellId()), 1);
|
|
}
|
|
|