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.
119 lines
4.5 KiB
Plaintext
119 lines
4.5 KiB
Plaintext
/*:://////////////////////////////////////////////
|
||
//:: Spell Name Rage
|
||
//:: Spell FileName PHS_S_Rage
|
||
//:://////////////////////////////////////////////
|
||
//:: In Game Spell desctiption
|
||
//:://////////////////////////////////////////////
|
||
Enchantment (Compulsion) [Mind-Affecting]
|
||
Level: Brd 2, Sor/Wiz 3
|
||
Components: V, S
|
||
Casting Time: 1 standard action
|
||
Range: Medium (20M)
|
||
Targets: One ally/level within 10M (30-ft)
|
||
Duration: Concentration + 1 round/level (D)
|
||
Saving Throw: None
|
||
Spell Resistance: Yes
|
||
|
||
Each affected creature gains a +2 morale bonus to Strength and Constitution,
|
||
a +1 morale bonus on Will saves, and a -2 penalty to AC. The effect is
|
||
otherwise identical with a barbarian’s rage (ie cannot be dispelled) except
|
||
that the subjects aren’t fatigued at the end of the rage.
|
||
|
||
The effects last on targets for as long as you concentrate, plus one
|
||
round/level.
|
||
//:://////////////////////////////////////////////
|
||
//:: Spell Effects Applied / Notes
|
||
//:://////////////////////////////////////////////
|
||
The rage is concentration based, and that is about all the special things
|
||
about it - it does just apply the bonuses as normal (undispellable).
|
||
//:://////////////////////////////////////////////
|
||
//:: Created By: Jasperre
|
||
//::////////////////////////////////////////////*/
|
||
|
||
#include "PHS_INC_SPELLS"
|
||
#include "PHS_INC_CONCENTR"
|
||
|
||
void main()
|
||
{
|
||
// If we are concentrating, and cast at the same spot, we set the integer
|
||
// for the hypnotic pattern up by one.
|
||
object oCaster = OBJECT_SELF;
|
||
location lTarget = GetSpellTargetLocation();
|
||
|
||
// Check the function
|
||
if(PHS_ConcentatingContinueCheck(PHS_SPELL_RAGE, lTarget, PHS_AOE_TAG_PER_RAGE, 18.0, oCaster)) return;
|
||
|
||
// Else, new spell!
|
||
|
||
// Spell Hook Check.
|
||
if(!PHS_SpellHookCheck(PHS_SPELL_RAGE)) return;
|
||
|
||
// Declare major variables
|
||
object oTarget;
|
||
int nCasterLevel = PHS_GetCasterLevel();
|
||
int nSpellSaveDC = PHS_GetSpellSaveDC();
|
||
int nMetaMagic = PHS_GetMetaMagicFeat();
|
||
int nCnt;
|
||
float fDelay, fDistance;
|
||
|
||
// Extra Duration in rounds
|
||
float fDuration = PHS_GetDuration(PHS_ROUNDS, nCasterLevel, nMetaMagic);
|
||
|
||
// We set the "Concentration" thing to 18 seconds
|
||
// This also returns the array we set people affected to, and does the new
|
||
// action.
|
||
string sArrayLocal = PHS_ConcentatingStart(PHS_SPELL_RAGE, 0, lTarget, PHS_AOE_PER_RAGE, fDuration);
|
||
int nArrayCount;
|
||
|
||
// Note on duration: We apply it permamently, however, it will definatly
|
||
// be removed by the AOE.
|
||
|
||
// Declare effects
|
||
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 2);
|
||
effect eCon = EffectAbilityIncrease(ABILITY_CONSTITUTION, 2);
|
||
effect eSave = EffectSavingThrowIncrease(SAVING_THROW_WILL, 1);
|
||
effect eAC = EffectACDecrease(2, AC_DODGE_BONUS);
|
||
effect eCessate = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
|
||
effect eVis = EffectVisualEffect(VFX_IMP_IMPROVE_ABILITY_SCORE);
|
||
|
||
// Link effects
|
||
effect eLink = EffectLinkEffects(eStr, eCon);
|
||
eLink = EffectLinkEffects(eLink, eSave);
|
||
eLink = EffectLinkEffects(eLink, eAC);
|
||
eLink = EffectLinkEffects(eLink, eCessate);
|
||
|
||
// Loop all allies in a 10M sphere, basically
|
||
oTarget = oCaster;
|
||
// 1 target/level, nearest to location within a huge radius
|
||
while(GetIsObjectValid(oTarget) && nArrayCount < nCasterLevel &&
|
||
GetDistanceBetweenLocations(lTarget, GetLocation(oTarget)) <= RADIUS_SIZE_FEET_30)
|
||
{
|
||
// Friendly check and that they do not have the effects of rage already
|
||
if((oTarget == OBJECT_SELF || GetIsFriend(oTarget) ||
|
||
GetFactionEqual(oTarget)) && !GetHasFeatEffect(FEAT_BARBARIAN_RAGE, oTarget))
|
||
{
|
||
// Get a random delay
|
||
fDelay = PHS_GetRandomDelay(0.1, 0.9);
|
||
|
||
// Add to the array
|
||
nArrayCount++;
|
||
SetLocalObject(oCaster, sArrayLocal + IntToString(nArrayCount), oTarget);
|
||
|
||
// Signal the spell cast at event
|
||
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_RAGE, FALSE);
|
||
|
||
// Remove this previous effects.
|
||
PHS_RemoveSpellEffectsFromTarget(PHS_SPELL_RAGE, oTarget);
|
||
|
||
// Play voice chat
|
||
DelayCommand(fDelay, PlayVoiceChat(VOICE_CHAT_BATTLECRY1, oTarget));
|
||
|
||
// Apply effects and VFX to target
|
||
DelayCommand(fDelay, PHS_ApplyPermanentAndVFX(oTarget, eVis, eLink));
|
||
}
|
||
// Get next target
|
||
nCnt++;
|
||
oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
|
||
}
|
||
}
|