Alangara_PRC8/_removed/NW_S2_BARDSONG.nss
Jaysyn904 86feb9ca6f Initial commit
Initial commit.
2024-06-05 21:21:06 -04:00

658 lines
15 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Bard Song
//:: NW_S2_BardSong
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This spells applies bonuses to all of the
bard's allies within 30ft for a set duration of
10 rounds.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Feb 25, 2002
//:://////////////////////////////////////////////
//:: Last Updated By: Georg Zoeller Oct 1, 2003
/*
bugfix by Kovi 2002.07.30
- loosing temporary hp resulted in loosing the other bonuses
*/
#include "x0_i0_spells"
void main()
{
if (GetHasEffect(EFFECT_TYPE_SILENCE,OBJECT_SELF))
{
FloatingTextStrRefOnCreature(85764,OBJECT_SELF); // not useable when silenced
return;
}
string sTag = GetTag(OBJECT_SELF);
if (sTag == "x0_hen_dee" || sTag == "x2_hen_deekin")
{
// * Deekin has a chance of singing a doom song
// * same effect, better tune
if (Random(100) + 1 > 80)
{
// the Xp2 Deekin knows more than one doom song
if (d3() ==1 && sTag == "x2_hen_deekin")
{
DelayCommand(0.0, PlaySound("vs_nx2deekM_050"));
}
else
{
DelayCommand(0.0, PlaySound("vs_nx0deekM_074"));
DelayCommand(5.0, PlaySound("vs_nx0deekM_074"));
}
}
}
//Declare major variables
int nLevel = GetLevelByClass(CLASS_TYPE_BARD);
int nRanks = GetSkillRank(SKILL_PERFORM);
int nChr = GetAbilityModifier(ABILITY_CHARISMA);
int nPerform = nRanks;
int nDuration = 20 + nChr;
effect eAttack;
effect eDamage;
effect eWill;
effect eFort;
effect eReflex;
effect eHP;
effect eAC;
effect eSkill;
effect eRegeneration;
int nAttack;
int nDamage;
int nWill;
int nFort;
int nReflex;
int nHP;
int nAC;
int nSkill;
int nRegenerate;
//Check to see if the caster has Lasting Impression and increase duration.
if(GetHasFeat(870))
{
nDuration *= 10;
}
// lingering song
if(GetHasFeat(424)) // lingering song
{
nDuration += 5;
}
//SpeakString("Level: " + IntToString(nLevel) + " Ranks: " + IntToString(nRanks));
if(nPerform >= 40 && nLevel >= 40)
{
nAttack = 12;
nDamage = 30;
nWill = 8;
nFort = 8;
nReflex = 8;
nHP = 400;
nAC = 8;
nSkill = 8;
nRegenerate = 15;
}
else if(nPerform >= 39 && nLevel >= 39)
{
nAttack = 11;
nDamage = 30;
nWill = 7;
nFort = 7;
nReflex = 7;
nHP = 385;
nAC = 7;
nSkill = 6;
nRegenerate = 10;
}
else if(nPerform >= 38 && nLevel >= 38)
{
nAttack = 11;
nDamage = 30;
nWill = 7;
nFort = 7;
nReflex = 7;
nHP = 370;
nAC = 6;
nSkill = 6;
nRegenerate = 10;
}
else if(nPerform >= 37 && nLevel >= 37)
{
nAttack = 11;
nDamage = 30;
nWill = 7;
nFort = 7;
nReflex = 7;
nHP = 355;
nAC = 6;
nSkill = 6;
nRegenerate = 10;
}
else if(nPerform >= 36 && nLevel >= 36)
{
nAttack = 11;
nDamage = 30;
nWill = 6;
nFort = 6;
nReflex = 6;
nHP = 340;
nAC = 6;
nSkill = 6;
nRegenerate = 10;
}
else if(nPerform >= 35 && nLevel >= 35)
{
nAttack = 11;
nDamage = 15;
nWill = 6;
nFort = 6;
nReflex = 6;
nHP = 325;
nAC = 6;
nSkill = 6;
nRegenerate = 10;
}
else if(nPerform >= 34 && nLevel >= 34)
{
nAttack = 10;
nDamage = 15;
nWill = 6;
nFort = 6;
nReflex = 6;
nHP = 310;
nAC = 6;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 33 && nLevel >= 33)
{
nAttack = 10;
nDamage = 15;
nWill = 6;
nFort = 6;
nReflex = 6;
nHP = 295;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 32 && nLevel >= 32)
{
nAttack = 10;
nDamage = 15;
nWill = 6;
nFort = 6;
nReflex = 6;
nHP = 280;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 31 && nLevel >= 31)
{
nAttack = 10;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 265;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 30 && nLevel >= 30)
{
nAttack = 10;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 250;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 29 && nLevel >= 29)
{
nAttack = 8;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 235;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 28 && nLevel >= 28)
{
nAttack = 8;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 220;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 27 && nLevel >= 27)
{
nAttack = 8;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 205;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 26 && nLevel >= 26)
{
nAttack = 8;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 190;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 25 && nLevel >= 25)
{
nAttack = 8;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 175;
nAC = 5;
nSkill = 5;
nRegenerate = 10;
}
else if(nPerform >= 24 && nLevel >= 24)
{
nAttack = 7;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 160;
nAC = 5;
nSkill = 4;
nRegenerate = 10;
}
else if(nPerform >= 23 && nLevel >= 23)
{
nAttack = 7;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 145;
nAC = 4;
nSkill = 4;
nRegenerate = 10;
}
else if(nPerform >= 22 && nLevel >= 22)
{
nAttack = 7;
nDamage = 15;
nWill = 5;
nFort = 5;
nReflex = 5;
nHP = 130;
nAC = 4;
nSkill = 4;
nRegenerate = 10;
}
else if(nPerform >= 21 && nLevel >= 21)
{
nAttack = 7;
nDamage = 15;
nWill = 4;
nFort = 4;
nReflex = 4;
nHP = 115;
nAC = 4;
nSkill = 4;
nRegenerate = 10;
}
else if(nPerform >= 20 && nLevel >= 20)
{
nAttack = 7;
nDamage = 20;
nWill = 4;
nFort = 4;
nReflex = 4;
nHP = 100;
nAC = 4;
nSkill = 4;
nRegenerate = 10;
}
else if(nPerform >= 19 && nLevel >= 19)
{
nAttack = 4;
nDamage = 20;
nWill = 4;
nFort = 4;
nReflex = 4;
nHP = 50;
nAC = 4;
nSkill = 3;
nRegenerate = 4;
}
else if(nPerform >= 18 && nLevel >= 18)
{
nAttack = 4;
nDamage = 19;
nWill = 4;
nFort = 4;
nReflex = 4;
nHP = 45;
nAC = 3;
nSkill = 3;
nRegenerate = 4;
}
else if(nPerform >= 17 && nLevel >= 17)
{
nAttack = 4;
nDamage = 19;
nWill = 4;
nFort = 4;
nReflex = 4;
nHP = 45;
nAC = 3;
nSkill = 3;
nRegenerate = 4;
}
else if(nPerform >= 16 && nLevel >= 16)
{
nAttack = 4;
nDamage = 18;
nWill = 3;
nFort = 3;
nReflex = 3;
nHP = 40;
nAC = 3;
nSkill = 3;
nRegenerate = 4;
}
else if(nPerform >= 15 && nLevel >= 15)
{
nAttack = 4;
nDamage = 18;
nWill = 3;
nFort = 3;
nReflex = 3;
nHP = 40;
nAC = 3;
nSkill = 3;
nRegenerate = 4;
}
else if(nPerform >= 14 && nLevel >= 14)
{
nAttack = 3;
nDamage = 17;
nWill = 3;
nFort = 3;
nReflex = 3;
nHP = 35;
nAC = 3;
nSkill = 2;
nRegenerate = 3;
}
else if(nPerform >= 13 && nLevel >= 13)
{
nAttack = 3;
nDamage = 17;
nWill = 3;
nFort = 3;
nReflex = 3;
nHP = 35;
nAC = 2;
nSkill = 2;
nRegenerate = 3;
}
else if(nPerform >= 12 && nLevel >= 12)
{
nAttack = 3;
nDamage = 16;
nWill = 3;
nFort = 3;
nReflex = 3;
nHP = 30;
nAC = 2;
nSkill = 2;
nRegenerate = 3;
}
else if(nPerform >= 11 && nLevel >= 11)
{
nAttack = 3;
nDamage = 16;
nWill = 2;
nFort = 2;
nReflex = 2;
nHP = 30;
nAC = 2;
nSkill = 2;
nRegenerate = 3;
}
else if(nPerform >= 10 && nLevel >= 10)
{
nAttack = 3;
nDamage = 5;
nWill = 2;
nFort = 2;
nReflex = 2;
nHP = 25;
nAC = 2;
nSkill = 2;
nRegenerate = 3;
}
else if(nPerform >= 9 && nLevel >= 9)
{
nAttack = 2;
nDamage = 5;
nWill = 2;
nFort = 2;
nReflex = 2;
nHP = 25;
nAC = 2;
nSkill = 1;
nRegenerate = 2;
}
else if(nPerform >= 8 && nLevel >= 8)
{
nAttack = 2;
nDamage = 4;
nWill = 2;
nFort = 2;
nReflex = 2;
nHP = 20;
nAC = 1;
nSkill = 1;
nRegenerate = 2;
}
else if(nPerform >= 7 && nLevel >= 7)
{
nAttack = 2;
nDamage = 4;
nWill = 2;
nFort = 2;
nReflex = 2;
nHP = 20;
nAC = 1;
nSkill = 1;
nRegenerate = 2;
}
else if(nPerform >= 6 && nLevel >= 6)
{
nAttack = 2;
nDamage = 3;
nWill = 1;
nFort = 1;
nReflex = 1;
nHP = 15;
nAC = 1;
nSkill = 1;
nRegenerate = 2;
}
else if(nPerform >= 5 && nLevel >= 5)
{
nAttack = 2;
nDamage = 3;
nWill = 2;
nFort = 2;
nReflex = 2;
nHP = 15;
nAC = 1;
nSkill = 1;
nRegenerate = 2;
}
else if(nPerform >= 4 && nLevel >= 4)
{
nAttack = 1;
nDamage = 2;
nWill = 1;
nFort = 1;
nReflex = 1;
nHP = 10;
nAC = 1;
nSkill = 1;
nRegenerate = 1;
}
else if(nPerform >= 3 && nLevel >= 3)
{
nAttack = 1;
nDamage = 2;
nWill = 1;
nFort = 1;
nReflex = 1;
nHP = 10;
nAC = 1;
nSkill = 1;
nRegenerate = 1;
}
else if(nPerform >= 2 && nLevel >= 2)
{
nAttack = 1;
nDamage = 1;
nWill = 1;
nFort = 1;
nReflex = 1;
nHP = 5;
nAC = 1;
nSkill = 1;
nRegenerate = 1;
}
else if(nPerform >= 1 && nLevel >= 1)
{
nAttack = 1;
nDamage = 1;
nWill = 1;
nFort = 1;
nReflex = 1;
nHP = 5;
nAC = 1;
nSkill = 1;
nRegenerate = 1;
}
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
eAttack = EffectAttackIncrease(nAttack);
eDamage = EffectDamageIncrease(nDamage, DAMAGE_TYPE_SONIC);
effect eLink = EffectLinkEffects(eAttack, eDamage);
if(nWill > 0)
{
eWill = EffectSavingThrowIncrease(SAVING_THROW_WILL, nWill);
eLink = EffectLinkEffects(eLink, eWill);
}
if(nFort > 0)
{
eFort = EffectSavingThrowIncrease(SAVING_THROW_FORT, nFort);
eLink = EffectLinkEffects(eLink, eFort);
}
if(nReflex > 0)
{
eReflex = EffectSavingThrowIncrease(SAVING_THROW_REFLEX, nReflex);
eLink = EffectLinkEffects(eLink, eReflex);
}
if(nHP > 0)
{
//SpeakString("HP Bonus " + IntToString(nHP));
eHP = EffectTemporaryHitpoints(nHP);
// eLink = EffectLinkEffects(eLink, eHP);
}
if(nAC > 0)
{
eAC = EffectACIncrease(nAC, AC_DODGE_BONUS);
eLink = EffectLinkEffects(eLink, eAC);
}
if(nSkill > 0)
{
eSkill = EffectSkillIncrease(SKILL_ALL_SKILLS, nSkill);
eLink = EffectLinkEffects(eLink, eSkill);
}
if(nRegenerate > 0)
{
eRegeneration = EffectRegenerate(nRegenerate, 6.0f);
eLink = EffectLinkEffects(eLink, eRegeneration);
}
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
eLink = EffectLinkEffects(eLink, eDur);
effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_SONIC);
effect eFNF = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30);
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, GetLocation(OBJECT_SELF));
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF));
eHP = ExtraordinaryEffect(eHP);
eLink = ExtraordinaryEffect(eLink);
while(GetIsObjectValid(oTarget))
{
if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(GetSpellId(),oTarget))
{
// * GZ Oct 2003: If we are silenced, we can not benefit from bard song
if (!GetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !GetHasEffect(EFFECT_TYPE_DEAF,oTarget))
{
if(oTarget == OBJECT_SELF)
{
effect eLinkBard = EffectLinkEffects(eLink, eVis);
eLinkBard = ExtraordinaryEffect(eLinkBard);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLinkBard, oTarget, RoundsToSeconds(nDuration));
if (nHP > 0)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oTarget, RoundsToSeconds(nDuration));
}
}
else if(GetIsFriend(oTarget))
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration));
if (nHP > 0)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oTarget, RoundsToSeconds(nDuration));
}
}
}
}
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF));
}
}