//:://///////////////////////////////////////////// //:: Mighty Rage //:: X2_S2_MghtyRage //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* + 12 Str + 12 Con + 3 Will Save - 2 Ac if maximum str is already reached before or during rage the barbarian gets the following: + slashing bonus damage + attack bonus or if maximum con is reached: + temporary hp */ //::////////////////////////////////////////////// //:: Created By: Andrew Nobbs //:: Created On: May 16, 2003 //::////////////////////////////////////////////// //::////////////////////////////////////////////// //:: Rewritten By: Mizzajl //:: Created On: Oct 24, 2004 //::////////////////////////////////////////////// //:: Edited By: Bogo Rath //::////////////////////////////////////////////// #include "x2_inc_itemprop" #include "prc_class_const" int GetInnateAbility(object oCreature, int nAbility) { ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectAbilityIncrease(nAbility, 12), oCreature, 0.01); return GetAbilityScore(oCreature, nAbility) - 12; } //------------------------------------------------------------------------------ // GZ, 2003-07-09 // If the character calling this function from a spellscript has the thundering // rage feat, his weapons are upgraded to deafen and cause 2d6 points of massive // criticals //------------------------------------------------------------------------------ void CheckAndApplyThunderingRage(int nRounds) { if (GetHasFeat(988, OBJECT_SELF)) { object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND); if (GetIsObjectValid(oWeapon)) { IPSafeAddItemProperty(oWeapon, ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_2d12), RoundsToSeconds(nRounds), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE); IPSafeAddItemProperty(oWeapon, ItemPropertyVisualEffect(ITEM_VISUAL_SONIC), RoundsToSeconds(nRounds), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE); IPSafeAddItemProperty(oWeapon, ItemPropertyOnHitProps(IP_CONST_ONHIT_DEAFNESS,IP_CONST_ONHIT_SAVEDC_26,IP_CONST_ONHIT_DURATION_50_PERCENT_2_ROUNDS), RoundsToSeconds(nRounds), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE); } oWeapon = GetItemInSlot(INVENTORY_SLOT_LEFTHAND); if (GetIsObjectValid(oWeapon) ) { IPSafeAddItemProperty(oWeapon, ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_SONIC, IP_CONST_DAMAGEBONUS_2d12), RoundsToSeconds(nRounds), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE); IPSafeAddItemProperty(oWeapon,ItemPropertyVisualEffect(ITEM_VISUAL_SONIC), RoundsToSeconds(nRounds), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE); IPSafeAddItemProperty(oWeapon, ItemPropertyOnHitProps(IP_CONST_ONHIT_DEAFNESS,IP_CONST_ONHIT_SAVEDC_26,IP_CONST_ONHIT_DURATION_50_PERCENT_2_ROUNDS), RoundsToSeconds(nRounds), X2_IP_ADDPROP_POLICY_REPLACE_EXISTING,FALSE,TRUE); } } } //------------------------------------------------------------------------------ // GZ, 2003-07-09 // If the character calling this function from a spellscript has the terrifying // rage feat, he gets an aura of fear for the specified duration // The saving throw against this fear is a check opposed to the character's // intimidation skill //------------------------------------------------------------------------------ void CheckAndApplyTerrifyingRage(int nRounds) { if (GetHasFeat(989, OBJECT_SELF)) { effect eAOE = EffectAreaOfEffect(AOE_MOB_FEAR,"x2_s2_terrage_A", "",""); ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eAOE,OBJECT_SELF,RoundsToSeconds(nRounds)); } } //------------------------------------------------------------------------------ // GZ, 2003-07-09 // Hub function for the epic barbarian feats that upgrade rage. Call from // the end of the barbarian rage spellscript //------------------------------------------------------------------------------ void CheckAndApplyEpicRageFeats(int nRounds) { CheckAndApplyThunderingRage(nRounds); CheckAndApplyTerrifyingRage(nRounds); } void main() { if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE)) { //Declare major variables int nLevel = GetLevelByClass(CLASS_TYPE_BARBARIAN) + GetLevelByClass(CLASS_TYPE_FRE_BERSERKER) + GetLevelByClass(CLASS_TYPE_BATTLERAGER) + GetLevelByClass(CLASS_TYPE_CELEBRANT_SHARESS) + GetLevelByClass(CLASS_TYPE_BLACK_BLOOD_CULTIST) + GetLevelByClass(CLASS_TYPE_RUNESCARRED) + GetLevelByClass(CLASS_TYPE_TOTEM_RAGER) + GetLevelByClass(CLASS_TYPE_FRE_BERSERKER) + GetLevelByClass(CLASS_TYPE_FROSTRAGER); int nHD = GetHitDice(OBJECT_SELF); int nSave = 3; int nStrIncrease = 12; int nConIncrease = 12; // Stacks str and con so that none is lost if you reach the +12 limit int nStrenght = GetAbilityScore(OBJECT_SELF, ABILITY_STRENGTH); int nDexterity = GetAbilityScore(OBJECT_SELF, ABILITY_DEXTERITY); int nConstitution = GetAbilityScore(OBJECT_SELF, ABILITY_CONSTITUTION); int nDur = 3 + GetAbilityModifier(ABILITY_CONSTITUTION) + nConIncrease; int nBaseStr = GetInnateAbility(OBJECT_SELF, ABILITY_STRENGTH); int nBaseCon = GetInnateAbility(OBJECT_SELF, ABILITY_CONSTITUTION); int nOverCapStr = nStrenght - nBaseStr - 0 + nStrIncrease; int nOverCapCon = nConstitution - nBaseCon - 0 + nConIncrease; if(nOverCapStr > 12) { nStrIncrease = nStrIncrease - nOverCapStr; } if(nOverCapCon > 12) { nConIncrease = nConIncrease - nOverCapCon; } //end of calculation :) PlayVoiceChat(VOICE_CHAT_BATTLECRY2); //Determine the duration by getting the con modifier after being modified effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, nStrIncrease); effect eCon = EffectAbilityIncrease(ABILITY_CONSTITUTION, nConIncrease); effect eSave = EffectSavingThrowIncrease(SAVING_THROW_WILL, nSave); effect eAC = EffectACDecrease(4, AC_DODGE_BONUS); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); // adds Damage, AB and HP effect eAB = EffectAttackIncrease(nOverCapStr/2); effect eBonusDamage = EffectDamageIncrease(nOverCapStr/2, DAMAGE_TYPE_SLASHING); effect eHP = EffectTemporaryHitpoints((nOverCapCon/2) * nHD); effect eLink = EffectLinkEffects(eCon, eStr); eLink = EffectLinkEffects(eLink, eSave); eLink = EffectLinkEffects(eLink, eAC); eLink = EffectLinkEffects(eLink, eDur); //checks if any str is lost because of the +12 limit if(nOverCapStr > 12) { //check if the char is NOT a dexer if(GetHasFeat(FEAT_WEAPON_FINESSE, OBJECT_SELF) == TRUE) { if(nStrenght > nDexterity) { //only aply if str is higher than dex eLink = EffectLinkEffects(eLink, eAB); } } else // if you dont have weapon finesse you get the AB even if dex is higher { eLink = EffectLinkEffects(eLink, eAB); } // dexers always gets more damage even if dex is higher eLink = EffectLinkEffects(eLink, eBonusDamage); } SignalEvent(OBJECT_SELF, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_BARBARIAN_RAGE, FALSE)); //Make effect extraordinary eLink = ExtraordinaryEffect(eLink); effect eVis = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE); //Change to the Rage VFX if (nDur > 12) { //Apply the VFX impact and effects DelayCommand(0.02, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, RoundsToSeconds(nDur))); //checks if any con is lost because of the +12 limit //hp could not be linked, losing hp whould result in lose of all bonuses if(nOverCapCon > 12) { DelayCommand(0.02, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, OBJECT_SELF, RoundsToSeconds(nDur))); } ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF) ; // 2003-07-08, Georg: Rage Epic Feat Handling CheckAndApplyEpicRageFeats(nDur); } } }