//:://///////////////////////////////////////////// //:: 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()); } }