Updated PRC8 Tester module. Tweaked Beholder Ray for Petrification Immunity. Updated Saint for Petrification Immunity. Fixed Master Alchemist not getting marker feat. Started working on Materials system. Updated release archive.
224 lines
8.6 KiB
Plaintext
224 lines
8.6 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);
|
|
DoBeholderPetrify(nSaveDC,OBJECT_SELF,oTarget,PRCGetSpellId());
|
|
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());
|
|
}
|
|
} |