Further file organization
Further file organization
This commit is contained in:
152
nwn/nwnprc/trunk/scripts/prc_drgshm_breath.nss
Normal file
152
nwn/nwnprc/trunk/scripts/prc_drgshm_breath.nss
Normal file
@@ -0,0 +1,152 @@
|
||||
//:://////////////////////////////////////////////////////
|
||||
//:: Breath Weapon for Dragon Shaman Class
|
||||
//:: prc_drgshm_breath.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));
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user