Initial upload. PRC8 has been added. Module compiles, PRC's default AI & treasure scripts have been integrated. Started work on top hak for SLA / Ability / Scripting modifications.
558 lines
12 KiB
Plaintext
558 lines
12 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);
|
|
|
|
// Songbird sings wooo!
|
|
object oSongbird=GetLocalObject(OBJECT_SELF,"oSongbird");
|
|
if (GetIsObjectValid(oSongbird)&&!GetIsDead(oSongbird)&&(GetArea(oSongbird)==GetArea(OBJECT_SELF)))
|
|
{
|
|
effect FeySong = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, FeySong, oSongbird,6.0);
|
|
|
|
AssignCommand(oSongbird,PlaySound("sce_neutral"));
|
|
|
|
}
|
|
|
|
//Declare major variables
|
|
int nLevel = GetLevelByClass(CLASS_TYPE_BARD)+GetLevelByClass(CLASS_TYPE_HARPER);
|
|
int nRanks = GetSkillRank(SKILL_PERFORM);
|
|
int nChr = GetAbilityModifier(ABILITY_CHARISMA);
|
|
int nPerform = nRanks;
|
|
int nDuration = 10 + nChr;
|
|
|
|
effect eAttack;
|
|
effect eDamage;
|
|
effect eWill;
|
|
effect eFort;
|
|
effect eReflex;
|
|
effect eHP;
|
|
effect eAC;
|
|
effect eSkill;
|
|
|
|
int nAttack;
|
|
int nDamage;
|
|
int nWill;
|
|
int nFort;
|
|
int nReflex;
|
|
int nHP;
|
|
int nAC;
|
|
int nSkill;
|
|
//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;
|
|
}
|
|
|
|
|
|
// bardy gloves Palmer made
|
|
if (GetTag(GetItemInSlot(INVENTORY_SLOT_ARMS))=="jw_newitem2")
|
|
{
|
|
SendMessageToPC(OBJECT_SELF,"The elven gloves of the bard boost the power of your song.");
|
|
nPerform=nPerform+6;
|
|
nLevel=nLevel+3;
|
|
}
|
|
|
|
|
|
//SpeakString("Level: " + IntToString(nLevel) + " Ranks: " + IntToString(nRanks));
|
|
|
|
if(nPerform >= 100 && nLevel >= 30)
|
|
{
|
|
nAttack = 6;
|
|
nDamage = 6;
|
|
nWill = 5;
|
|
nFort = 5;
|
|
nReflex = 5;
|
|
nHP = 78;
|
|
nAC = 7;
|
|
nSkill = 19;
|
|
}
|
|
else if(nPerform >= 95 && nLevel >= 29)
|
|
{
|
|
nAttack = 5;
|
|
nDamage = 5;
|
|
nWill = 5;
|
|
nFort = 5;
|
|
nReflex = 5;
|
|
nHP = 72;
|
|
nAC = 7;
|
|
nSkill = 18;
|
|
}
|
|
else if(nPerform >= 90 && nLevel >= 28)
|
|
{
|
|
nAttack = 5;
|
|
nDamage = 5;
|
|
nWill = 5;
|
|
nFort = 5;
|
|
nReflex = 5;
|
|
nHP = 72;
|
|
nAC = 6;
|
|
nSkill = 17;
|
|
}
|
|
else if(nPerform >= 85 && nLevel >= 27)
|
|
{
|
|
nAttack = 4;
|
|
nDamage = 4;
|
|
nWill = 5;
|
|
nFort = 5;
|
|
nReflex = 5;
|
|
nHP = 72;
|
|
nAC = 6;
|
|
nSkill = 16;
|
|
}
|
|
else if(nPerform >= 80 && nLevel >= 26)
|
|
{
|
|
nAttack = 4;
|
|
nDamage = 4;
|
|
nWill = 5;
|
|
nFort = 5;
|
|
nReflex = 5;
|
|
nHP = 72;
|
|
nAC = 6;
|
|
nSkill = 15;
|
|
}
|
|
else if(nPerform >= 75 && nLevel >= 25)
|
|
{
|
|
nAttack = 4;
|
|
nDamage = 4;
|
|
nWill = 4;
|
|
nFort = 4;
|
|
nReflex = 4;
|
|
nHP = 72;
|
|
nAC = 6;
|
|
nSkill = 14;
|
|
}
|
|
else if(nPerform >= 70 && nLevel >= 24)
|
|
{
|
|
nAttack = 4;
|
|
nDamage = 4;
|
|
nWill = 4;
|
|
nFort = 4;
|
|
nReflex = 4;
|
|
nHP = 68;
|
|
nAC = 6;
|
|
nSkill = 13;
|
|
}
|
|
else if(nPerform >= 65 && nLevel >= 23)
|
|
{
|
|
nAttack = 4;
|
|
nDamage = 4;
|
|
nWill = 4;
|
|
nFort = 3;
|
|
nReflex = 3;
|
|
nHP = 68;
|
|
nAC = 6;
|
|
nSkill = 12;
|
|
}
|
|
else if(nPerform >= 60 && nLevel >= 22)
|
|
{
|
|
nAttack = 3;
|
|
nDamage = 4;
|
|
nWill = 4;
|
|
nFort = 3;
|
|
nReflex = 3;
|
|
nHP = 68;
|
|
nAC = 6;
|
|
nSkill = 11;
|
|
}
|
|
|
|
else if
|
|
(nPerform >= 60 && nLevel > 20)
|
|
{
|
|
nAttack = 3;
|
|
nDamage = 4;
|
|
nWill = 4;
|
|
nFort = 3;
|
|
nReflex = 3;
|
|
nHP = 68;
|
|
nAC = 6;
|
|
nSkill = 11;
|
|
|
|
}
|
|
|
|
|
|
else if(nPerform >= 55 && nLevel >= 20)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 30;
|
|
nAC = 5;
|
|
nSkill = 9;
|
|
}
|
|
if(nPerform >= 50 && nLevel >= 20)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 28;
|
|
nAC = 5;
|
|
nSkill = 8;
|
|
}
|
|
else if(nPerform >= 45 && nLevel >= 19)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 26;
|
|
nAC = 5;
|
|
nSkill = 7;
|
|
}
|
|
else if(nPerform >= 40 && nLevel >= 18)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 24;
|
|
nAC = 5;
|
|
nSkill = 6;
|
|
}
|
|
else if(nPerform >= 35 && nLevel >= 17)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 22;
|
|
nAC = 5;
|
|
nSkill = 5;
|
|
}
|
|
else if(nPerform >= 30 && nLevel >= 16)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 20;
|
|
nAC = 5;
|
|
nSkill = 4;
|
|
}
|
|
else if(nPerform >= 24 && nLevel >= 15)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 2;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 16;
|
|
nAC = 4;
|
|
nSkill = 3;
|
|
}
|
|
else if(nPerform >= 21 && nLevel >= 14)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 16;
|
|
nAC = 3;
|
|
nSkill = 2;
|
|
}
|
|
if(nPerform >= 60 && nLevel > 20)
|
|
{
|
|
nAttack = 3;
|
|
nDamage = 4;
|
|
nWill = 4;
|
|
nFort = 3;
|
|
nReflex = 3;
|
|
nHP = 68;
|
|
nAC = 6;
|
|
nSkill = 11;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(nPerform >= 60 && nLevel >= 20)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 60;
|
|
nAC = 5;
|
|
nSkill = 10;
|
|
}
|
|
else if(nPerform >= 55 && nLevel >= 20)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 54;
|
|
nAC = 5;
|
|
nSkill = 9;
|
|
}
|
|
else if(nPerform >= 50 && nLevel >= 20)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 48;
|
|
nAC = 5;
|
|
nSkill = 8;
|
|
}
|
|
else if(nPerform >= 45 && nLevel >= 19)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 42;
|
|
nAC = 5;
|
|
nSkill = 7;
|
|
}
|
|
else if(nPerform >= 40 && nLevel >= 18)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 36;
|
|
nAC = 5;
|
|
nSkill = 6;
|
|
}
|
|
else if(nPerform >= 35 && nLevel >= 17)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 28;
|
|
nAC = 5;
|
|
nSkill = 5;
|
|
}
|
|
else if(nPerform >= 30 && nLevel >= 16)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 24;
|
|
nAC = 5;
|
|
nSkill = 4;
|
|
}
|
|
else if(nPerform >= 24 && nLevel >= 15)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 2;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 20;
|
|
nAC = 4;
|
|
nSkill = 3;
|
|
}
|
|
else if(nPerform >= 21 && nLevel >= 14)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 18;
|
|
nAC = 3;
|
|
nSkill = 2;
|
|
}
|
|
else if(nPerform >= 18 && nLevel >= 12)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 15;
|
|
nAC = 2;
|
|
nSkill = 2;
|
|
}
|
|
else if(nPerform >= 15 && nLevel >= 8)
|
|
{
|
|
nAttack = 2;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 10;
|
|
nAC = 0;
|
|
nSkill = 1;
|
|
}
|
|
else if(nPerform >= 12 && nLevel >= 6)
|
|
{
|
|
nAttack = 1;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 5;
|
|
nAC = 0;
|
|
nSkill = 1;
|
|
}
|
|
else if(nPerform >= 9 && nLevel >= 3)
|
|
{
|
|
nAttack = 1;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 0;
|
|
nHP = 4;
|
|
nAC = 0;
|
|
nSkill = 0;
|
|
}
|
|
else if(nPerform >= 6 && nLevel >= 2)
|
|
{
|
|
nAttack = 1;
|
|
nDamage = 1;
|
|
nWill = 1;
|
|
nFort = 0;
|
|
nReflex = 0;
|
|
nHP = 3;
|
|
nAC = 0;
|
|
nSkill = 0;
|
|
}
|
|
else if(nPerform >= 3 && nLevel >= 1)
|
|
{
|
|
nAttack = 1;
|
|
nDamage = 1;
|
|
nWill = 0;
|
|
nFort = 0;
|
|
nReflex = 0;
|
|
nHP = 2;
|
|
nAC = 0;
|
|
nSkill = 0;
|
|
}
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
eAttack = EffectAttackIncrease(nAttack);
|
|
eDamage = EffectDamageIncrease(nDamage, DAMAGE_TYPE_BLUDGEONING);
|
|
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);
|
|
}
|
|
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));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|