//:://///////////////////////////////////////////// //:: 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)); } }