forked from Jaysyn/PRC8
Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
217 lines
7.9 KiB
Plaintext
217 lines
7.9 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Frenzied Berserker - Frenzy
|
|
//:: NW_S1_frebzk
|
|
//:: Copyright (c) 2004
|
|
//:: Special thanks to BioWare's Rage script
|
|
//:: and to mr bumpkin for the +12 stat cap bonuses
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Increases Str and reduces AC
|
|
Greater Frenzy starts at level 8.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Oni5115
|
|
//:: Created On: Aug 23, 2004
|
|
//:://////////////////////////////////////////////
|
|
#include "prc_inc_spells"
|
|
#include "inc_addragebonus"
|
|
|
|
void TurnBasedDamage(object oTarget, object oCaster);
|
|
void AttackNearestForDuration();
|
|
void EndOfFrenzyDamage(object oSelf);
|
|
|
|
void main()
|
|
{
|
|
if(!GetHasFeatEffect(FEAT_FRENZY))
|
|
{
|
|
SetLocalInt(OBJECT_SELF, "PC_Damage", 0);
|
|
|
|
// Declare major variables
|
|
int nLevel = GetLevelByClass(CLASS_TYPE_FRE_BERSERKER);
|
|
int nIncrease;
|
|
int acDecrease;
|
|
int hasHaste;
|
|
int nSlot; // for checking armor slots
|
|
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
|
|
if(GetHasFeat(FEAT_DEATHLESS_FRENZY, oTarget) )
|
|
{
|
|
SetImmortal(oTarget, TRUE);
|
|
}
|
|
|
|
// Removes effects of being winded
|
|
effect eWind = GetFirstEffect(oTarget);
|
|
while (GetIsEffectValid(eWind))
|
|
{
|
|
if (GetEffectType(eWind) == EFFECT_TYPE_ABILITY_DECREASE || GetEffectType(eWind) == EFFECT_TYPE_MOVEMENT_SPEED_DECREASE)
|
|
if (GetEffectSpellId(eWind) == PRCGetSpellId())
|
|
RemoveEffect(oTarget, eWind);
|
|
eWind = GetNextEffect(oTarget);
|
|
}
|
|
|
|
hasHaste = 0;
|
|
acDecrease = 4;
|
|
|
|
// Change the strength bonus at level 8
|
|
if (nLevel < 8)
|
|
nIncrease = 6;
|
|
else
|
|
nIncrease = 10;
|
|
|
|
// Check for haste
|
|
if(GetHasSpellEffect(SPELL_MASS_HASTE, oTarget) == TRUE)
|
|
{
|
|
hasHaste = 1;
|
|
}
|
|
if(GetHasSpellEffect(647, oTarget) == TRUE) // blinding speed
|
|
{
|
|
hasHaste = 1;
|
|
}
|
|
if(GetHasSpellEffect(78, oTarget) == TRUE) // haste
|
|
{
|
|
hasHaste = 1;
|
|
}
|
|
|
|
// Checks all equiped items for haste
|
|
for (nSlot=0; nSlot<NUM_INVENTORY_SLOTS; nSlot++)
|
|
{
|
|
object oItem = GetItemInSlot(nSlot, OBJECT_SELF);
|
|
|
|
if (GetItemHasItemProperty(oItem, ITEM_PROPERTY_HASTE))
|
|
hasHaste = 1;
|
|
}
|
|
|
|
// ac penalty applied to skin
|
|
object oSkin = GetPCSkin(OBJECT_SELF);
|
|
SetCompositeBonusT(oSkin, "FrenzyACPenalty", acDecrease, ITEM_PROPERTY_DECREASED_AC, IP_CONST_ACMODIFIERTYPE_DODGE); // for temporary bonuses
|
|
|
|
PlayVoiceChat(VOICE_CHAT_BATTLECRY1);
|
|
|
|
//Determine the duration
|
|
int nCon = 3 + GetAbilityModifier(ABILITY_CONSTITUTION);
|
|
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, nIncrease);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
|
effect eGlow = EffectVisualEffect(VFX_DUR_AURA_PULSE_RED_ORANGE);
|
|
|
|
effect eLink = EffectLinkEffects(eStr, eDur);
|
|
eLink = EffectLinkEffects(eLink, eGlow);
|
|
|
|
if(hasHaste == 0)
|
|
{
|
|
effect eHaste = EffectHaste();
|
|
effect eMove = EffectMovementSpeedDecrease(50);
|
|
eLink = EffectLinkEffects(eLink, eHaste);
|
|
eLink = EffectLinkEffects(eLink, eMove);
|
|
}
|
|
|
|
SignalEvent(OBJECT_SELF, EventSpellCastAt(OBJECT_SELF, SPELL_FRENZY, FALSE));
|
|
|
|
//Make effect extraordinary
|
|
eLink = ExtraordinaryEffect(eLink);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE); //Change to the Rage VFX
|
|
|
|
if (nCon > 0)
|
|
{
|
|
// 2004-01-18 mr_bumpkin: determine the ability scores before adding bonuses, so the values
|
|
// can be read in by the GiveExtraRageBonuses() function below.
|
|
int StrBeforeBonuses = GetAbilityScore(OBJECT_SELF, ABILITY_STRENGTH);
|
|
int ConBeforeBonuses = GetAbilityScore(OBJECT_SELF,ABILITY_CONSTITUTION);
|
|
int ExtRage = GetHasFeat(FEAT_EXTENDED_RAGE, OBJECT_SELF) ? 5:0;
|
|
nCon+= ExtRage;
|
|
|
|
//Apply the VFX impact and effects
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, OBJECT_SELF, RoundsToSeconds(nCon));
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
|
|
|
object oSelf = OBJECT_SELF; // because OBJECT_SELF is a function
|
|
DelayCommand(6.0f,TurnBasedDamage(oTarget, oSelf) );
|
|
AttackNearestForDuration();
|
|
|
|
DelayCommand(RoundsToSeconds(nCon), EndOfFrenzyDamage(oSelf) );
|
|
|
|
// 2004-01-18 mr_bumpkin: Adds special bonuses to those barbarians who are restricted by the
|
|
// +12 attribute bonus cap, to make up for them. :)
|
|
|
|
// The delay is because you have to delay the command if you want the function to be able
|
|
// to determine what the ability scores become after adding the bonuses to them.
|
|
DelayCommand(0.1, GiveExtraRageBonuses(nCon,StrBeforeBonuses, ConBeforeBonuses, nIncrease, 0, 0, DAMAGE_TYPE_BASE_WEAPON, OBJECT_SELF));
|
|
}
|
|
|
|
// if they have PTWF and frenzy, they should get their attacks re-checked.
|
|
if(GetHasFeat(FEAT_PERFECT_TWO_WEAPON_FIGHTING, OBJECT_SELF) )
|
|
{
|
|
PRCRemoveSpellEffects(SPELL_T_TWO_WEAPON_FIGHTING, OBJECT_SELF, OBJECT_SELF);
|
|
DelayCommand(0.3, ActionCastSpellOnSelf(SPELL_T_TWO_WEAPON_FIGHTING) );
|
|
}
|
|
}
|
|
}
|
|
|
|
void EndOfFrenzyDamage(object oSelf)
|
|
{
|
|
SetImmortal(oSelf, FALSE);
|
|
|
|
int iDam = GetLocalInt(oSelf, "PC_Damage");
|
|
effect eDam = EffectDamage(iDam, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY);
|
|
DelayCommand(1.5, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oSelf));
|
|
|
|
DeleteLocalInt(oSelf, "PC_Damage");
|
|
|
|
// remove frenzy bonuses
|
|
object oSkin = GetPCSkin(OBJECT_SELF);
|
|
SetCompositeBonusT(oSkin, "FrenzyACPenalty", 0, ITEM_PROPERTY_DECREASED_AC, IP_CONST_ACMODIFIERTYPE_DODGE); // for temporary bonuses
|
|
}
|
|
|
|
void TurnBasedDamage(object oTarget, object oCaster)
|
|
{
|
|
if (PRCGetDelayedSpellEffectsExpired(SPELL_FRENZY,oTarget,oCaster)) // 2700
|
|
{
|
|
int nLevel = GetLevelByClass(CLASS_TYPE_FRE_BERSERKER); // 210
|
|
|
|
// code for being winded
|
|
if(nLevel < 10)
|
|
{
|
|
//effect eStrPen = EffectAbilityDecrease(ABILITY_STRENGTH, 2);
|
|
//effect eDexPen = EffectAbilityDecrease(ABILITY_DEXTERITY, 2);
|
|
effect eMove = EffectMovementSpeedDecrease(50);
|
|
//effect eLink2 = EffectLinkEffects(eStrPen, eDexPen);
|
|
//eLink2 = EffectLinkEffects(eLink2, eMove);
|
|
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eMove, OBJECT_SELF, RoundsToSeconds(10));
|
|
ApplyAbilityDamage(OBJECT_SELF, ABILITY_STRENGTH, 2, DURATION_TYPE_TEMPORARY, TRUE, RoundsToSeconds(10));
|
|
ApplyAbilityDamage(OBJECT_SELF, ABILITY_DEXTERITY, 2, DURATION_TYPE_TEMPORARY, TRUE, RoundsToSeconds(10));
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if (GetIsDead(oTarget) == FALSE)
|
|
{
|
|
effect eDam = EffectDamage(2, DAMAGE_TYPE_MAGICAL);
|
|
|
|
ApplyEffectToObject (DURATION_TYPE_INSTANT,eDam,oTarget);
|
|
DelayCommand(6.0f,TurnBasedDamage(oTarget,oCaster));
|
|
|
|
int iDam = GetLocalInt(oTarget, "PC_Damage");
|
|
|
|
if (iDam)
|
|
FloatingTextStringOnCreature(GetName(oTarget)+" has "+IntToString(iDam)+" end-of-frenzy damage.",oTarget,FALSE);
|
|
}
|
|
}
|
|
|
|
void AttackNearestForDuration()
|
|
{
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget = GetNearestCreature(CREATURE_TYPE_IS_ALIVE, TRUE, OBJECT_SELF, 1, CREATURE_TYPE_PERCEPTION, PERCEPTION_SEEN, -1, -1);
|
|
|
|
// stops force attacking when frenzy is over
|
|
if (PRCGetDelayedSpellEffectsExpired(SPELL_FRENZY,oCaster,oCaster))
|
|
{
|
|
AssignCommand(oCaster, ClearAllActions(TRUE) );
|
|
return;
|
|
}
|
|
|
|
AssignCommand(oCaster, ActionAttack(oTarget, FALSE));
|
|
DelayCommand(6.0f,AttackNearestForDuration() );
|
|
}
|