PRC8/nwn/nwnprc/trunk/spells/x2_s1_beholdray.nss
Jaysyn904 791aef3da1 Expanded Alienist for epic progression
Expanded Alienist for epic progression.
Tweaed beholder ray to respect petrification immunity.
2025-04-28 21:22:43 -04:00

235 lines
8.7 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Beholder Ray Attacks
//:: x2_s2_beholdray
//:: Copyright (c) 2003 Bioware Corp.
//:://////////////////////////////////////////////
/*
Implementation for the new version of the
beholder rays, using projectiles instead of
rays
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: 2003-09-16
//:://////////////////////////////////////////////
#include "prc_inc_spells"
#include "x0_i0_henchman"
//#include "x0_i0_spells"
void DoBeholderPetrify(int nDuration, object oSource, object oTarget, int nSpellID);
void main()
{
int nSpell = PRCGetSpellId();
object oTarget = PRCGetSpellTargetObject();
int nSave, bSave;
int iHD = GetHitDice(OBJECT_SELF);
int iCHAb = GetAbilityModifier(ABILITY_CHARISMA, OBJECT_SELF);
int nSaveDC = 10 + (iHD / 2) + iCHAb;
float fDelay;
effect e1, eLink, eVis, eDur;
switch (nSpell)
{
case 776 :
nSave = SAVING_THROW_FORT; //BEHOLDER_RAY_DEATH
break;
case 777:
nSave = SAVING_THROW_WILL; //BEHOLDER_RAY_TK
break;
case 778 : //BEHOLDER_RAY_PETRI
nSave = SAVING_THROW_FORT;
break;
case 779: // BEHOLDER_RAY_CHARM
nSave = SAVING_THROW_WILL;
break;
case 780: //BEHOLDER_RAY_SLOW
nSave = SAVING_THROW_WILL;
break;
case 783:
nSave = SAVING_THROW_FORT; //BEHOLDER_RAY_WOUND
break;
case 784: // BEHOLDER_RAY_FEAR
nSave = SAVING_THROW_WILL;
break;
case 785:
case 786:
case 787:
}
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId(), TRUE));
fDelay = 0.0f; //old -- GetSpellEffectDelay(GetLocation(oTarget),OBJECT_SELF);
if (nSave == SAVING_THROW_WILL)
{
bSave = PRCMySavingThrow(SAVING_THROW_WILL,oTarget, nSaveDC,SAVING_THROW_TYPE_ALL,OBJECT_SELF,fDelay) > 0;
}
else if (nSave == SAVING_THROW_FORT)
{
bSave = PRCMySavingThrow(SAVING_THROW_FORT,oTarget, nSaveDC,SAVING_THROW_TYPE_ALL,OBJECT_SELF,fDelay) > 0;
}
if (!bSave)
{
switch (nSpell)
{
case 776: e1 = EffectDeath(TRUE);
eVis = EffectVisualEffect(VFX_IMP_DEATH);
eLink = EffectLinkEffects(e1,eVis);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eLink,oTarget);
break;
case 777: e1 = ExtraordinaryEffect(EffectKnockdown());
eVis = EffectVisualEffect(VFX_IMP_STUN);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,6.0f);
break;
// Petrify for one round per SaveDC
case 778:
eVis = EffectVisualEffect(VFX_IMP_POLYMORPH);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
if (!GetHasFeat(FEAT_IMMUNE_PETRIFICATION, oTarget))
{
DoBeholderPetrify(nSaveDC, OBJECT_SELF, oTarget, PRCGetSpellId());
}
else
{
// Spell failure visual at the head
effect eFail = EffectVisualEffect(VFX_FNF_SPELL_FAIL_HEA);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eFail, oTarget);
}
break;
case 779: e1 = EffectCharmed();
eVis = EffectVisualEffect(VFX_IMP_CHARM);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,24.0f);
break;
case 780: e1 = EffectSlow();
eVis = EffectVisualEffect(VFX_IMP_SLOW);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,RoundsToSeconds(6));
break;
case 783: e1 = EffectDamage(d8(2)+10);
eVis = EffectVisualEffect(VFX_COM_BLOOD_REG_RED);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,e1,oTarget);
break;
case 784:
e1 = EffectFrightened();
eVis = EffectVisualEffect(VFX_IMP_FEAR_S);
eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);
e1 = EffectLinkEffects(eDur,e1);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eVis,oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY,e1,oTarget,RoundsToSeconds(1+d4()));
break;
}
}
else
{
switch (nSpell)
{
case 776: e1 = EffectDamage(d6(3)+13);
eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
eLink = EffectLinkEffects(e1,eVis);
SPApplyEffectToObject(DURATION_TYPE_INSTANT,eLink,oTarget);
}
}
}
void DoBeholderPetrify(int nDuration, object oSource, object oTarget, int nSpellID)
{
if(!GetIsReactionTypeFriendly(oTarget) && !GetIsDead(oTarget))
{
// * exit if creature is immune to petrification
if (PRCIsImmuneToPetrification(oTarget) == TRUE)
{
return;
}
float fDifficulty = 0.0;
int bIsPC = GetIsPC(oTarget);
int bShowPopup = FALSE;
// * calculate Duration based on difficulty settings
int nGameDiff = GetGameDifficulty();
switch (nGameDiff)
{
case GAME_DIFFICULTY_VERY_EASY:
case GAME_DIFFICULTY_EASY:
case GAME_DIFFICULTY_NORMAL:
fDifficulty = RoundsToSeconds(nDuration); // One Round per hit-die or caster level
break;
case GAME_DIFFICULTY_CORE_RULES:
case GAME_DIFFICULTY_DIFFICULT:
if (!GetPlotFlag(oTarget))
{
bShowPopup = TRUE;
}
break;
}
effect ePetrify = EffectPetrify();
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eLink = EffectLinkEffects(eDur, ePetrify);
/// * The duration is permanent against NPCs but only temporary against PCs
if (bIsPC == TRUE)
{
if (bShowPopup == TRUE)
{
// * under hardcore rules or higher, this is an instant death
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
DelayCommand(2.75, PopUpDeathGUIPanel(oTarget, FALSE , TRUE, 40579));
// if in hardcore, treat the player as an NPC
bIsPC = FALSE;
}
else
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDifficulty);
}
else
{
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget);
// * Feb 11 2003 BK I don't think this is necessary anymore
//if the target was an NPC - make him uncommandable until Stone to Flesh is cast
//SetCommandable(FALSE, oTarget);
// Feb 5 2004 - Jon
// Added kick-henchman-out-of-party code from generic petrify script
if (GetAssociateType(oTarget) == ASSOCIATE_TYPE_HENCHMAN)
{
FireHenchman(GetMaster(oTarget),oTarget);
}
}
// April 2003: Clearing actions to kick them out of conversation when petrified
AssignCommand(oTarget, ClearAllActions());
}
}