PRC8/nwn/nwnprc/trunk/smp/phs_s_priswalla.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

218 lines
8.0 KiB
Plaintext
Raw Permalink Blame History

/*:://////////////////////////////////////////////
//:: Spell Name Prismatic Wall: On Enter
//:: Spell FileName PHS_S_PrisWallA
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
As it stated above.
Simplified a lot. It now doesn't stop spells or missiles (ugly!) but will
do th effects of each thing On Enter - ugly!
This is still powerful (very much so) for the level.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
// Applies the effect determined by nDiceRoll, onto oTarget with nSpellSaveDC,
// using oCaster as the caster of the spell. Used in all Prismatic spells.
// * nDiceRoll 1-7 (8 is ignored as par description).
// * Use fDelay to state a delay for the effects to be applied.
// Make sure SR checks are done before this is called.
void ApplyPrismaticEffect(int nDiceRoll, object oTarget, float fDelay, int nMetaMagic, int nSpellSaveDC, object oCaster = OBJECT_SELF);
void main()
{
// Check AOE
if(!PHS_CheckAOECreator()) return;
// Declare major variables
object oTarget = GetEnteringObject();
object oCaster = GetAreaOfEffectCreator();
int nMetaMagic = PHS_GetAOEMetaMagic();
int nSpellSaveDC = PHS_GetAOESpellSaveDC();
int nCnt;
float fDelay;
// Check if oCaster isn't oTarget
if(oCaster == oTarget) return;
// We make sure it isn't at the start.
if(GetLocalInt(oCaster, PHS_MOVING_BARRIER_START + IntToString(PHS_SPELL_PRISMATIC_WALL))) return;
// Now, prismatic effects - in order!
// PvP Check
if(!GetIsReactionTypeFriendly(oTarget, oCaster) &&
// Make sure they are not immune to spells
!PHS_TotalSpellImmunity(oTarget))
{
// Fire cast spell at event for the target
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_PRISMATIC_WALL);
// Loop possible effects
for(nCnt = 1; nCnt <= 7; nCnt++)
{
// Add 0.05 to the delay
fDelay += 0.05;
// Check spell resistance
if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
{
// Apply the new color
ApplyPrismaticEffect(d8(), oTarget, fDelay, nMetaMagic, nSpellSaveDC, oCaster);
}
}
}
}
// Applies the effect determined by nDiceRoll, onto oTarget with nSpellSaveDC,
// using oCaster as the caster of the spell. Used in all Prismatic spells.
// * nDiceRoll 1-7 (8 is ignored as par description).
// * Use fDelay to state a delay for the effects to be applied.
// Make sure SR checks are done before this is called.
void ApplyPrismaticEffect(int nDiceRoll, object oTarget, float fDelay, int nMetaMagic, int nSpellSaveDC, object oCaster = OBJECT_SELF)
{
int nRoll;
effect eVis;
switch(nDiceRoll)
{
// 1 Red 20 points fire damage (Reflex half)
case 1:
{
// Get damage via. save.
nRoll = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, 20, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_FIRE, oCaster);
// Do damage
if(nRoll > 0)
{
eVis = EffectVisualEffect(VFX_IMP_FLAME_M);
DelayCommand(fDelay, PHS_ApplyDamageVFXToObject(oTarget, eVis, nRoll, DAMAGE_TYPE_FIRE));
}
}
break;
// 2 Orange 40 points acid damage (Reflex half)
case 2:
{
// Get damage via. save.
nRoll = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, 40, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_ACID, oCaster);
// Do damage
if(nRoll > 0)
{
eVis = EffectVisualEffect(VFX_IMP_ACID_S);
DelayCommand(fDelay, PHS_ApplyDamageVFXToObject(oTarget, eVis, nRoll, DAMAGE_TYPE_ACID));
}
}
break;
// 3 Yellow 80 points electricity damage (Reflex half)
case 3:
{
// Get damage via. save.
nRoll = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, 80, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_ELECTRICITY, oCaster);
// Do damage
if(nRoll > 0)
{
eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_M);
DelayCommand(fDelay, PHS_ApplyDamageVFXToObject(oTarget, eVis, nRoll, DAMAGE_TYPE_ELECTRICAL));
}
}
break;
// 4 Green Poison (Kills; Fortitude partial, take 1d6 points of Con damage instead)
case 4:
{
// Posion immunity
if(PHS_ImmunityCheck(oTarget, IMMUNITY_TYPE_POISON, fDelay, oCaster))
{
eVis = EffectVisualEffect(VFX_IMP_POISON_S);
// Fortitude save
if(PHS_SavingThrow(SAVING_THROW_FORT, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_POISON, oCaster))
{
// Apply some con damage
nRoll = PHS_MaximizeOrEmpower(6, 1, nMetaMagic);
effect ePoison = EffectAbilityDecrease(ABILITY_CONSTITUTION, nRoll);
PHS_ApplyPermanentAndVFX(oTarget, eVis, ePoison);
}
else
{
// Death via. damage
DelayCommand(fDelay, PHS_ApplyDeathByDamageAndVFX(oTarget, eVis));
}
}
}
break;
// 5 Blue Turned to stone (Fortitude negates)
case 5:
{
// Turned to stone via. the function in PHS_INC_SPELL
// * Take caster level as 20, this is meant to be pretty harsh anyway.
PHS_SpellFortitudePetrify(oTarget, 20, nSpellSaveDC);
}
break;
// 6 Indigo Insane, as insanity spell (Will negates)
case 6:
{
// Will negates
if(!PHS_SavingThrow(SAVING_THROW_WILL, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_MIND_SPELLS, oCaster, fDelay))
{
// Insanity, eh? Supernatural, permament, Confusion
// Declare effects - Confusion
eVis = EffectVisualEffect(PHS_VFX_IMP_INSANITY);
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
effect eCessate = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eConfusion = EffectConfused();
effect eLink = EffectLinkEffects(eConfusion, eDur);
eLink = EffectLinkEffects(eLink, eCessate);
// Make it a supernatural effect
// - Cannot be dispelled
// - Cannot be removed VIA sleep
eLink = SupernaturalEffect(eLink);
// Apply the effect
PHS_ApplyPermanentAndVFX(oTarget, eVis, eLink);
}
}
break;
// 7 Violet Sent to another plane (Will negates)
case 7:
{
// Send to another plane, eh?
// The location will be set as the tagged waypoint "PHS_PRISMATIC_PLANE"
object oWP = GetWaypointByTag("PHS_PRISMATIC_PLANE");
if(GetIsObjectValid(oWP))
{
location lTarget = GetLocation(oWP);
// We must force them to move. We remove all movement stoppers and
// thusly move them.
eVis = EffectVisualEffect(VFX_IMP_UNSUMMON);
// Move them
if(fDelay > 0.1)
{
// Use special function for the "teleporting"
// Some delay
DelayCommand(fDelay - 0.1, AssignCommand(oTarget, PHS_ForceMovementToLocation(lTarget, VFX_IMP_UNSUMMON, VFX_FNF_SUMMON_MONSTER_3)));
}
else
{
// No delay
AssignCommand(oTarget, PHS_ForceMovementToLocation(lTarget, VFX_IMP_UNSUMMON, VFX_FNF_SUMMON_MONSTER_3));
}
}
}
break;
// 8 Struck by two colors; roll twice more, ignoring any <20>8<EFBFBD> results.
case 8:
{
return;
}
break;
}
}