183 lines
5.9 KiB
Plaintext
183 lines
5.9 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Evards Black Tentacles: On Enter
|
|
//:: NW_S0_EvardsA
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Upon entering the mass of rubbery tentacles the
|
|
target is struck by 1d4 +1/lvl tentacles. Each
|
|
makes a grapple check. If it succeeds then
|
|
it does 1d6+4damage and the target must make
|
|
a Fortitude Save versus paralysis or be paralyzed
|
|
for 1 round.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Preston Watamaniuk
|
|
//:: Created On: Nov 23, 2001
|
|
//:://////////////////////////////////////////////
|
|
//:: GZ: Removed SR, its not there by the book
|
|
|
|
#include "ke_spell_factor"
|
|
|
|
#include "X0_I0_SPELLS"
|
|
#include "x2_inc_spellhook"
|
|
|
|
void main()
|
|
{
|
|
|
|
object oTarget = GetEnteringObject();
|
|
effect eParal = EffectParalyze();
|
|
effect eDur = EffectVisualEffect(VFX_DUR_PARALYZED);
|
|
effect eLink = EffectLinkEffects(eDur, eParal);
|
|
effect eDam;
|
|
|
|
int nMetaMagic = GetMetaMagicFeat();
|
|
int nDamage = 0;
|
|
int nHits;
|
|
float fDelay;
|
|
int nNumberTargets = 0;
|
|
int nMinimumTargets = 2;
|
|
int nDieDam;
|
|
int nTargetSize;
|
|
int nTentacleGrappleCheck;
|
|
int nOpposedGrappleCheck;
|
|
int nOppossedGrappleCheckModifiers;
|
|
int nTentaclesPerTarget;
|
|
int nCasterLevel = GetCasterLevel(OBJECT_SELF);
|
|
|
|
if ( GetCreatureSize(oTarget) < CREATURE_SIZE_MEDIUM )
|
|
{
|
|
// Some visual feedback that the spell doesn't affect creatures of this type.
|
|
effect eFail = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
fDelay = GetRandomDelay(0.75, 1.5);
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eFail, oTarget,fDelay);
|
|
return;
|
|
}
|
|
|
|
nCasterLevel = nCasterLevel/2;
|
|
|
|
if ( nCasterLevel > 40 )
|
|
{
|
|
nCasterLevel = 40;
|
|
}
|
|
|
|
|
|
nTentaclesPerTarget = 1;
|
|
|
|
// nTentaclesPerTarget = d4();
|
|
|
|
if (nMetaMagic == METAMAGIC_MAXIMIZE)
|
|
{
|
|
nTentaclesPerTarget = 1;
|
|
}
|
|
nTentaclesPerTarget = nTentaclesPerTarget + nCasterLevel;
|
|
if (nMetaMagic == METAMAGIC_EMPOWER)
|
|
{
|
|
nTentaclesPerTarget = nTentaclesPerTarget; // + (nTentaclesPerTarget/2); //Number of variable tentacles is +50%
|
|
}
|
|
|
|
oTarget = GetFirstInPersistentObject();
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
if ( GetCreatureSize(oTarget) >= CREATURE_SIZE_MEDIUM )
|
|
{
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
|
{
|
|
nNumberTargets++;
|
|
}
|
|
}
|
|
oTarget = GetNextInPersistentObject();
|
|
}
|
|
|
|
oTarget = GetEnteringObject();
|
|
if ( nNumberTargets >= 0 )
|
|
{
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_EVARDS_BLACK_TENTACLES));
|
|
|
|
// Distribute the tentacle between all valid targets.
|
|
if ( nNumberTargets < nMinimumTargets )
|
|
{
|
|
// If there is only one target in the area, then only a portion of the tentacles should be able to reach them.
|
|
nTentaclesPerTarget = nTentaclesPerTarget/nMinimumTargets;
|
|
}
|
|
else
|
|
{
|
|
nTentaclesPerTarget = nTentaclesPerTarget/nNumberTargets;
|
|
}
|
|
|
|
nOppossedGrappleCheckModifiers = GetBaseAttackBonus(oTarget) + GetAbilityModifier(ABILITY_STRENGTH,oTarget);
|
|
nTargetSize = GetCreatureSize(oTarget);
|
|
if (nTargetSize == CREATURE_SIZE_LARGE )
|
|
{
|
|
nOppossedGrappleCheckModifiers = nOppossedGrappleCheckModifiers + 4;
|
|
}
|
|
else if ( nTargetSize = CREATURE_SIZE_HUGE )
|
|
{
|
|
nOppossedGrappleCheckModifiers = nOppossedGrappleCheckModifiers + 8;
|
|
}
|
|
|
|
for (nHits = nTentaclesPerTarget; nHits > 0; nHits--)
|
|
{
|
|
// Grapple Check.
|
|
nTentacleGrappleCheck = d20() + nCasterLevel + 8; // Str(4) + Large Tentacle(4)
|
|
nOpposedGrappleCheck = d20() + nOppossedGrappleCheckModifiers;
|
|
|
|
if(nTentacleGrappleCheck >= nOpposedGrappleCheck)
|
|
{
|
|
|
|
nDieDam = d8(nCasterLevel)+40;
|
|
|
|
// nDieDam = d20() + nCasterLevel;
|
|
|
|
//Enter Metamagic conditions
|
|
if (nMetaMagic == METAMAGIC_MAXIMIZE)
|
|
{
|
|
nDieDam = (8*(nCasterLevel))+40;
|
|
}
|
|
|
|
if (nMetaMagic == METAMAGIC_EMPOWER)
|
|
{
|
|
nDieDam = nDieDam + (nDieDam/2); //Damage/Healing is +50%
|
|
}
|
|
nDamage = nDamage + nDieDam;
|
|
|
|
|
|
//starting the grand circus of importing and converting back and forth //
|
|
|
|
float fDamage = IntToFloat(nDamage);
|
|
|
|
// multiplaying damage with fFactor //
|
|
|
|
float fFactor = CalculateFactor();
|
|
|
|
fDamage = fDamage * fFactor;
|
|
|
|
// converting the float damage back to INT damage so we can use it again //
|
|
|
|
int nDamage2 = FloatToInt(fDamage);
|
|
|
|
// Done and remember to change nDamage with nDamage2 below :) //
|
|
|
|
|
|
|
|
|
|
fDelay = GetRandomDelay(1.0, 2.2);
|
|
eDam = EffectDamage(nDamage2, DAMAGE_TYPE_BLUDGEONING, DAMAGE_POWER_PLUS_TWENTY);
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
|
}
|
|
}
|
|
|
|
if(nDamage > 0)
|
|
{
|
|
if(!MySavingThrow(SAVING_THROW_FORT, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_NONE, OBJECT_SELF, fDelay))
|
|
{
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(1)));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|