generated from Jaysyn/ModuleTemplate
908 lines
33 KiB
Plaintext
908 lines
33 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Custom Bardsong Library
|
|
//:: inc_bardsong
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Kilana Evra
|
|
//:: Created On:
|
|
//:://////////////////////////////////////////////
|
|
#include "x0_i0_spells"
|
|
#include "inc_utility"
|
|
|
|
//:://////////////////////////////////////////////
|
|
//:: Internal Functions
|
|
//:://////////////////////////////////////////////
|
|
int GetPierceSlash(object oItem)
|
|
{ int nCheck = GetBaseItemType(oItem);
|
|
int nResult = 0;
|
|
switch(nCheck)
|
|
{ case BASE_ITEM_BASTARDSWORD: nResult=1; break;
|
|
case BASE_ITEM_BATTLEAXE: nResult=1; break;
|
|
case BASE_ITEM_DAGGER: nResult=1; break;
|
|
case BASE_ITEM_DOUBLEAXE: nResult=1; break;
|
|
case BASE_ITEM_DWARVENWARAXE: nResult=1; break;
|
|
case BASE_ITEM_GREATAXE: nResult=1; break;
|
|
case BASE_ITEM_GREATSWORD: nResult=1; break;
|
|
case BASE_ITEM_HALBERD: nResult=1; break;
|
|
case BASE_ITEM_HANDAXE: nResult=1; break;
|
|
case BASE_ITEM_KAMA: nResult=1; break;
|
|
case BASE_ITEM_KATANA: nResult=1; break;
|
|
case BASE_ITEM_KUKRI: nResult=1; break;
|
|
case BASE_ITEM_LONGSWORD: nResult=1; break;
|
|
case BASE_ITEM_RAPIER: nResult=1; break;
|
|
case BASE_ITEM_SCIMITAR: nResult=1; break;
|
|
case BASE_ITEM_SCYTHE: nResult=1; break;
|
|
case BASE_ITEM_SHORTSPEAR: nResult=1; break;
|
|
case BASE_ITEM_SHORTSWORD: nResult=1; break;
|
|
case BASE_ITEM_SICKLE: nResult=1; break;
|
|
case BASE_ITEM_TRIDENT: nResult=1; break;
|
|
case BASE_ITEM_TWOBLADEDSWORD: nResult=1; break;
|
|
case BASE_ITEM_WHIP: nResult=1; break;
|
|
|
|
//Throwing Ranged - Comment out if unwanted
|
|
case BASE_ITEM_THROWINGAXE: nResult=1; break;
|
|
case BASE_ITEM_SHURIKEN: nResult=1; break;
|
|
case BASE_ITEM_DART: nResult=1; break;
|
|
|
|
//CEP Special
|
|
case 309: nResult=1; break; //Assassin Dagger
|
|
case 321: nResult=1; break; //Double Scimitar
|
|
case 305: nResult=1; break; //Falchion1
|
|
case 316: nResult=1; break; //Falchion2
|
|
case 322: nResult=1; break; //Goad
|
|
case 301: nResult=1; break; //Heavy Pick
|
|
case 310: nResult=1; break; //Katar
|
|
case 313: nResult=1; break; //Kukri2
|
|
case 302: nResult=1; break; //Light Pick
|
|
case 320: nResult=1; break; //Mercurial Greatsword
|
|
case 319: nResult=1; break; //Mercurial Longsword
|
|
case 303: nResult=1; break; //Sai
|
|
case 300: nResult=1; break; //Trident 1H
|
|
case 323: nResult=1; break; //WindFire Wheel
|
|
}
|
|
return nResult;
|
|
}
|
|
|
|
int GetBludge(object oItem)
|
|
{ int nResult = 0;
|
|
int nCheck = GetBaseItemType(oItem);
|
|
switch(nCheck)
|
|
{ case BASE_ITEM_CLUB: nResult=1; break;
|
|
case BASE_ITEM_DIREMACE: nResult=1; break;
|
|
case BASE_ITEM_HEAVYFLAIL: nResult=1; break;
|
|
case BASE_ITEM_LIGHTHAMMER: nResult=1; break;
|
|
case BASE_ITEM_LIGHTMACE: nResult=1; break;
|
|
case BASE_ITEM_LIGHTFLAIL: nResult=1; break;
|
|
case BASE_ITEM_MORNINGSTAR: nResult=1; break;
|
|
case BASE_ITEM_QUARTERSTAFF: nResult=1; break;
|
|
case BASE_ITEM_WARHAMMER: nResult=1; break;
|
|
|
|
//CEP
|
|
case 304: nResult=1; break; //Nunchaku
|
|
case 308: nResult=1; break; //Sap
|
|
case 312: nResult=1; break; //LightMace2
|
|
case 317: nResult=1; break; //Heavy Mace
|
|
case 318: nResult=1; break; //Maul
|
|
}
|
|
return nResult;
|
|
}
|
|
|
|
int WeapDamageBonus(int nSongStrength)
|
|
{ int nResult = IP_CONST_DAMAGEBONUS_1;
|
|
switch(nSongStrength)
|
|
{ case 2: nResult = IP_CONST_DAMAGEBONUS_2; break;
|
|
case 3: nResult = IP_CONST_DAMAGEBONUS_1d4; break;
|
|
case 4: nResult = IP_CONST_DAMAGEBONUS_3; break;
|
|
case 5: nResult = IP_CONST_DAMAGEBONUS_1d6; break;
|
|
case 6: nResult = IP_CONST_DAMAGEBONUS_4; break;
|
|
case 7: nResult = IP_CONST_DAMAGEBONUS_1d8; break;
|
|
case 8: nResult = IP_CONST_DAMAGEBONUS_2d4; break;
|
|
case 9: nResult = IP_CONST_DAMAGEBONUS_5; break;
|
|
case 10: nResult = IP_CONST_DAMAGEBONUS_1d10; break;
|
|
case 11: nResult = IP_CONST_DAMAGEBONUS_1d12; break;
|
|
case 12: nResult = IP_CONST_DAMAGEBONUS_2d6; break;
|
|
case 13: nResult = IP_CONST_DAMAGEBONUS_6; break;
|
|
case 14: nResult = IP_CONST_DAMAGEBONUS_7; break;
|
|
case 15: nResult = IP_CONST_DAMAGEBONUS_2d8; break;
|
|
case 16: nResult = IP_CONST_DAMAGEBONUS_8; break;
|
|
case 17: nResult = IP_CONST_DAMAGEBONUS_9; break;
|
|
case 18: nResult = IP_CONST_DAMAGEBONUS_2d10; break;
|
|
case 19: nResult = IP_CONST_DAMAGEBONUS_10; break;
|
|
case 20: nResult = IP_CONST_DAMAGEBONUS_2d12; break;
|
|
case 21: nResult = IP_CONST_DAMAGEBONUS_2d12; break;
|
|
case 22: nResult = IP_CONST_DAMAGEBONUS_2d12; break;
|
|
case 23: nResult = IP_CONST_DAMAGEBONUS_2d12; break;
|
|
}
|
|
return nResult;
|
|
}
|
|
|
|
//////////////////////////////////////////////////
|
|
|
|
//Default Bioware Bardsong
|
|
void SongInspire(object oPC, int nSongStrength, int nDuration)
|
|
{ int nAttack, nDamage, nWill, nFort, nReflex, nHP, nAC, nSkill;
|
|
|
|
if(nSongStrength==23)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 48;
|
|
nAC = 7;
|
|
nSkill = 19;
|
|
}
|
|
else if(nSongStrength==22)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 46;
|
|
nAC = 6;
|
|
nSkill = 18;
|
|
}
|
|
else if(nSongStrength==21)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 44;
|
|
nAC = 6;
|
|
nSkill = 17;
|
|
}
|
|
else if(nSongStrength==20)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 42;
|
|
nAC = 6;
|
|
nSkill = 16;
|
|
}
|
|
else if(nSongStrength==19)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 40;
|
|
nAC = 6;
|
|
nSkill = 15;
|
|
}
|
|
else if(nSongStrength==18)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 38;
|
|
nAC = 6;
|
|
nSkill = 14;
|
|
}
|
|
else if(nSongStrength==17)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 36;
|
|
nAC = 5;
|
|
nSkill = 13;
|
|
}
|
|
else if(nSongStrength==16)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 34;
|
|
nAC = 5;
|
|
nSkill = 12;
|
|
}
|
|
else if(nSongStrength==15)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 32;
|
|
nAC = 5;
|
|
nSkill = 11;
|
|
}
|
|
else if(nSongStrength==14)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 30;
|
|
nAC = 5;
|
|
nSkill = 9;
|
|
}
|
|
else if(nSongStrength==13)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 28;
|
|
nAC = 5;
|
|
nSkill = 8;
|
|
}
|
|
else if(nSongStrength==12)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 26;
|
|
nAC = 5;
|
|
nSkill = 7;
|
|
}
|
|
else if(nSongStrength==11)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 24;
|
|
nAC = 5;
|
|
nSkill = 6;
|
|
}
|
|
else if(nSongStrength==10)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 22;
|
|
nAC = 5;
|
|
nSkill = 5;
|
|
}
|
|
else if(nSongStrength==9)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 3;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 20;
|
|
nAC = 5;
|
|
nSkill = 4;
|
|
}
|
|
else if(nSongStrength==8)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 2;
|
|
nFort = 2;
|
|
nReflex = 2;
|
|
nHP = 16;
|
|
nAC = 4;
|
|
nSkill = 3;
|
|
}
|
|
else if(nSongStrength==7)
|
|
{ nAttack = 2;
|
|
nDamage = 3;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 16;
|
|
nAC = 3;
|
|
nSkill = 2;
|
|
}
|
|
else if(nSongStrength==6)
|
|
{ nAttack = 2;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 8;
|
|
nAC = 2;
|
|
nSkill = 2;
|
|
}
|
|
else if(nSongStrength==5)
|
|
{ nAttack = 2;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nHP = 8;
|
|
nSkill = 1;
|
|
}
|
|
else if(nSongStrength==4)
|
|
{ nAttack = 1;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
nReflex = 1;
|
|
nSkill = 1;
|
|
}
|
|
else if(nSongStrength==3)
|
|
{ nAttack = 1;
|
|
nDamage = 2;
|
|
nWill = 1;
|
|
nFort = 1;
|
|
}
|
|
else if(nSongStrength==2)
|
|
{ nAttack = 1;
|
|
nDamage = 1;
|
|
nWill = 1;
|
|
}
|
|
else if(nSongStrength==1)
|
|
{ nAttack = 1;
|
|
nDamage = 1;
|
|
}
|
|
|
|
effect eAttack = EffectAttackIncrease(nAttack);
|
|
effect eDamage = EffectDamageIncrease(nDamage, DAMAGE_TYPE_BLUDGEONING);
|
|
effect eWill, eFort, eReflex, eHP, eAC, eSkill;
|
|
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) eHP = EffectTemporaryHitpoints(nHP);
|
|
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);
|
|
eHP = ExtraordinaryEffect(eHP);
|
|
eLink = ExtraordinaryEffect(eLink);
|
|
|
|
effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_SONIC);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ 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(oPC));
|
|
}
|
|
}
|
|
|
|
void SongSharp(object oPC, int nSongStrength, int nDuration)
|
|
{ itemproperty iKeen = ItemPropertyKeen();
|
|
|
|
effect eImpact = EffectVisualEffect(46);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
effect eVis2 = EffectVisualEffect(VFX_DUR_CESSATE_NEUTRAL);
|
|
eVis = EffectLinkEffects(eVis, eVis2);
|
|
eVis = ExtraordinaryEffect(eVis);
|
|
eVis2 = ExtraordinaryEffect(eVis2);
|
|
|
|
//Define Vars Here
|
|
object oWeapon, oOffhand;
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget) && nSongStrength>0)
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(nDuration));
|
|
//Bonus Here
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if(GetIsObjectValid(oWeapon) && GetPierceSlash(oWeapon))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
nSongStrength--;
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your "+GetName(oWeapon)+" resonates with the music.");
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
if(GetIsObjectValid(oOffhand) && GetPierceSlash(oWeapon))
|
|
{ IPSafeAddItemProperty(oOffhand, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
nSongStrength--;
|
|
}
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if(GetIsObjectValid(oWeapon) && GetPierceSlash(oWeapon))
|
|
{ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis2, oTarget, RoundsToSeconds(nDuration));
|
|
IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
nSongStrength--;
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your "+GetName(oWeapon)+" resonates with the music.");
|
|
}
|
|
if(GetIsObjectValid(oOffhand) && GetPierceSlash(oWeapon))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
nSongStrength--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongCrescendo(object oPC, int nSongStrength, int nDuration)
|
|
{ effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_HOLY);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
if(nDuration>20) nDuration = 6;
|
|
else if(nDuration>10) nDuration = 3;
|
|
else nDuration = 2;
|
|
|
|
int nCount = GetLocalInt(oPC, "CRESCENDOCOUNT");
|
|
if(nCount==0)
|
|
{ SetLocalInt(oPC, "CRESCENDOCOUNT", 1);
|
|
DelayCommand(RoundsToSeconds(nDuration*nSongStrength), DeleteLocalInt(oPC, "CRESCENDOCOUNT"));
|
|
nCount++;
|
|
}
|
|
else
|
|
{ nCount++;
|
|
SetLocalInt(oPC, "CRESCENDOCOUNT", nCount);
|
|
}
|
|
|
|
int nDC = 8;
|
|
if(nCount<=5) nDC = 8 + nCount*4; //+4 has DC 24
|
|
else if(nCount<=10) nDC = 12 + nCount*5; //+9 has DC 57
|
|
else if(nCount<=15) nDC = 16 + nCount*6; //+14 has DC 100
|
|
else if(nCount<=20) nDC = 20 + nCount*7; //+19 has DC 153
|
|
else nDC = 24 + nCount*8;
|
|
|
|
string sPronoun = "her";
|
|
if(GetGender(oPC)==GENDER_MALE) sPronoun="his";
|
|
|
|
if(!GetIsSkillSuccessful(oPC, SKILL_PERFORM, nDC)) //Failed
|
|
{ FloatingTextStringOnCreature(GetName(oPC)+"'s voice cracks!", oPC, FALSE);
|
|
DeleteLocalInt(oPC, "CRESCENDOCOUNT");
|
|
effect eSilence = EffectSilence();
|
|
effect eVis2 = EffectVisualEffect(VFX_DUR_CESSATE_NEUTRAL);
|
|
eSilence = EffectLinkEffects(eSilence, eVis2);
|
|
eSilence = ExtraordinaryEffect(eSilence);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSilence, oPC, RoundsToSeconds(nDuration*5));
|
|
return;
|
|
}
|
|
else
|
|
{ FloatingTextStringOnCreature(GetName(oPC)+" raises "+sPronoun+" song's pitch to "+IntToString(nCount)+"!", oPC, FALSE);
|
|
}
|
|
|
|
//Bonuses Here
|
|
effect eAttack = EffectAttackIncrease(nCount);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
eAttack = EffectLinkEffects(eAttack, eDur);
|
|
eAttack = ExtraordinaryEffect(eAttack);
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
effect eBardLinked = EffectLinkEffects(eAttack, eVis);
|
|
eBardLinked = ExtraordinaryEffect(eBardLinked);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBardLinked, oTarget, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAttack, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongAllegro(object oPC, int nSongStrength, int nDuration)
|
|
{ effect eImpact = EffectVisualEffect(VFX_IMP_HASTE);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
//Bonuses Here
|
|
effect eHaste = EffectMovementSpeedIncrease(10+5*nSongStrength);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
eHaste = EffectLinkEffects(eHaste, eDur);
|
|
eHaste = ExtraordinaryEffect(eHaste);
|
|
|
|
//Define Vars Here
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
if(!GetHasSpellEffect(SPELL_HASTE, oTarget))
|
|
{ effect eBardLinked = EffectLinkEffects(eHaste, eVis);
|
|
eBardLinked = ExtraordinaryEffect(eBardLinked);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBardLinked, oTarget, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else
|
|
{ eVis = ExtraordinaryEffect(eVis);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
else if(GetIsFriend(oTarget) && !GetHasSpellEffect(SPELL_HASTE, oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHaste, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongHymn(object oPC, int nSongStrength, int nDuration)
|
|
{ effect eImpact = EffectVisualEffect(VFX_IMP_GOOD_HELP);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
//Bonuses Here
|
|
int nAC = 0;
|
|
if(nSongStrength>=4) nAC = nSongStrength-3;
|
|
else
|
|
{ FloatingTextStringOnCreature("You try to sing the song, but the words tangle in your mouth.", oPC);
|
|
return;
|
|
}
|
|
effect eAC;
|
|
if(nAC>4) eAC = EffectACIncrease(nAC, AC_DEFLECTION_BONUS);
|
|
else if(nAC>0) eAC = EffectACIncrease(nAC, AC_DODGE_BONUS);
|
|
eAC = VersusAlignmentEffect(eAC,ALIGNMENT_ALL, ALIGNMENT_EVIL);
|
|
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
eAC = EffectLinkEffects(eAC, eDur);
|
|
eAC = ExtraordinaryEffect(eAC);
|
|
|
|
//Define Vars Here
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
effect eBardLinked = EffectLinkEffects(eAC, eVis);
|
|
eBardLinked = ExtraordinaryEffect(eBardLinked);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBardLinked, oTarget, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else if(GetIsFriend(oTarget) && GetAlignmentGoodEvil(oTarget)==ALIGNMENT_GOOD)
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAC, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongThrenody(object oPC, int nSongStrength, int nDuration)
|
|
{ effect eImpact = EffectVisualEffect(VFX_IMP_EVIL_HELP);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
//Bonuses Here
|
|
int nAC = 0;
|
|
if(nSongStrength>=4) nAC = nSongStrength-3;
|
|
else
|
|
{ FloatingTextStringOnCreature("You try to sing the song, but the words tangle in your mouth.", oPC);
|
|
return;
|
|
}
|
|
effect eAC;
|
|
if(nAC>4) eAC = EffectACIncrease(nAC, AC_DEFLECTION_BONUS);
|
|
else if(nAC>0) eAC = EffectACIncrease(nAC, AC_DODGE_BONUS);
|
|
eAC = VersusAlignmentEffect(eAC,ALIGNMENT_ALL, ALIGNMENT_GOOD);
|
|
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
eAC = EffectLinkEffects(eAC, eDur);
|
|
eAC = ExtraordinaryEffect(eAC);
|
|
|
|
//Define Vars Here
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
effect eBardLinked = EffectLinkEffects(eAC, eVis);
|
|
eBardLinked = ExtraordinaryEffect(eBardLinked);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBardLinked, oTarget, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else if(GetIsFriend(oTarget) && GetAlignmentGoodEvil(oTarget)==ALIGNMENT_EVIL)
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eAC, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongRage(object oPC)
|
|
{ effect eImpact = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
//Bonuses Here
|
|
int nSave = 2;
|
|
int nIncrease = 4;
|
|
|
|
effect eStr = EffectAbilityIncrease(ABILITY_CONSTITUTION, nIncrease);
|
|
effect eCon = EffectAbilityIncrease(ABILITY_STRENGTH, nIncrease);
|
|
effect eSave = EffectSavingThrowIncrease(SAVING_THROW_WILL, nSave);
|
|
effect eAC = EffectACDecrease(2, AC_DODGE_BONUS);
|
|
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
effect eLink = EffectLinkEffects(eCon, eStr);
|
|
eLink = EffectLinkEffects(eLink, eSave);
|
|
eLink = EffectLinkEffects(eLink, eAC);
|
|
eLink = EffectLinkEffects(eLink, eDur);
|
|
eLink = ExtraordinaryEffect(eLink);
|
|
|
|
int nCon;
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(10));
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
nCon = 5 + GetAbilityModifier(ABILITY_CONSTITUTION, oTarget);
|
|
if(nCon>10) nCon = 10;
|
|
AssignCommand(oTarget, PlayVoiceChat(VOICE_CHAT_BATTLECRY1));
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nCon));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongEleWeap(object oPC, int nSongStrength, int nDuration, int nType = IP_CONST_DAMAGETYPE_FIRE)
|
|
{ int nBonus;
|
|
if(nSongStrength<23) nBonus = WeapDamageBonus(nSongStrength/2);
|
|
else nBonus = WeapDamageBonus(12);
|
|
|
|
itemproperty iKeen = ItemPropertyDamageBonus(nType, nBonus);
|
|
|
|
effect eImpact = EffectVisualEffect(46);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
effect eVis2 = EffectVisualEffect(VFX_DUR_CESSATE_NEUTRAL);
|
|
eVis = EffectLinkEffects(eVis, eVis2);
|
|
eVis = ExtraordinaryEffect(eVis);
|
|
eVis2 = ExtraordinaryEffect(eVis2);
|
|
|
|
//Define Vars Here
|
|
object oWeapon, oOffhand;
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(nDuration));
|
|
//Bonus Here
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if(GetIsObjectValid(oWeapon))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your "+GetName(oWeapon)+" resonates with the music.");
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
if(GetIsObjectValid(oOffhand))
|
|
{ IPSafeAddItemProperty(oOffhand, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
}
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if(GetIsObjectValid(oWeapon))
|
|
{ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis2, oTarget, RoundsToSeconds(nDuration));
|
|
IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your "+GetName(oWeapon)+" resonates with the music.");
|
|
}
|
|
if(GetIsObjectValid(oOffhand))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongEleDef(object oPC, int nSongStrength, int nDuration, int nType = DAMAGE_TYPE_SONIC, int nVFX = VFX_IMP_HEAD_SONIC)
|
|
{ int nBonus = 2*nSongStrength +6; //+2% Per Level
|
|
if(nSongStrength>=13) nBonus = nBonus + nSongStrength-12; //+3% Per Level after 20
|
|
if(nSongStrength>=18) nBonus = nBonus + nSongStrength-17; //+4% Per Level after 25
|
|
if(nSongStrength>=23) nBonus = nBonus + 1; //+5% Per Level at 30 (70% Total Bonus)
|
|
|
|
effect eImpact = EffectVisualEffect(nVFX);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
//Bonuses Here
|
|
effect eBonus = EffectDamageImmunityIncrease(nType, nBonus);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEUTRAL);
|
|
eBonus = EffectLinkEffects(eBonus, eDur);
|
|
eBonus = ExtraordinaryEffect(eBonus);
|
|
|
|
//Define Vars Here
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
effect eBardLinked = EffectLinkEffects(eBonus, eVis);
|
|
eBardLinked = ExtraordinaryEffect(eBardLinked);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBardLinked, oTarget, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBonus, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongRegen(object oPC, int nSongStrength, int nDuration)
|
|
{ effect eImpact = EffectVisualEffect(VFX_IMP_HEAD_HEAL);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
|
|
int nHealBonus = GetSkillRank(SKILL_HEAL); //Heal Skill bonus 1HP per 5 skill
|
|
if(nHealBonus>=5) nHealBonus=nHealBonus/5;
|
|
else nHealBonus = 0;
|
|
|
|
if(nHealBonus>nSongStrength) nHealBonus=nSongStrength; //HealSkill cannot exceed songlevel
|
|
|
|
//Bonuses Here
|
|
effect eBonus = EffectRegenerate(1+nHealBonus+(nSongStrength/2), 6.0);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
eBonus = EffectLinkEffects(eBonus, eDur);
|
|
eBonus = ExtraordinaryEffect(eBonus);
|
|
|
|
//Define Vars Here
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ //Bonus Here
|
|
effect eBardLinked = EffectLinkEffects(eBonus, eVis);
|
|
eBardLinked = ExtraordinaryEffect(eBardLinked);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBardLinked, oTarget, RoundsToSeconds(nDuration));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBonus, oTarget, RoundsToSeconds(nDuration));
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|
|
|
|
void SongBrawl(object oPC, int nSongStrength, int nDuration)
|
|
{ int nBonus = WeapDamageBonus(nSongStrength);
|
|
|
|
itemproperty iKeen = ItemPropertyMassiveCritical(nBonus);
|
|
nBonus = WeapDamageBonus(1+nSongStrength/2);
|
|
itemproperty iGlove = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_BLUDGEONING, nBonus);
|
|
|
|
effect eImpact = EffectVisualEffect(46);
|
|
effect eVis = EffectVisualEffect(VFX_DUR_BARD_SONG);
|
|
eVis = ExtraordinaryEffect(eVis);
|
|
|
|
//Define Vars Here
|
|
object oWeapon, oOffhand;
|
|
|
|
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
while(GetIsObjectValid(oTarget))
|
|
{ if(!GetHasFeatEffect(FEAT_BARD_SONGS, oTarget) && !GetHasSpellEffect(PRCGetSpellId(),oTarget))
|
|
{ // * GZ Oct 2003: If we are silenced, we can not benefit from bard song
|
|
if (!PRCGetHasEffect(EFFECT_TYPE_SILENCE,oTarget) && !PRCGetHasEffect(EFFECT_TYPE_DEAF,oTarget))
|
|
{ if(oTarget == oPC)
|
|
{ ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget, RoundsToSeconds(nDuration));
|
|
//Bonus Here
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if(GetIsObjectValid(oWeapon) && GetBludge(oWeapon))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your "+GetName(oWeapon)+" resonates with the music.");
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
}
|
|
else
|
|
{ oWeapon = GetItemInSlot(INVENTORY_SLOT_ARMS, oTarget);
|
|
if(GetBaseItemType(oWeapon)==BASE_ITEM_GLOVES)
|
|
{ IPSafeAddItemProperty(oWeapon, iGlove, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your fists feel empowered with the music.");
|
|
}
|
|
}
|
|
if(GetIsObjectValid(oOffhand) && GetBludge(oWeapon))
|
|
{ IPSafeAddItemProperty(oOffhand, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
}
|
|
}
|
|
else if(GetIsFriend(oTarget))
|
|
{ ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
//Bonus Here
|
|
oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oTarget);
|
|
oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
|
|
if(GetIsObjectValid(oWeapon) && GetBludge(oWeapon))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your "+GetName(oWeapon)+" resonates with the music.");
|
|
}
|
|
else
|
|
{ oWeapon = GetItemInSlot(INVENTORY_SLOT_ARMS, oTarget);
|
|
if(GetBaseItemType(oWeapon)==BASE_ITEM_GLOVES)
|
|
{ IPSafeAddItemProperty(oWeapon, iGlove, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oTarget);
|
|
if(GetIsPC(oTarget)) SendMessageToPC(oTarget, "Your fists feel empowered with the music.");
|
|
}
|
|
}
|
|
if(GetIsObjectValid(oOffhand) && GetBludge(oWeapon))
|
|
{ IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(oPC));
|
|
}
|
|
}
|