New Barbarian Rages
-
Okay: THESE ARE ALREADY IN GAME, we just need some balancing help to make them worth it, then we'll introduce them in loot tables or shops.
- Beserker Rage:
- Thunder Rage:
- Juggernaut:
- Malkizid's Wrath (Elf Rage):
- Default
- Beserker doesn't scale according to level, rather, it scales according to the amount of HP present on the character when they rage. This makes raging at low health a risky proposition.
At: 100% hp = +2 str, +2 con, +2 will, 10% physical Damage Immunity
At: 80% hp = +3 str, +3 con, +3 will, +15% physical Damage Immunity
At: 60% hp = +4 str, +4 con, +4 will, +10 temp hp, +20% physical Damage Immunity
At: 40% hp = +5 str, +5 con, +5 will, +20 temp hp, +25% physical Damage Immunity
At: 20% hp = +6 str, +6 con, +6 will, +30 temp hp, +30% physical Damage Immunity- Malkizid's Wrath is a bit lackluster, but the intention here is for ranged barbarians (archers) to assist them in their ranged angry shooting bowery.
Lvl 1: +2 Dex, +1 Reflex
Lvl 4: +1 Reflex, +1 Piercing DMG
Lvl 6: +1 DEX
Lvl 8: +1 Reflex, +1 AC, +1 Piercing DMG
Lvl 10 - Total: +4 Dex, +2 Piercing DMG, +4 Reflex, +2 AC- The Rage of Thunder is a rage that grants immunity to electric damage and possesses a damage shield that reflects electric damage back to the targets. As it levels up, it will create an AoE around the barb that strikes enemies with the wrath of storms to damage their foes.
Lvl 1: +1 electrical DMG, 10% electrical Immunity
Lvl 4: +1 electrical DMG, 15% electrical Immunity
Lvl 6: 20% electrical Immunity
Lvl 8: +1 electrical DMG, Electrical Shield,
if hit damages opponent (1d4 electrical), 25% electrical Immunity
Lvl 10 - Total: +3 electrical DMG, 30% electrical immunity, Electrical Shield (1d6),
Special Effect: Lvl 6+ enemies will be hit by a lightning bolt (2d6).- Juggernaught is an unstoppable force, and when charging, cannot be stopped. It will ignore all holds, bindings, entanglements etc... to reach their target, removing any energy drains or poisons in the process.
Lvl 1: +2 str, +2 con, lesser restoration, ignore unit collision
Lvl 4: +3 str, +2 con, lesser restoration, ignore unit collision, +10% movespeed
Lvl 7: +3 str, +2 con, lesser restoration, clarity, ignore unit collision, +10% move speed
Lvl 10: +4 str, +2 con, lesser restoration, clarity, ignore unit collision, +20% move speed- Rage of the Wraith is a unique rage that summons the dead and slain foes of the barbarian to aid him in battle. Rise from the dead, my slain foes, and conquer my foes beside me.
Level 4: 15% concealment, 1 allied spirit.
Level 5: 20% concealment, 1 allied spirit, +2 neg damage to weapon
Level 6: 25% concealement, 2 allied spirits, +2 neg damage
Level 7: 30% concealment, 2 allied spirits, +2 neg damage, +10% immunity to negative energy.
Level 8: 35% concealment, 2 allied spirits, +2 neg damage, +15 immunity to negative energy.
Level 9: 40% concealement, 2 allied, +3 neg damage, +20% immunity to negative
Level 10: 50% concealment, 3 allied spirits, +3 neg, +25 immunity to negative. -
//::///////////////////////////////////////////////
//:: Barbarian Rage
//:: NW_S1_BarbRage
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
The Str and Con of the Barbarian increases,
Will Save are +2, AC -2.
Greater Rage starts at level 15.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Aug 13, 2001
//:://////////////////////////////////////////////#include "x2_i0_spells"
//#include "_incl_rndloc"int GetIsSupernaturalCurse(effect eEff) {
object oCreator = GetEffectCreator(eEff);if(GetTag(oCreator) == "q6e_ShaorisFellTemple") return TRUE; return FALSE;
}
void RageBerserker (object oPC, int nDuration, int nLevel) {
int nHP, nHP_total, nHP_current, nSTR, nCON, nWILL, nImmun, nTMPHP;
nHP_total = GetMaxHitPoints(oPC);
nHP_current = GetCurrentHitPoints(oPC);
nHP = (nHP_current * 100) / nHP_total;
// SendMessageToPC(oPC, "nHP_total: " + IntToString(nHP_total));
// SendMessageToPC(oPC, "nHP_current: " + IntToString(nHP_current));
// SendMessageToPC(oPC, "nHP: " + IntToString(nHP));if (nHP < 20) { nSTR = 6; nCON = 6; nWILL = 6; } else if (nHP < 40) { nSTR = 5; nCON = 5; nWILL = 5; } else if (nHP < 60) { nSTR = 4; nCON = 4; nWILL = 4; } else if (nHP < 80) { nSTR = 3; nCON = 3; nWILL = 3; } else if (nHP < 100) { nSTR = 2; nCON = 2; nWILL = 2; } else { nSTR = 1; nCON = 1; nWILL = 1; } if (nLevel > 9) { nTMPHP = 30; nImmun = 30; } else if (nLevel > 7) { nTMPHP = 20; nImmun = 25; } else if (nLevel > 5) { nTMPHP = 10; nImmun = 20; } else if (nLevel > 3) { nTMPHP = 0; nImmun = 15; } else if (nLevel > 1) { nTMPHP = 0; nImmun = 10; } else { nTMPHP = 0; nImmun = 5; } effect eSTR, eCON, eWILL, eTMPHP, eIMMUN, eLink, eVis; eSTR = EffectAbilityIncrease(ABILITY_STRENGTH, nSTR); eLink = EffectLinkEffects(eLink, eSTR); eCON = EffectAbilityIncrease(ABILITY_CONSTITUTION, nCON); eLink = EffectLinkEffects(eLink, eCON); eWILL = EffectSavingThrowIncrease(SAVING_THROW_WILL, nWILL); eLink = EffectLinkEffects(eLink, eWILL); if (nTMPHP > 0) { eLink = EffectLinkEffects(eLink, EffectTemporaryHitpoints(nTMPHP)); } if (nImmun > 0) { eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, nImmun)); eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, nImmun)); eLink = EffectLinkEffects(eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, nImmun)); } // VFX eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_IMP_EVIL_HELP)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_IMP_PULSE_NEGATIVE)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_AURA_PULSE_RED_BLACK)); eLink = ExtraordinaryEffect(eLink); SignalEvent(oPC, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE)); PlayVoiceChat(VOICE_CHAT_BATTLECRY1); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, RoundsToSeconds(nDuration));
}
void RageJuggernaut (object oPC, int nDuration, int nLevel) {
int nSTR, nCON, nMove;if (nLevel > 9) { nSTR = 4; nCON = 2; nMove = 20; } else if (nLevel > 6) { nSTR = 3; nCON = 2; nMove = 10; } else if (nLevel > 3) { nSTR = 3; nCON = 2; nMove = 10; } else { nSTR = 2; nCON = 2; nMove = 0; } effect eSTR, eCON, eMove, eCLARITY, eLink, eLink2, eBad; eSTR = EffectAbilityIncrease(ABILITY_STRENGTH, nSTR); eLink = EffectLinkEffects(eLink, eSTR); eCON = EffectAbilityIncrease(ABILITY_CONSTITUTION, nCON); eLink = EffectLinkEffects(eLink, eCON); if (nMove > 0) { eMove = EffectMovementSpeedIncrease(nMove); eLink = EffectLinkEffects(eLink, eMove); } // FREEDOM OF MOVEMENT eLink2 = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_PARALYSIS)); eLink2 = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_ENTANGLE)); eLink2 = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_SLOW)); eLink2 = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_MOVEMENT_SPEED_DECREASE)); if (nLevel > 6) eLink2 = EffectLinkEffects(eLink, EffectImmunity(IMMUNITY_TYPE_MIND_SPELLS)); // CLARITY // RESTORATION eBad = GetFirstEffect(oPC); //Search for negative effects while(GetIsEffectValid(eBad)) { if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE || GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE) { //Remove effect if it is negative. if(!GetIsSupernaturalCurse(eBad)) RemoveEffect(oPC, eBad); } eBad = GetNextEffect(oPC); } // VFX eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_FREEDOM_OF_MOVEMENT)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_IMP_SUPER_HEROISM)); eLink = ExtraordinaryEffect(eLink); SignalEvent(oPC, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE)); PlayVoiceChat(VOICE_CHAT_BATTLECRY1); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, RoundsToSeconds(nDuration)); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink2, oPC, RoundsToSeconds(2));
}
void SummonWraith(string Creature_ResRef, object oPC, int nDuration) {
location lSelf = GetLocation(OBJECT_SELF);
// Create Location in cut off cone
// location lTarget = RndLoc(lSelf,3,1,BASE_SHAPE_CIRCLE,DIRECTION_SOUTH,42.5f);
effect eSummon = EffectSummonCreature(Creature_ResRef, VFX_FNF_SUMMON_UNDEAD, 0.5f);
// ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eSummon, lTarget, RoundsToSeconds(nDuration));
object oWraith = GetObjectByTag(Creature_ResRef);
ChangeToStandardFaction(oWraith, STANDARD_FACTION_DEFENDER);
}void RageWraith (object oPC, int nDuration, int nLevel) {
int nWraith, nConceal, nHP, nHP_total, nHP_current, nSTR, nCON, nWILL, nImmun, nTMPHP;if (nLevel > 9) { nWraith = 3; nConceal = 25; nSTR = 4; nCON = 4; } else if (nLevel > 7){ nWraith = 2; nConceal = 20; nTMPHP = 20; } else if (nLevel > 5) { nWraith = 2; nConceal = 15; } else if (nLevel > 3) { nWraith = 1; nConceal = 10; } else { nWraith = 1; nConceal = 5; nSTR = 2; nCON = 2; } int nTimer = 0; for (nTimer = 0; nTimer < nWraith; nTimer++) { DelayCommand(1.0f, SummonWraith("spiffymadethis", oPC, nDuration)); } PlayVoiceChat(VOICE_CHAT_BATTLECRY1);
}
void RageThunder (object oPC, int nDuration, int nLevel) {
int nEleDR, nDmg;if (nLevel > 9) { nEleDR = 30; nDmg = 3; } else if (nLevel > 7) { nEleDR = 25; nDmg = 3; } else if (nLevel > 5) { nEleDR = 20; nDmg = 2; } else if (nLevel > 3) { nEleDR = 15; nDmg = 2; } else { nEleDR = 10; nDmg = 1; } effect eLink, eVisCall, eVisShield, eEleShield, eEleDR; // ELECTRICAL DMG object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, GetLocation(oPC)); itemproperty iKeen = ItemPropertyDamageBonus(IP_CONST_DAMAGETYPE_ELECTRICAL, nDmg); object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC); object oOffhand = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC); if(GetIsObjectValid(oWeapon)) IPSafeAddItemProperty(oWeapon, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING); if(GetIsObjectValid(oOffhand)) IPSafeAddItemProperty(oOffhand, iKeen, RoundsToSeconds(nDuration), X2_IP_ADDPROP_POLICY_KEEP_EXISTING); // ELECTRICAL DR eEleDR = EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL, nEleDR); eLink = EffectLinkEffects(eLink, eEleDR); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_AURA_PULSE_BLUE_WHITE)); eLink = EffectLinkEffects(eLink, EffectAttackIncrease(2)); eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_STRENGTH, 2)); eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_DEXTERITY,2)); eLink = EffectLinkEffects(eLink, EffectACIncrease(1, AC_DODGE_BONUS, AC_VS_DAMAGE_TYPE_ALL)); eLink = EffectLinkEffects(eLink, EffectSavingThrowIncrease(SAVING_THROW_REFLEX, 2, SAVING_THROW_TYPE_ALL)); if (nLevel > 6) { // ELETRIC SHIELD + Call Lightining // ELETRICAL SHIELD eVisShield = EffectVisualEffect(VFX_IMP_LIGHTNING_S); eEleShield = EffectDamageShield(DAMAGE_BONUS_1d4, DAMAGE_BONUS_1, DAMAGE_TYPE_ELECTRICAL); if (nLevel > 9) eEleShield = EffectDamageShield(DAMAGE_BONUS_1d6, DAMAGE_BONUS_1, DAMAGE_TYPE_ELECTRICAL); eLink = EffectLinkEffects(eLink, eEleShield); eLink = EffectLinkEffects(eLink, eVisShield); //eEleShield = EffectLinkEffects(eEleShield, eVisShield); SignalEvent(oPC, EventSpellCastAt(OBJECT_SELF, GetSpellId(), FALSE)); RemoveEffectsFromSpell(oPC, GetSpellId()); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oPC, RoundsToSeconds(nDuration)); eVisCall = EffectVisualEffect(VFX_IMP_LIGHTNING_M); eLink = EffectDamage(d6(2), DAMAGE_TYPE_ELECTRICAL); eLink = EffectLinkEffects(eLink, eVisCall); // CALL LIGHTINING while(GetIsObjectValid(oTarget)) { if(spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, OBJECT_SELF)) {
// ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nDuration));
DelayCommand(GetRandomDelay(0.1, 0.5), ApplyEffectToObject(DURATION_TYPE_INSTANT, eLink, oTarget));
}oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); } PlayVoiceChat(VOICE_CHAT_BATTLECRY1); }
}
void RageElf (object oPC, int nDuration, int nLevel) {
int nStr, nDex, nConceal, nBlade;if (nLevel > 9) { nStr = 4; nDex = 4; nConceal = 20; nBlade = d6(6); } else if (nLevel > 7) { nStr = 4; nDex = 3; nConceal = 20; nBlade = d6(5); } else if (nLevel > 5) { nStr = 3; nDex = 3; nConceal = 15; nBlade = d6(4); } else if (nLevel > 3) { nStr = 2; nDex = 2; nConceal = 10; nBlade = d6(2); } else if (nLevel > 1) { nStr = 2; nDex = 2; nConceal = 10; nBlade = d6(2); } else { nStr = 2; nDex = 1; nConceal = 10; nBlade = d6(1); } PlayVoiceChat(VOICE_CHAT_BATTLECRY1); //Determine the duration by getting the con modifier after being modified effect eDex = EffectAbilityIncrease(ABILITY_DEXTERITY, nDex); effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, nStr); effect eConceal = EffectConcealment(nConceal); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); effect eLink = EffectLinkEffects(eLink, eDex); eLink = EffectLinkEffects(eLink, eStr); eLink = EffectLinkEffects(eLink, eConceal); eLink = EffectLinkEffects(eLink, eDur); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_GHOST_SMOKE_2)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_IMP_MAGBLUE)); eLink = EffectLinkEffects(eLink, EffectVisualEffect(460)); eLink = ExtraordinaryEffect(eLink); SignalEvent(OBJECT_SELF, EventSpellCastAt(OBJECT_SELF, SPELLABILITY_BARBARIAN_RAGE, FALSE)); PlayVoiceChat(VOICE_CHAT_BATTLECRY1); ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, RoundsToSeconds(nDuration)); // BLADE DANCE int nDC = 10 + GetAbilityModifier(ABILITY_DEXTERITY) + (nLevel / 2); object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, GetLocation(oPC)); DoWhirlwindAttack(); //ActionUseFeat(FEAT_WHIRLWIND_ATTACK, oEnemy) nBlade = GetReflexAdjustedDamage(nBlade, oTarget, nDC); effect eBlade = EffectDamage(nBlade, DAMAGE_TYPE_PIERCING); while(GetIsObjectValid(oTarget)) { if(spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, OBJECT_SELF)) { ApplyEffectToObject(DURATION_TYPE_INSTANT, eBlade, oTarget); } oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, GetLocation(OBJECT_SELF)); }
}
void RageDefault (object oPC, int nDuration, int nLevel) {
int nWill, nStr, nCon, nImmun;if (nLevel > 9) { nWill = 3; nStr = 4; nCon = 4; nImmun = 20; } else if (nLevel > 7) { nWill = 2; nStr = 4; nCon = 3; nImmun = 20; } else if (nLevel > 5) { nWill = 2; nStr = 3; nCon = 3; nImmun = 15; } else if (nLevel > 3) { nWill = 1; nStr = 3; nCon = 2; nImmun = 15; } else { nWill = 1; nStr = 2; nCon = 1; nImmun = 10; } PlayVoiceChat(VOICE_CHAT_BATTLECRY1); //Determine the duration by getting the con modifier after being modified effect eStr = EffectAbilityIncrease(ABILITY_CONSTITUTION, nCon); effect eCon = EffectAbilityIncrease(ABILITY_STRENGTH, nStr); effect eWill = EffectSavingThrowIncrease(SAVING_THROW_WILL, nWill); effect eImmun = EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING, nImmun); eImmun = EffectLinkEffects(eImmun, EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING, nImmun)); eImmun = EffectLinkEffects(eImmun, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, nImmun)); effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); effect eLink = EffectLinkEffects(eCon, eStr); eLink = EffectLinkEffects(eLink, eWill); eLink = EffectLinkEffects(eLink, eImmun); eLink = EffectLinkEffects(eLink, eDur); 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 //Apply the VFX impact and effects ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, RoundsToSeconds(nDuration)); ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF) ;
}
void main() {
if(!GetHasFeatEffect(FEAT_BARBARIAN_RAGE)) {
object oPC = OBJECT_SELF;
int nLevel = GetLevelByClass(CLASS_TYPE_BARBARIAN);
int nDuration = 7 + GetAbilityModifier(ABILITY_CONSTITUTION);
string sBarbRage = GetLocalString (oPC, "sBarbRage");if ((sBarbRage == "") || (sBarbRage == "Default")) { RageDefault (oPC, nDuration, nLevel); return; } if (sBarbRage == "RageThunder") { RageThunder (oPC, nDuration, nLevel); return; } if (sBarbRage == "RageElf") { RageElf (oPC, nDuration, nLevel); return; } if (sBarbRage == "RageWraith") { RageWraith (oPC, nDuration, nLevel); return; } if (sBarbRage == "RageJuggernaut") { RageJuggernaut (oPC, nDuration, nLevel); return; } if (sBarbRage == "RageBerserker") { RageBerserker (oPC, nDuration, nLevel); return; } }
}
-
Code posted as well.
-
13 days, no comments. I guess these are fine as is and will be going live.
-
@SpiffyMeister said in New Barbarian Rages:
13 days, no comments. I guess these are fine as is and will be going live.
Good job Spiffy and co. Locking this thread. If anyone has feedback or suggestions please start a new post.
As a reminder we likely will miss any suggestions/feed back on Discord for this or anything else. Please take the time to make a forum post and we’ll get to it when we can.
Happy Gaming!