PRC8/nwn/nwnprc/trunk/scripts/prc_drgshm_breth.nss
Jaysyn904 418204bc40 Fixed Dragon Shaman breath weapon
Fixed Dragon Shaman breath weapon.  Script name was inexplicably too long.
2024-08-30 13:36:45 -04:00

152 lines
5.5 KiB
Plaintext

//:://////////////////////////////////////////////////////
//:: Breath Weapon for Dragon Shaman Class
//:: prc_drgshm_breth.nss
//:://////////////////////////////////////////////////////
#include "prc_inc_spells"
#include "prc_inc_breath"
#include "prc_inc_dragsham"
//////////////////////////
// Constant Definitions //
//////////////////////////
const string DSHMBREATHLOCK = "DragonShamanBreathLock";
int IsLineBreath(int nTotem)
{
if(nTotem == FEAT_DRAGONSHAMAN_BLACK
|| nTotem == FEAT_DRAGONSHAMAN_BLUE
|| nTotem == FEAT_DRAGONSHAMAN_BRASS
|| nTotem == FEAT_DRAGONSHAMAN_BRONZE
|| nTotem == FEAT_DRAGONSHAMAN_COPPER
)
return TRUE;
return FALSE;
}
// PHB II Dragon Shaman has no mention of size being taken into account with breath weapons on players. Once this
// is looked at further, this may or may not be taken into account. These rules are gone over in more detail
// in the draconomicon which has a lot more rules for dragon breath weapons.
/* 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()
{
//Declare main variables.
object oPC = OBJECT_SELF;
int nSpellID = GetSpellId();
int nTotem = GetLocalInt(oPC, "DragonShamanTotem");
int nDamageType = GetDragonDamageType(nTotem);
if(nSpellID == SPELL_DRAGON_SHAMAN_BREATH)
{
// Check the dragon breath delay lock
if(GetLocalInt(oPC, DSHMBREATHLOCK))
{
SendMessageToPC(oPC, "You cannot use your breath weapon again so soon"); /// TODO: TLKify
return;
}
int nBreath;
switch(nDamageType)
{
case DAMAGE_TYPE_ACID: nBreath = SPELL_DRAGON_SHAMAN_BREATH_ACID; break;
case DAMAGE_TYPE_COLD: nBreath = SPELL_DRAGON_SHAMAN_BREATH_COLD; break;
case DAMAGE_TYPE_ELECTRICAL: nBreath = SPELL_DRAGON_SHAMAN_BREATH_ELEC; break;
case DAMAGE_TYPE_FIRE: nBreath = SPELL_DRAGON_SHAMAN_BREATH_FIRE; break;
}
object oTarget = GetSpellTargetObject();
if(GetIsObjectValid(oTarget))
AssignCommand(oPC, ActionCastSpellAtObject(nBreath, oTarget, METAMAGIC_ANY, TRUE));
else
AssignCommand(oPC, ActionCastSpellAtLocation(nBreath, GetSpellTargetLocation(), METAMAGIC_ANY, TRUE));
}
else
{
int nLevel = GetLevelByClass(CLASS_TYPE_DRAGON_SHAMAN, oPC);
struct breath ShamanBreath;
// Set the lock
SetLocalInt(oPC, DSHMBREATHLOCK, TRUE);
float fRange;
//set the breath range
if(nLevel > 19)
fRange = 60.0;
else if(nLevel > 11)
fRange = 30.0;
else
fRange = 15.0;
if(IsLineBreath(nTotem)) fRange = fRange * 2.0;
//Sets the save DC for Dragon Breath attacks. This is a reflex save to halve the damage.
//Save is 10+CON+1/2 Dragon Shaman level.
int nSaveDCBoost = nLevel / 2;
//starts with 2 dice at level 4
int nDamageDice = 2;
//Gets one more die every 2 levels
nDamageDice += (nLevel - 4) / 2;
ShamanBreath = CreateBreath(oPC, IsLineBreath(nTotem), fRange, nDamageType, 6, nDamageDice, ABILITY_CONSTITUTION, nSaveDCBoost);
ApplyBreath(ShamanBreath, PRCGetSpellTargetLocation());
//breath VFX
/* - Taken out until we have real breath VFX - Fox
effect eVis;
if(GetHasFeat(FEAT_DRAGONSHAMAN_RED, oPC) || GetHasFeat(FEAT_DRAGONSHAMAN_GOLD, oPC))
{
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND);
}
else if(GetHasFeat(FEAT_DRAGONSHAMAN_BLUE, oPC) || GetHasFeat(FEAT_DRAGONSHAMAN_BRONZE, oPC))
{
eVis = EffectVisualEffect(VFX_BEAM_LIGHTNING);
}
else if(GetHasFeat(FEAT_DRAGONSHAMAN_BLACK, oPC) || GetHasFeat(FEAT_DRAGONSHAMAN_COPPER, oPC))
{
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND);
}
else if(GetHasFeat(FEAT_DRAGONSHAMAN_WHITE, oPC) || GetHasFeat(FEAT_DRAGONSHAMAN_SILVER, oPC))
{
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND);
}
else if(GetHasFeat(FEAT_DRAGONSHAMAN_BRASS, oPC))
{
eVis = EffectVisualEffect(VFX_BEAM_FIRE_W);
}
else if(GetHasFeat(FEAT_DRAGONSHAMAN_GREEN, oPC))
{
eVis = EffectVisualEffect(VFX_FNF_DRAGBREATHGROUND);
}
// Apply the visual effect.
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eVis, GetSpellTargetLocation());
*/
// Schedule opening the delay lock
float fDelay = RoundsToSeconds(ShamanBreath.nRoundsUntilRecharge);
SendMessageToPC(oPC, IntToString(ShamanBreath.nRoundsUntilRecharge) + " rounds until you can use your breath.");
DelayCommand(fDelay, DeleteLocalInt(oPC, DSHMBREATHLOCK));
DelayCommand(fDelay, FloatingTextStringOnCreature("Your breath weapon is ready now!", oPC, FALSE));
}
}